2014-11-09 7 views
1

Я GUI приложение, которое использует QWebView сделать процесс веб автоматизации через длинный цикл, поэтому я использовал QThread, чтобы сделать это, но я не могу прекратить поток, мой код нижекак прекратить 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.

ответ

4

Цель состоит в том, чтобы сделать основной цикл в методе «запуска» потому что функция «прекратить» останавливает цикл в «run», а не поток, сам его здесь является рабочим примером для этого, но unfortuna tely работает только на окнах

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_()) 
+1

omg 'self.terminate()' ... так просто, что я пропустил его. –

Смежные вопросы