击停止后,虽然线程已经停止了,但是 `self.tool` 对象的状态仍然是运行中的,因此再次调用 `self.tool.start()` 方法时,会出现错误。需要在停止线程后,将 `self.tool` 对象重新实例化,以便再次启动线程。
修改 `stop_event_click` 方法如下:
``` python
def stop_event_click(self):
self.tool.stop()
self.tool = Tool()
```
这样在点击停止后,会先停止线程,然后重新实例化 `self.tool` 对象,这样再次点击开始时,就可以重新启动线程了。
同时,由于 `self.tool` 对象是在 Window 类的构造方法中创建的,因此在每次重新实例化 `self.tool` 对象时,也需要重新连接信号和槽,否则程序会出现错误。因此,需要在 `stop_event_click` 方法中添加重新连接信号和槽的代码,如下所示
from PyQt5.Qt import *
from threading import Thread
import random
WIDTH = 700
HEIGH = 580
class Window(QWidget):
def __init__(self):
super().__init__()
self.setWindowTitle("的学习")
self.resize(WIDTH,HEIGH)
self.setup_ui()
self.tool=Tool()
self.tool.singal_list.connect(self.get_data)
def setup_ui(self):
self.text_brower=QTextBrowser(self)
self.text_brower.resize(600,300)
# self.text_brower.setStyleSheet('background-color:black;')
self.start_btn=QPushButton('START',self)
self.start_btn.setFixedSize(150,40)
self.start_btn.move(20,330)
self.start_btn.clicked.connect(self.start_event_click)
self.stop_btn=QPushButton('STOP',self)
self.stop_btn.setFixedSize(150,40)
self.stop_btn.move(300,330)
self.stop_btn.clicked.connect(self.stop_event_click)
def start_event_click(self):
self.tool.start()
def stop_event_click(self):
self.tool.stop()
self.tool = Tool()
self.tool.singal_list.connect(self.get_data)
def get_data(self,ls:list):
# print(str(ls))
data=str(ls)
print(data)
self.text_brower.insertPlainText('\t'+data+'\n')
# self.text_brower.setText(data)
# cursor=self.text_brower.textCursor().End #移动光标
# self.text_brower.moveCursor(cursor) #获取光标
class Tool(QThread):
singal_list=pyqtSignal(list)
def __init__(self):
super(Tool, self).__init__()
self.state = False
def run(self):
while not self.state:
data=[random.randint(10,500) for _ in range(10)]
self.singal_list.emit(data)
QThread.msleep(100)
def stop(self):
self.state = True
if __name__ == '__main__':
import sys
app=QApplication(sys.argv)
win=Window()
win.show()
sys.exit(app.exec_())