[solved] PySide/PyQT4: Catching SIGUSR1 to trigger a Signal
-
Hi there,
I'm really stuck with this one. I read http://doc.qt.nokia.com/4.7-snapshot/unix-signals.html and various Python socket examples and so I came up with this test case, but it just doesn't work. There's a simple window and upon SIGUSR, I want its title to change so I made a socketpair, gave one end to a QSocketNotifier and used the other end to write something to it upon SIGUSR1:
@
#!/usr/bin/env python-- coding: utf-8 --
import sys
import signal
from PySide import QtCore, QtGuiA Window which should have its title changed upon SIGUSR1
class GUI(QtGui.QMainWindow):
def init(self, rsock, parent=None):
QtGui.QMainWindow.init(self, parent)
self.setWindowTitle("Pending...")
self.cw = QtGui.QWidget(self)
self.setCentralWidget(self.cw)
# setup notifier using one of the sockets
notifier = QtCore.QSocketNotifier(rsock, QtCore.QSocketNotifier.Read)
self.connect(notifier, QtCore.SIGNAL("activated(int)"), self.test)
print("GUI is set up")def test(self): print("OK!") self.setWindowTitle("OK!")
create socket pair
import socket
rsock, wsock = socket.socketpair(socket.AF_UNIX, socket.SOCK_STREAM)handler for SIGUSR1
def sigusr1_handler(signum, stack):
print 'Received Signal:', signum
wsock.send("go go go")
#~ print "sent go"
#~ print(rsock.recv(10))
#~ print "end of recv"
signal.signal(signal.SIGUSR1, sigusr1_handler)handler for SIGINT
def sigint_handler(signum, stack):
sys.exit(0)
signal.signal(signal.SIGINT, sigint_handler)create Qt GUI
app = QtGui.QApplication(sys.argv)
timer = QtCore.QTimer()
timer.start(500)
timer.timeout.connect(lambda: None)
win = GUI(rsock)
win.show()run Qt main loop
r = app.exec_()
sys.exit(r)What happens:
In one terminal, running the test case, the title never changes
shapeshifter@Tachychineta> python2 sigusr_to_qt.py
GUI is set up
Received Signal: 10
Received Signal: 10
Received Signal: 10
The other terminal, sending SIGUSR1
shapeshifter@Tachychineta> ps -A | grep python
3035 pts/1 00:00:00 python2
shapeshifter@Tachychineta> kill -s USR1 3035
shapeshifter@Tachychineta> kill -s USR1 3035
shapeshifter@Tachychineta> kill -s USR1 3035
shapeshifter@Tachychineta> kill -s USR1 3035
@
I tried everything and I'm not getting anywhere. Any help, please?
Thank you.[EDIT: code formatting, please use @-tags, not "code", Volker]
-
try keep a reference of "notifier" created on line 16.
This is necessary because the QSocketNotifier will die in the end of the class constructor.
Yes, I did the test and works if you keep the notifier live
-
Thanks a lot, it works!