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

2024-06-16 09:46:27 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在(尝试)制作一个小程序,驻留在系统托盘中,检查抽搐频道的列表,看看它们是否偶尔在线。在

我目前正在做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()

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

为什么会这样,我该怎么解决?在


Tags: importselfsettingsinitdefshowactionparent
1条回答
网友
1楼 · 发布于 2024-06-16 09:46:27

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

第一个问题是您的open_settings方法:

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

这将创建一个对话框并使其可见。show()显示窗口后立即返回;它不等待窗口关闭。在方法末尾,settings变量超出了范围,这会导致SettingsDialog的引用计数降为零,因此有资格进行垃圾回收。当Python删除^ {< CD4}}对象时,pyqt将删除基础C++对象,这就是导致对话框再次关闭的原因。在

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

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

相关问题 更多 >