2015-04-12 3 views
0

В прикрепленном коде при нажатии начала создает QSpinBox и начинает обратный отсчет до 20 в QThread, но если я нажимаю начало снова в то время как он рассчитывает, первый QSpinBox останавливается и новый один принимает фокус, и оба счетчика работают в нем, но мне нужно все спины запускать в то же время отдельно:Запуск нескольких объектов QThread одновременно в Python

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

Спасибо, это сработало :) –

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