gpt4 book ai didi

python - 为什么我的 PyQt4 程序无缘无故地退出主循环?

转载 作者:行者123 更新时间:2023-11-30 23:33:13 28 4
gpt4 key购买 nike

我正在(尝试)制作一个驻留在系统托盘中的小程序,并检查 Twitch channel 列表以查看它们是否每隔一段时间就在线。

我目前正在做 GUI(在 PyQt4 中),但它无缘无故退出。

这是我到目前为止的代码:

import sys
from PyQt4 import QtGui
from PyQt4 import QtCore

class TwitchWatchTray(QtGui.QSystemTrayIcon):
def __init__(self, icon, parent=None):
super(TwitchWatchTray, self).__init__(icon, parent)

self.menu = QtGui.QMenu(parent)
settings_action = self.menu.addAction("Settings")
settings_action.triggered.connect(self.open_settings)

self.menu.addSeparator()

exit_action = self.menu.addAction("Exit")
exit_action.triggered.connect(QtCore.QCoreApplication.instance().quit)

self.setContextMenu(self.menu)
self.show()

def open_settings(self):
settings = SettingsDialog()
settings.show()

class SettingsDialog(QtGui.QWidget):
def __init__(self):
super(SettingsDialog, self).__init__()

self.resize(300, 300)
self.setWindowTitle('TwitchWatch Settings')
vbox = QtGui.QHBoxLayout()

self.channels_list = QtGui.QListView(self)
vbox.addWidget(self.channels_list)

self.add_box = QtGui.QLineEdit(self)
vbox.addWidget(self.add_box)

self.setLayout(vbox)
self.show()

def main():

app = QtGui.QApplication(sys.argv)
widget = QtGui.QWidget()
tw = TwitchWatchTray(QtGui.QIcon("icon.png"), widget)

app.exec_()
print("Done!")

if __name__ == '__main__':
main()

当我右键单击托盘图标并单击“设置”时,它会闪烁一个白色框(我的对话框),然后立即退出并打印“完成!”。

这是为什么?如何解决?

最佳答案

打开设置对话框后代码立即退出有两个原因。

第一个问题与您的 open_settings 方法有关:

    def open_settings(self):
settings = SettingsDialog()
settings.show()

这将创建一个对话框并使其可见。 show() 显示窗口后立即返回;它不会等待窗口关闭。 settings 变量在方法结束时超出范围,这会导致 SettingsDialog 的引用计数降至零,从而符合垃圾回收的条件。当Python删除SettingsDialog对象时,PyQt将删除底层C++对象,这就是导致对话框再次关闭的原因。

我建议您使用设置对话框子类QDialog而不是QWidget(毕竟它是一个对话框)。您可以调用 settings.exec_(),而不是调用 settings.show()settings.exec_() 确实在返回之前等待对话框关闭。它还返回QDialog.AcceptedQDialog.Rejected,具体取决于用户单击“确定”还是“取消”。我还建议在 SettingsDialog 构造函数中取消对 self.show() 的调用。

第二个问题是您的QApplication设置为在最后一个窗口关闭时退出。这是默认行为,这是许多应用程序所需要的,但不是您的。即使您的对话框保持打开状态并且您可以将其关闭,您也不希望应用程序在关闭设置对话框后立即退出。调用 app.setQuitOnLastWindowClosed(False) 来修复此问题。

关于python - 为什么我的 PyQt4 程序无缘无故地退出主循环?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19012892/

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