Форум сайта python.su
Есть mainwindow с ProgressBar. В QThread выполняется цикл, значение посылается через Event в ПрогрессБар. Первые несколько секунд бар обновляется, а затем окно подвисает. Цикл в потоке отрабатывается и значение отправляет, но из-за зависания прогресс бар обновляется в самом начале на пару значений и уже когда цикл отработает. В цикле потока пробовала вставлять self.app.processEvents(). Подскажите, как избавится от зтого зависания?
Python 3, Win7
class Thread(QtCore.QThread):
def __init__(self, parent, typewin = '', progress = '', sait_id = '', app = None):
QtCore.QThread.__init__(self, parent)
print('5 этап')
self.app = app
self.parent = parent
self.progress = progress
self.cout = 10000
def run(self):
c = 0
while c < self.cout:
print('этап', c)
data = c + (self.cout - c) / 100
self.app.postEvent(self, MyEvent(data, self.progress, self.app))
self.app.processEvents()
c+=1
class MyEvent(QtCore.QEvent):
def __init__(self, data, progressbar, app):
QtCore.QEvent.__init__(self, QtCore.QEvent.User)
self.data = data
progressbar.setValue(self.data)
progressbar.update()
#app.processEvents()
print(self.data)
Отредактировано (Март 19, 2011 11:43:27)
Офлайн
Для прогресс-бара я использовал несколько иной вариант, обновлял значение не через Event,а через сигнал. В потоке прописывал сигнал,в классе окна слот,типо такого:
# В потоке
self.emit(QtCore.SIGNAL("SetProgress(int)"), progress)
# В "окне"
self.connect(self.thread, QtCore.SIGNAL("SetProgress(int)"), self.SetProgress)
def SetProgress(self, value):
self.ui.ProgressBar.setValue(value)
Отредактировано (Апрель 17, 2011 02:07:40)
Офлайн
Честно говоря, я не понял всех этих извращений с событиями.
Соглашусь с Psixo, такие вещи делаются на сигналах/слотах. Только я бы подключил сигнал к слоту так, чтобы он явно был поставлен в очередь событий:
self.connect(self.thread, QtCore.SIGNAL("SetProgress(int)"), self.SetProgress, Qt.QueuedConnection)
Офлайн