0

我正在工作的程序应该从外部 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()
4

1 回答 1

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()
于 2013-03-03T02:25:05.740 回答