gpt4 book ai didi

python - 在标准 python 线程中发出信号

转载 作者:太空狗 更新时间:2023-10-29 22:30:51 25 4
gpt4 key购买 nike

我有一个线程应用程序,其中有一个网络线程。 UI 部分将一个回调 传递给该线程。该线程是一个普通 python 线程 - 它是NO QThread

是否可以在此线程中发出 PyQT Slot?

最佳答案

不,不可能像这样从 python 线程发出 PyQt 信号。

然而,一个可能的解决方案是使用一个额外的对象共享两个线程,进行必要的操作以最终发出线程安全的PyQt 信号。

这里是一个“SafeConnector”类的实现,使用了一对连接的套接字和一个 Queue 在两个线程之间交换数据,并使用 QSocketNotifier 返回 Qt 的循环。 QObject 用于使发出适当的 Qt 信号成为可能:

from PyQt4 import Qt, QtCore, QtGui
import threading
import socket
import Queue
import time

# Object of this class has to be shared between
# the two threads (Python and Qt one).
# Qt thread calls 'connect',
# Python thread calls 'emit'.
# The slot corresponding to the emitted signal
# will be called in Qt's thread.
class SafeConnector:
def __init__(self):
self._rsock, self._wsock = socket.socketpair()
self._queue = Queue.Queue()
self._qt_object = QtCore.QObject()
self._notifier = QtCore.QSocketNotifier(self._rsock.fileno(),
QtCore.QSocketNotifier.Read)
self._notifier.activated.connect(self._recv)

def connect(self, signal, receiver):
QtCore.QObject.connect(self._qt_object, signal, receiver)

# should be called by Python thread
def emit(self, signal, args):
self._queue.put((signal, args))
self._wsock.send('!')

# happens in Qt's main thread
def _recv(self):
self._rsock.recv(1)
signal, args = self._queue.get()
self._qt_object.emit(signal, args)

class PythonThread(threading.Thread):
def __init__(self, connector, *args, **kwargs):
threading.Thread.__init__(self, *args, **kwargs)
self.connector = connector
self.daemon = True

def emit_signal(self):
self.connector.emit(QtCore.SIGNAL("test"), str(time.time()))

def run(self):
while True:
time.sleep(1)
self.emit_signal()

if __name__ == '__main__':
app = QtGui.QApplication([])
mainwin = QtGui.QMainWindow()
label = QtGui.QLabel(mainwin)
mainwin.setCentralWidget(label)

connector = SafeConnector()
python_thread = PythonThread(connector)
connector.connect(QtCore.SIGNAL("test"), label.setText)
python_thread.start()

mainwin.show()
app.exec_()

关于python - 在标准 python 线程中发出信号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19078249/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com