在Python / PyQt4中发出接收信号

时间:2013-03-03 01:12:01

标签: python signals pyqt4

我正在开发一个应该从外部bash脚本接收信号的程序(使用:kill -USR1 pid ),然后更新QLabel。

在我的程序中,只有在鼠标悬停在“标签按钮”后才会更新标签。我在下面创建了一个简化的示例,因为我的程序太多无法查看。在该示例中,信号处理函数仅在关闭窗口时执行(如果我将USR1信号发送到其pid)。

以下是示例:

#!/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()

1 个答案:

答案 0 :(得分:0)

我看到一些问题......

1)signalCatcher函数的缩进看起来很奇怪,以及紧随其后的信号连接。您是否尝试删除额外的缩进(即将它们与其他函数定义保持一致)?

2)您遗漏了self作为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()