Форум сайта python.su
Написал небольшой модуль, упрощающий (ну, как мне кажется :)) работу с потоками.
В двух словах: можно заставить метод класса (потомка QObject) выполняться в отдельном потоке. При этом метод может обращаться к атрибутам (ограниченно) и методам класса реентерабельно.
Пример работы с модулем:
#!/usr/bin/python
# -*- coding: UTF-8 -*-
from PyQt4.QtCore import *
from PyQt4.QtGui import *
import sys, time
from simple_thread import SimpleThread, closeThreads
MAX = 10
BAR_COUNT = 4
class MainFrame(QFrame):
def __init__(self):
QFrame.__init__(self)
layout = QVBoxLayout(self)
self.barList = []
for i in range(BAR_COUNT):
bar = QProgressBar(self)
bar.setRange(0, MAX)
layout.addWidget(bar)
self.barList.append(bar)
button = QPushButton('Go', self)
button.clicked.connect(self.goClick)
layout.addWidget(button)
def goClick(self):
for i in range(BAR_COUNT):
self.go(i, thr_start = True)
@SimpleThread
def go(self, barNum):
for progress in range(MAX+1):
if self.thr_stopFlag:
break
self.setProgress(barNum, progress)
time.sleep(0.5)
def setProgress(self, barNum, progress):
self.barList[barNum].setValue(progress)
def closeEvent(self, event):
closeThreads()
if __name__ == "__main__":
app = QApplication(sys.argv)
mainFrame = MainFrame()
mainFrame.show()
app.exec_()
@SimpleThread
def go(self, barNum):
for progress in range(MAX+1):
if self.thr_stopFlag:
break
self.setProgress(barNum, progress)
time.sleep(0.5)
self.go(i, thr_start = True)
def setProgress(self, barNum, progress):
self.barList[barNum].setValue(progress)
def closeEvent(self, event):
closeThreads()
Отредактировано (Май 1, 2011 13:17:42)
Офлайн