Найти - Пользователи
Полная версия: Как заставит PyQt4 программу подождать?
Начало » GUI » Как заставит PyQt4 программу подождать?
1 2
124bit
если в какой-то функции исполняемой в классе интерфэйса PyQt4 поставить time.sleep или threading.Event().wait(timeout=20) - то она на єто время виснет… как заставить интєрфейс просто подождать?
gmorgunov
Можно так(как вариант):
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_())
SvartalF
gmorgunov, весьма портабельно ;)
poltergeist
Не, так нельзя:( В интерфейсе Qt всё происходит асинхронно конечно, всё обрабатывается в event loop - app.exec_(). Если где-то интерпретатор зависнет, то и весь event loop зависнет:( Единственный способ - это выполнять все операции ввода-вывода асинхронно или иметь возможность часто делать запрос о готовности, а если это какие-то вычисления, то втиснуть в них QApplication.processEvents(). Всё зависит от того, чем вызвана эта задержка, от этого зависит решение. Если нужно просто подождать, то сгодится и такое:
for i in xrange(200):
time.sleep(0.05)
QApplication.processEvents()
124bit
я не очень понимаю… обьясните пожалуйста, что делает QApplication.processEvents() ?
Cleric
124bit
я не очень понимаю… обьясните пожалуйста, что делает QApplication.processEvents() ?
дает исполнится нескольким событиям в очереди (event loop)
у Qt4 очень хорошая документация, грех ее не читать
ice
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_())
poltergeist
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_()
ice
Нет. Зависнет (не проверял, но думаю так и будет) Поток то один.
Если нужно чтоб событие через определенное время произошло и 1 поток всего, то не проще таймер повесить?
gmorgunov
Проверил.Виснуть - не виснет, но работает так:
- сразу появляется окно гуя.
- через 3 сек. - wait 10 seconds and FREEZE !!!
- через 10 сек. - 10 seconds passed.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB