我正在(尝试)制作一个小程序,驻留在系统托盘中,检查抽搐频道的列表,看看它们是否偶尔在线。在
我目前正在做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
方法:这将创建一个对话框并使其可见。
show()
显示窗口后立即返回;它不等待窗口关闭。在方法末尾,settings
变量超出了范围,这会导致SettingsDialog
的引用计数降为零,因此有资格进行垃圾回收。当Python删除^ {< CD4}}对象时,pyqt将删除基础C++对象,这就是导致对话框再次关闭的原因。在我建议您的设置对话框子类
QDialog
,而不是QWidget
(毕竟它是一个对话框)。您可以调用settings.show()
,而不是调用settings.exec_()
。settings.exec_()
在返回之前,会等待对话框关闭。它还返回QDialog.Accepted
或QDialog.Rejected
,具体取决于用户单击“确定”还是“取消”。我还建议在您的SettingsDialog
构造函数中去掉对self.show()
的调用。在第二个问题是您的
QApplication
设置为在最后一个窗口关闭时退出。这是默认行为,这是许多应用程序需要的,但不是您的。即使您的对话框保持打开状态并且可以关闭它,您也不希望应用程序在关闭设置对话框后立即退出。请致电app.setQuitOnLastWindowClosed(False)
来解决此问题。在相关问题 更多 >
编程相关推荐