我想使用PyQt5和QtDesigner开始一个新项目。首先,我只是复制了PyQt4中之前项目的代码,并将其调整为PyQt5中的更改。因此,启动Main Window
的代码和更新应用程序的Timer
如下所示:
# ====Python=============================================================
# SticksNStones
# =======================================================================
import ...
FPS = 45
dt = 1000.0 / FPS
class SNSMainWindow(WindowBaseClass, Ui_Window):
def __init__(self, parent=None):
WindowBaseClass.__init__(self, parent)
Ui_Window.__init__(self)
self.setupUi(self)
self.paused = False
self.timer = None
self.init()
def init(self):
# Setup Display
self.display.setup()
# Setup timer
self.timer = QtCore.QTimer(self)
self.timer.timeout.connect(self.update_loop)
self.timer.start(self.dt)
def update_loop(self):
if not self.paused:
self.display.update(dt)
else:
pass
# ==================================
# Start Application
# ==================================
_dialog = None
def start_sns():
global _dialog
# Start App and frame
app = QtWidgets.QApplication(sys.argv)
_dialog = SNSMainWindow()
_dialog.show()
# Exit if window is closed
sys.exit(app.exec_())
if __name__ == "__main__":
start_sns()
但是一旦我启动应用程序,它会在初始化后关闭。调试显示计时器处于活动状态,但永远不会调用update_loop
。
我复制的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'
已经足够了。
答案 0 :(得分:0)
我尝试更改某些行,首先尝试将app
定义更改为
app = QtGui.QApplication(sys.argv)
然后删除Ui_Window
init并将其设置为self.ui = Ui_Window()
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()