2013-03-03 19 views
0

我正在使用一個應該從外部bash腳本接收信號的程序(使用:kill -USR1 pid),並更新QLabel。使用Python/PyQt4接收信號的問題

在我的程序中,標籤只有在鼠標懸停在'標籤按鈕'後纔會更新。我在下面創建了一個簡化的示例,因爲我的程序太多,無法查看。在這個例子中,信號處理函數只在關閉窗口時執行(如果我將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

我看到了一些問題......

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

感謝您的答覆。 信號捕獲器是initUI函數的內部,我認爲它允許它不需要自我參數,也許不是最佳實踐,但我曾嘗試過這兩種方法。 將信號連接放在主函數中似乎是一件好事,但這並沒有幫助,並且您提供的示例代碼爲我生成了相同的結果。 您是否運行了您提供的代碼?並且在發送USR1信號給過程時實際上有標籤變化? – jfnichols 2013-03-03 16:05:59