我(试图)创建一个驻留在系统托盘中的小程序,并检查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()
当我右键单击托盘图标并单击“设置”时,它会闪烁一个白色框(我的对话框),然后立即退出并打印“完成!”。
为什么会这样,我该如何解决?
答案 0 :(得分:3)
打开设置对话框后,您的代码会立即退出,这有两个原因。
第一个问题是使用open_settings
方法:
def open_settings(self):
settings = SettingsDialog()
settings.show()
这会创建一个对话框并使其可见。 show()
在显示窗口后立即返回;它不等待窗口关闭。 settings
变量超出了方法末尾的范围,这会导致SettingsDialog
的引用计数降至零,从而符合垃圾回收的条件。当Python删除SettingsDialog
对象时,PyQt将删除底层的C ++对象,这就是导致对话框再次关闭的原因。
我建议您使用设置对话框子类QDialog
而不是QWidget
(毕竟这是一个对话框)。您可以拨打settings.show()
,而不是拨打settings.exec_()
。 settings.exec_()
等待对话框在返回之前关闭。它还会返回QDialog.Accepted
或QDialog.Rejected
,具体取决于用户是单击“确定”还是“取消”。我还建议您在self.show()
构造函数中删除对SettingsDialog
的调用。
第二个问题是您的QApplication
设置为在最后一个窗口关闭时退出。这是默认行为,这是很多应用程序需要的,但不是你的。即使您的对话框保持打开状态并且您可以关闭它,您也不希望在关闭设置对话框后立即退出应用程序。请致电app.setQuitOnLastWindowClosed(False)
来解决此问题。