Форум сайта python.su
если в какой-то функции исполняемой в классе интерфэйса PyQt4 поставить time.sleep или threading.Event().wait(timeout=20) - то она на єто время виснет… как заставить интєрфейс просто подождать?
Офлайн
Можно так(как вариант):
import sys
from PyQt4 import QtCore,QtGui
app = QtGui.QApplication(sys.argv)
label = QtGui.QLabel("GUI")
print "wait 5 seconds"
QtCore.QProcess.execute(QtCore.QString("/bin/sleep 5"))
print "5 seconds passed"
label.show()
sys.exit(app.exec_())
Офлайн
gmorgunov, весьма портабельно ;)
Офлайн
Не, так нельзя:( В интерфейсе Qt всё происходит асинхронно конечно, всё обрабатывается в event loop - app.exec_(). Если где-то интерпретатор зависнет, то и весь event loop зависнет:( Единственный способ - это выполнять все операции ввода-вывода асинхронно или иметь возможность часто делать запрос о готовности, а если это какие-то вычисления, то втиснуть в них QApplication.processEvents(). Всё зависит от того, чем вызвана эта задержка, от этого зависит решение. Если нужно просто подождать, то сгодится и такое:
for i in xrange(200):
time.sleep(0.05)
QApplication.processEvents()
Офлайн
я не очень понимаю… обьясните пожалуйста, что делает QApplication.processEvents() ?
Офлайн
124bitдает исполнится нескольким событиям в очереди (event loop)
я не очень понимаю… обьясните пожалуйста, что делает QApplication.processEvents() ?
Отредактировано (Ноя. 23, 2008 14:38:43)
Офлайн
import sys
from PyQt4 import QtCore,QtGui
app = QtGui.QApplication(sys.argv)
label = QtGui.QLabel("GUI")
print "wait 10 seconds"
QtCore.QThread.msleep(10000)
print "10 seconds passed"
label.show()
sys.exit(app.exec_())
Отредактировано (Ноя. 24, 2008 08:15:08)
Офлайн
ice, gmorgunov А так получится?!
import sys
from PyQt4 import QtCore, QtGui
def wait():
print "wait 10 seconds and FREEZE!!!"
QtCore.QThread.msleep(10000)
print "10 seconds passed"
app = QtGui.QApplication(sys.argv)
label = QtGui.QLabel("GUI")
label.show()
# launch test after 3 seconds, when event loop is already running
timer = QtCore.QTimer.singleShot(3000, wait)
app.exec_()
Отредактировано (Ноя. 24, 2008 11:05:46)
Офлайн
Нет. Зависнет (не проверял, но думаю так и будет) Поток то один.
Если нужно чтоб событие через определенное время произошло и 1 поток всего, то не проще таймер повесить?
Офлайн
Проверил.Виснуть - не виснет, но работает так:
- сразу появляется окно гуя.
- через 3 сек. - wait 10 seconds and FREEZE !!!
- через 10 сек. - 10 seconds passed.
Офлайн