gpt4 book ai didi

python - MainWindow 初始化后关闭

转载 作者:行者123 更新时间:2023-11-28 19:12:16 27 4
gpt4 key购买 nike

我想使用 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'

就够了。

最佳答案

我会尝试更改一些行,首先尝试将 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()

关于python - MainWindow 初始化后关闭,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38561760/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com