我正在开发一个应该从外部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()
答案 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()