Skip to main content
 首页 » 编程设计

python之如何在 python 中终止 qthread

2025年05月04日29qlqwjy

我有一个 GUI 应用程序,它使用 qwebview 通过长循环进行 Web 自动化处理,所以我使用 QThread 来执行此操作,但我无法终止线程,我的代码如下

class Main(QMainWindow): 
    def btStart(self): 
        self.mythread = BrowserThread() 
        self.connect(self.mythread, SIGNAL('loop()'), self.campaign_loop, Qt.AutoConnection) 
        self.mythread.start() 
 
    def btStop(self): 
        self.mythread.terminate() 
 
    def campaign_loop(self): 
        loop goes here 
 
class BrowserThread(QThread): 
    def __init__(self): 
        QThread.__init__(self) 
 
    def run(self): 
        self.emit(SIGNAL('loop()')) 

此代码在启动线程时工作正常,但无法停止循环,浏览器仍在运行,即使我对其调用关闭事件并且它从 GUI 中消失也是如此

请您参考如下方法:

编辑:它也可以在 linux 上运行,我在 raspberry pi 4 上试过它并且运行良好

重点是在“run”方法中创建主循环,因为“terminate”函数是在“run”中停止循环而不是线程本身 这是一个工作示例,但不幸的是它只适用于 Windows

import sys 
import time 
from PySide.QtGui import * 
from PySide.QtCore import * 
 
class frmMain(QDialog): 
    def __init__(self): 
        QDialog.__init__(self) 
        self.btStart = QPushButton('Start') 
        self.btStop = QPushButton('Stop') 
        self.counter = QSpinBox() 
        self.layout = QVBoxLayout() 
        self.layout.addWidget(self.btStart) 
        self.layout.addWidget(self.btStop) 
        self.layout.addWidget(self.counter) 
        self.setLayout(self.layout) 
        self.btStart.clicked.connect(self.start_thread) 
        self.btStop.clicked.connect(self.stop_thread) 
 
    def stop_thread(self): 
        self.th.stop() 
 
    def loopfunction(self, x): 
        self.counter.setValue(x) 
 
    def start_thread(self): 
        self.th = thread(2) 
        #self.connect(self.th, SIGNAL('loop()'), lambda x=2: self.loopfunction(x), Qt.AutoConnection) 
        self.th.loop.connect(self.loopfunction) 
        self.th.setTerminationEnabled(True) 
        self.th.start() 
 
class thread(QThread): 
    loop = Signal(object) 
 
    def __init__(self, x): 
        QThread.__init__(self) 
        self.x = x 
 
    def run(self): 
        for i in range(100): 
            self.x = i 
            self.loop.emit(self.x) 
            time.sleep(0.5) 
 
    def stop(self): 
        self.terminate() 
 
 
app = QApplication(sys.argv) 
win = frmMain() 
 
win.show() 
sys.exit(app.exec_())