1

システムトレイに常駐し、Twitchチャンネルのリストをチェックして、それらが時々オンラインかどうかを確認する小さなプログラムを作成しようとしています.

私は現在(PyQt4で)GUIを行っていますが、理由もなく終了しています。

これまでの私のコードは次のとおりです。

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()

トレイ アイコンを右クリックして [設定] をクリックすると、白いボックス (私のダイアログ) が点滅し、すぐに終了して [完了!] が表示されます。

これはなぜですか、どうすれば修正できますか?

4

1 に答える 1

3

設定ダイアログを開いた直後にコードが終了する理由は 2 つあります。

最初の問題はあなたのopen_settings方法にあります:

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

これにより、ダイアログが作成され、表示されます。 show()ウィンドウを表示した直後に戻ります。ウィンドウが閉じられるのを待ちません。変数はメソッドのsettings最後でスコープ外になり、これにより参照カウントがSettingsDialogゼロになり、ガベージ コレクションの対象になります。Python がSettingsDialogオブジェクトを削除すると、PyQt は基になる C++ オブジェクトを削除します。これにより、ダイアログが再び閉じられます。

設定ダイアログをサブクラスにすることをお勧めしますQDialogQWidget結局のところ、ダイアログです)。を呼び出す代わりに、 を呼び出すsettings.show()ことができますsettings.exec_()settings.exec_() ダイアログが閉じられるのを待ってから戻ります。また、ユーザーが [OK] または [キャンセル] をクリックしたかどうかに応じて、QDialog.Acceptedまたはを返します。また、コンストラクターQDialog.Rejectedでの呼び出しを取り除くことをお勧めself.show()します。SettingsDialog

2 番目の問題はQApplication、最後のウィンドウが閉じられたときに終了するように設定されていることです。これはデフォルトの動作であり、多くのアプリケーションが必要とするものですが、あなたのものではありません。ダイアログを開いたまま閉じることができたとしても、設定ダイアログを閉じた直後にアプリケーションを終了させたくありません。app.setQuitOnLastWindowClosed(False)これを修正するには電話してください。

于 2013-09-25T19:39:45.023 に答える