从线程发信号,在线程外面收信号,不会用。
你这代码写的是真乱。给你写了个例子,根据下面的例子修改即可:
import sys
from PyQt5 import QtCore
from PyQt5.QtCore import pyqtSignal, QObject
from PyQt5.QtWidgets import QMainWindow, QApplication
# 线程类
class QTSignal(QtCore.QThread):
sendmsg = pyqtSignal(int)
def __init__(self):
super(QTSignal,self).__init__()
self.g1g1=1
# 线程函数,这里写你的逻辑
def run(self):
for i in range(10):
self.g1g1 = i # 这里根据你的需要调整g1g1的值,我这里直接遍历了i
self.sendmsg.emit(self.g1g1)
# 信号处理类,这里绑定信号和槽函数,在槽函数中处理
class shili(QMainWindow): # 这里集成QMainWindow类是为了显示窗口
def __init__(self):
super(shili,self).__init__()
self.send = QTSignal()
self.send.sendmsg.connect(self.shishi)
def fsmf(self):
self.send.start() # 启动线程,进行处理
def shishi(self,val):
print(val) # 槽函数,val是线程发送的数据
# 测试
if __name__ == '__main__':
app = QApplication(sys.argv)
form = shili()
form.fsmf()
form.show()
sys.exit(app.exec_())
【以下回答由 GPT 生成】
在问题描述中,您提到了希望在Python的线程函数fsmf中发送一个信号,并在shishi函数中接收该信号。以下是一个可能的解决方案。
首先,为了实现信号的发送和接收,您可以使用PyQt5库提供的信号和槽机制。您可以定义一个QObject子类来作为信号的发送方,并在该类中定义一个pyqtSignal。然后,您可以在线程函数中调用该信号来发送信号。
在接收方函数中,您可以将一个QObject子类的实例作为信号的接收方,并使用connect函数将信号与槽函数进行连接。这样,当信号发出时,槽函数将自动被调用。
下面是修改后的示例代码:
from PyQt5.QtCore import QObject, pyqtSignal
import threading
class MySignal(QObject):
sendmsg = pyqtSignal(int)
def __init__(self):
super(MySignal, self).__init__()
def run(self):
self.sendmsg.emit(10)
class MySlot(QObject):
def __init__(self):
super(MySlot, self).__init__()
def get(self, msg1):
return msg1
class MyClass(QObject):
g1g1 = 0
def __init__(self):
super(MyClass, self).__init__()
self.send = MySignal()
self.slot = MySlot()
self.send.sendmsg.connect(self.slot.get)
def fsmf(self):
global g1g1
for i in range(10):
if i == 5:
g1g1 = 0
self.send.run()
def shishi(self):
global g1g1
t = threading.Thread(target=self.fsmf)
t.setDaemon(True)
t.start()
g1g1 = self.slot.get()
# 创建MyClass的实例
obj = MyClass()
# 调用shishi函数
obj.shishi()
在这个示例代码中,MySignal
类定义了一个sendmsg
信号,并在MySignal
的run
函数中调用sendmsg
信号来发送信号。
MySlot
类定义了一个get
槽函数,用于接收信号。在MyClass
的构造函数中,我们创建了一个MySignal
实例(send
)和一个MySlot
实例(slot
),并使用connect
函数将sendmsg
信号与get
槽函数连接起来。
在fsmf
函数中,我们在循环中通过修改全局变量g1g1
的值来模拟发送信号的条件。然后,我们调用send
实例的run
函数来发送信号。
在shishi
函数中,我们创建一个线程并启动线程,然后等待线程结束后,我们获取slot
实例的值,即接收到的信号。
这样,您就可以在fsmf
线程函数中发送信号,并在shishi
函数中接收到该信号了。
请注意,在多线程编程中,全局变量的修改需要进行同步处理,以避免竞态条件等问题。这里的示例代码仅仅是提供一个基本的思路,您可以根据实际情况进行进一步的优化和处理。