2015-04-12 44 views
0

在所附的代码,当你点击开始它创建一个QSpinBox,并开始在QThread数到20,但如果我再次点击开始同时计数,第一QSpinBox停止,并新的需要关注的焦点,而这两个计数器在运行它,但我需要的所有旋转以分别同时运行:运行多个qthreads

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) 
     self.boxes = [] 

    def stop_thread(self): 
     self.th.stop() 

    def loopfunction(self, x): 
     self.boxes[-1].setValue(x) 

    def start_thread(self): 
     self.th = thread(2) 
     self.th.loop.connect(self.loopfunction) 
     self.th.setTerminationEnabled(True) 
     self.boxes.append(QSpinBox()) 
     self.layout.addWidget(self.boxes[-1]) 
     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(20): 
      self.x = i 
      self.loop.emit(self.x) 
      time.sleep(0.5) 

    def stop(self): 
     self.stop() 


app = QApplication(sys.argv) 
win = frmMain() 

win.show() 
sys.exit(app.exec_()) 
+0

所以,你希望这是一个每次启动都会点击一个新的旋转框,每个人都保持它自己的时间?或者您是否只希望一个旋转盒在重新按下开始按钮时重置? – 101

+0

每次点击新的旋转框 –

+0

应该停止按钮停止所有定时器吗? – 101

回答

0

我做了一些重要变化:

  • 保留了一个单独的线程列表,因为您正在覆盖同一个线程对象,
  • 修复了停止线程时的递归错误;使用terminate代替
  • 线程跟踪其自己的索引,以便知道要更新哪个旋转框。

这不是真的清楚你想,当你按下停止,或者按开始停药后发生的事情,但是这个代码应该更多的还是你少工作:

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) 
     self.boxes = [] 
     self.threads = [] 

    def stop_thread(self): 
     for th in self.threads: 
      th.terminate() 

    def loopfunction(self, n, index): 
     self.boxes[index].setValue(n) 

    def start_thread(self): 
     index = len(self.threads) 
     th = thread(index) 
     th.loop.connect(self.loopfunction) 
     th.setTerminationEnabled(True) 
     th.start() 
     self.threads.append(th)   
     self.boxes.append(QSpinBox()) 
     self.layout.addWidget(self.boxes[index])   


class thread(QThread): 
    loop = Signal(int, int) 

    def __init__(self, index): 
     QThread.__init__(self) 
     self.index = index 

    def run(self): 
     for n in range(20): 
      self.loop.emit(n, self.index) 
      time.sleep(0.5) 


app = QApplication(sys.argv) 
win = frmMain() 

win.show() 
sys.exit(app.exec_()) 
+0

谢谢,它工作:) –