0

外部の bash スクリプトからシグナルを受信し ( kill -USR1 pidを使用)、QLabel を更新するプログラムを作成しています。

私のプログラムでは、「ラベル ボタン」にマウスオーバーした後にのみラベルが更新されます。私のプログラムは多すぎて調べることができないため、以下に簡単な例を作成しました。この例では、シグナル ハンドラー関数はウィンドウを閉じるときにのみ実行されます (その pid に USR1 シグナルを送信した場合)。

次に例を示します。

#!/usr/bin/env python
import os
import sys
import signal

from PyQt4.QtGui import *
from PyQt4.QtCore import *

class Base(QWidget):
    def __init__(self):
        super(Base, self).__init__()
        self.initUI()

    def initUI(self):

        pid = os.getpid()
        self.main_label = QLabel("     " + str(pid) + "    ")

        vbox = QVBoxLayout()
        vbox.addWidget(self.main_label)

        self.setLayout(vbox)
        self.show()

        def signalCatcher(signum, stack):
            print "signaled!"
            self.main_label.setText("signaled!")

        signal.signal(signal.SIGUSR1, signalCatcher)

def main():
    app = QApplication(sys.argv)
    base = Base()
    sys.exit(app.exec_())

if __name__ == "__main__":
    main()
4

1 に答える 1

0

いくつかの問題が見られます...

1)signalCatcher関数のインデントとその直後の信号接続が奇妙に見えます。余分なインデントを削除しようとしましたか (つまり、他の関数定義と一致させましたか)?

self2)定義の最初のパラメーターとして欠落していますsignalCatcher

3) シグナル接続の構文が間違っていると思います。クラス自体ではなく、main() 定義にシグナル接続を配置した方が運が良かったです。の代わりに、行の直後にsignal.signal(signal.SIGUSR1, signalCatcher)置いてみてくださいsignal.signal(signal.SIGUSR1, base.signalCatcher)base = Base()

したがって、最終的なコードは次のようになります。

#!/usr/bin/env python
import os
import sys
import signal

from PyQt4.QtGui import *
from PyQt4.QtCore import *

class Base(QWidget):
    def __init__(self):
        super(Base, self).__init__()
        self.initUI()

    def initUI(self):

        pid = os.getpid()
        self.main_label = QLabel("     " + str(pid) + "    ")

        vbox = QVBoxLayout()
        vbox.addWidget(self.main_label)

        self.setLayout(vbox)
        self.show()

    def signalCatcher(self,signum,stack):
        print "signaled!"
        self.main_label.setText("signaled!")

def main():
    app = QApplication(sys.argv)
    base = Base()
    signal.signal(signal.SIGUSR1, base.signalCatcher)
    sys.exit(app.exec_())

if __name__ == "__main__":
    main()
于 2013-03-03T02:25:05.740 に答える