pyqt线程停止

击停止后,虽然线程已经停止了,但是 `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_())








  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
PyQt5中,线程无法直接停止,因为线程的停止是一个危险操作,可能会导致资源泄漏或程序崩溃。然而,我们可以使用一些方法来控制线程的停止。 一种常用的方法是使用线程的标志位来控制线程的执行。在主线程中定义一个标志位变量,当需要停止线程时,将该变量设置为一个停止的信号,线程在每次循环迭代时都会检查该变量的状态,当检测到停止信号时,线程会停止执行。 另一种方法是使用PyQt5的信号与槽机制,当需要停止线程时,通过发送一个信号给线程,在线程中定义一个槽函数,接收到该信号时,线程会停止执行。 以下是一个示例代码,演示如何使用这两种方法来控制线程的停止: ```python import sys import time from PyQt5.QtCore import QThread, pyqtSignal, QObject, QTimer class WorkerThread(QThread): stop_signal = pyqtSignal() def __init__(self, parent=None): super(WorkerThread, self).__init__(parent) self.is_running = True def run(self): while self.is_running: print('Working...') time.sleep(1) self.stop_signal.emit() def stop(self): self.is_running = False class MainWindow(QObject): def __init__(self): super(MainWindow, self).__init__() self.worker_thread = WorkerThread() self.worker_thread.stop_signal.connect(self.stop_thread) self.timer = QTimer() self.timer.timeout.connect(self.worker_thread.stop) self.start_thread() def start_thread(self): self.worker_thread.start() self.timer.start(5000) def stop_thread(self): self.worker_thread.stop() print('Thread stopped.') if __name__ == '__main__': main_app = QApplication(sys.argv) main_window = MainWindow() sys.exit(main_app.exec_()) ``` 在上述代码中,`WorkerThread`类是一个继承自`QThread`的自定义线程类,通过`self.is_running`变量控制线程的执行。`stop_signal`是一个自定义的PyQt5信号,用于停止线程。`stop`函数用于设置`is_running`变量为False,停止线程的执行。 `MainWindow`类是一个包含了初始化线程的函数`start_thread`和停止线程的槽函数`stop_thread`的主窗口类。在主窗口中,通过调用`start_thread`函数来启动线程,并通过`timer`定时器来设置线程的停止操作。 当线程每次循环迭代时,会发出`stop_signal`信号,主窗口接收到该信号后会调用`stop_thread`函数来停止线程。 以上是两种常见的方法来控制线程的停止,可以根据实际需求选择适合的方法。但是请注意,在停止线程时,要注意线程中可能存在的资源释放问题,确保程序的稳定性和资源的正确释放。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值