Python 主窗口在初始化后关闭

Python 主窗口在初始化后关闭,python,qt,pyqt5,qt-designer,qapplication,Python,Qt,Pyqt5,Qt Designer,Qapplication,我想使用PyQt5和QtDesigner启动一个新项目。首先,我只是复制了PyQt4中以前项目中的代码,并根据PyQt5中的更改对其进行了调整。因此,启动主窗口的代码和更新应用程序的计时器如下所示: #==Python============================================================= #粘石 # ======================================================================= 导

我想使用PyQt5和QtDesigner启动一个新项目。首先,我只是复制了PyQt4中以前项目中的代码,并根据PyQt5中的更改对其进行了调整。因此,启动
主窗口的代码和更新应用程序的
计时器如下所示:

#==Python=============================================================
#粘石
# =======================================================================
导入。。。
FPS=45
dt=1000.0/FPS
类SNSMainWindow(WindowBaseClass,Ui\u窗口):
def uuu init uuu(self,parent=None):
WindowBaseClass.\uuuu init\uuuuu(自,父)
用户界面窗口。初始化(自)
self.setupUi(self)
self.paused=False
self.timer=无
self.init()
def初始化(自):
#设置显示
self.display.setup()
#设置计时器
self.timer=QtCore.QTimer(self)
self.timer.timeout.connect(self.update\u循环)
self.timer.start(self.dt)
def更新_循环(自):
如果没有自行暂停:
self.display.update(dt)
其他:
通过
# ==================================
#启动应用程序
# ==================================
_对话框=无
def start_sns():
全局对话
#启动应用程序和框架
app=qtwidts.QApplication(sys.argv)
_dialog=SNSMainWindow()
_dialog.show()
#窗口关闭时退出
sys.exit(app.exec_())
如果名称=“\uuuuu main\uuuuuuuu”:
启动(sns)
但一旦启动应用程序,它就会在初始化后关闭。调试表明计时器处于活动状态,但从未调用
update\u循环

我从中复制的PyQt4代码工作得很好,我只是无法理解为什么这不起作用,因为我在网上找到的所有示例都有相同的代码

问题是:为什么应用程序在启动时会自动关闭

更新 问题不在于计时器,而在于自定义.ui的使用。如果我用

class SNSMainWindow(QtWidgets.QFrame):
    def __init__(self, parent=None): 
        QtWidgets.QFrame.__init__(self, parent) 
        ...
一扇窗户打开了,它一直开着,直到我把它关上。但是一根光秃秃的骨头

ui_path = os.path.dirname(os.path.abspath(__file__)) + "/ui/sns_main.ui"
Ui_Window, WindowBaseClass = uic.loadUiType(ui_path)

class SNSMainWindow(WindowBaseClass, Ui_Window):
    def __init__(self, parent=None):
        WindowBaseClass.__init__(self, parent)
        Ui_Window.__init__(self)
        self.setupUi(self)

# ==================================    

if __name__ == "__main__":
    # Start App and frame
    app = QtWidgets.QApplication(sys.argv)
    _dialog = SNSMainWindow()
    _dialog.show()

    # Exit if window is closed
    sys.exit(app.exec_())
在显示后几毫秒内消失。同样,在PyQt4中使用自定义小部件也保持打开状态。我添加了
uic.load
部分,它运行得很好。转换为PyQt5时是否遗漏了什么

解决方案 我在自定义显示类中找到了问题的解决方案。如果出现
paintEvent
,显示屏将尝试获取(尚未定义的)属性。但窗口并没有引发属性未定义的异常,而是关闭了

在初始化小部件时定义属性解决了这个问题。 这让我一直想知道,既然小部件显然试图调用一些未定义的属性,为什么在这种情况下不会引发异常。简单的

AttributeError: 'NoneType' object has no attribute 'xxx'

已经足够了。

我会尝试更改一些行,首先尝试将
app
定义更改为

app = QtGui.QApplication(sys.argv)
然后删除
Ui\u窗口
init并将其设置为
self.Ui=Ui\u窗口()


我猜应该是问题中的
app.exec\(
Typo)。这不会改变程序的行为。@Domino。
self.dt的值是多少?另外:什么是
self.display
,它的
setup()
方法做什么?(PS:更新中的代码不起作用的原因是计时器需要运行事件循环)。计时器示例不起作用,因为它需要运行
QApplication
。所以把它夹在
app=QApplication(sys.argv)
app.exec(
)之间,你会发现你的计时器会非常高兴。另一个翻译错误。不过,计时器似乎不是问题所在。即使没有设置计时器,我也希望窗口保持打开状态。
QApplication
自PyQt5起在
qtwidts
模块中找到。由于我是通过QtDesigner创建UI的,所以您的建议将不起作用,因为UI\u窗口是通过
uic
导入的。简而言之,您的建议不起作用,因为
Ui\u窗口
已经是一个实例。@Domino,首先,即使您使用uic导入
Ui\u窗口
,它也不会是一个实例。其次,在子类化时不能使用对象的实例,因此,从@user3544092获取它,并将代码更改为他建议的。如果您对uic的工作方式有很大的疑问,请参考qt示例,例如,在这里,他们展示了使用ui和uicOk的正确方法,我认为这是错误的。这些建议确实有效,我不得不调整访问我的自定义框架。不过,这些更改不会影响代码的行为。
class SNSMainWindow(WindowBaseClass):
    def __init__(self, parent=None):
        WindowBaseClass.__init__(self, parent)
        self.ui = Ui_Window()
        self.ui.setupUi(self)

        self.paused = False
        self.timer = None

        self.init()