Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/306.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 为什么我的PyQt4程序无缘无故退出主循环?_Python_Pyqt4 - Fatal编程技术网

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

Python 为什么我的PyQt4程序无缘无故退出主循环?,python,pyqt4,Python,Pyqt4,我正在(尝试)制作一个驻留在系统托盘中的小程序,并检查Twitch频道列表,看看它们是否偶尔在线 我目前正在做GUI(在PyQt4中),但它会无缘无故退出 以下是我目前的代码: import sys from PyQt4 import QtGui from PyQt4 import QtCore class TwitchWatchTray(QtGui.QSystemTrayIcon): def __init__(self, icon, parent=None): sup

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

我目前正在做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\u设置
方法:

    def open_settings(self):
        settings = SettingsDialog()
        settings.show()
这将创建一个对话框并使其可见<代码>显示()在显示窗口后立即返回;它不会等待窗口关闭。
settings
变量在方法结束时超出范围,这会导致
SettingsDialog
的引用计数降至零,从而符合垃圾收集的条件。当Python删除<代码> StutsStult< /Cord>对象时,pyqt将删除基础C++对象,这就是导致对话框再次关闭的原因。 我建议您使用设置对话框子类
QDialog
,而不是
QWidget
(毕竟它是一个对话框)。然后可以调用
settings.exec()
,而不是调用
settings.show()
settings.exec_()
会等待对话框关闭后再返回。它还返回
QDialog.Accepted
QDialog.Rejected
,具体取决于用户单击的是确定还是取消。我还建议不要在
设置对话框中调用
self.show()


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

谢谢!这是一个非常好和深入的解释,它起作用了@用户1438098:很高兴能帮上忙。