import time from PyQt5.QtCore import pyqtSignal, QThread class MyThread(QThread): signal_msg = pyqtSignal(str) def __init__(self): super().__init__() self.signal_msg.connect(self.fd) def run(self): print("b") time.sleep(1) self.signal_msg.emit('emit') print("c") def fd(self, msg): print(f"d ({msg})") if __name__ == '__main__': print("a") my_thread = MyThread() my_thread.start() 这个代码为什么没有输出d呢
时间: 2024-03-29 17:40:17 浏览: 59
这是因为在主线程中,程序运行到`my_thread.start()`时,会创建并启动线程,但主线程会继续往下执行,不会等待子线程执行完毕。因此,在主线程中,`my_thread.start()`之后的代码会立即执行,此时子线程中的信号还没有被发出,因此`fd`方法中的代码还没有被执行。
要解决这个问题,可以在主线程中使用`my_thread.wait()`等待子线程结束后再继续执行,或者在子线程中使用`QCoreApplication.processEvents()`强制处理事件循环,使得信号能够及时发出和处理。
修改后的代码如下:
```python
import time
from PyQt5.QtCore import pyqtSignal, QThread, QCoreApplication
class MyThread(QThread):
signal_msg = pyqtSignal(str)
def __init__(self):
super().__init__()
self.signal_msg.connect(self.fd)
def run(self):
print("b")
time.sleep(1)
self.signal_msg.emit('emit')
QCoreApplication.processEvents() # 强制处理事件循环
print("c")
def fd(self, msg):
print(f"d ({msg})")
if __name__ == '__main__':
print("a")
my_thread = MyThread()
my_thread.start()
my_thread.wait() # 等待子线程结束
```
现在运行代码,输出结果为:
```
a
b
d (emit)
c
```
阅读全文