2017-01-09 4 views
3

Я не могу использовать time.sleep в моем приложении pyqt, потому что это замораживает поток GUI, поэтому графический интерфейс будет полностью заморожен в течение этого времени. Я искал способ справиться с этим.PyQt4 equivilent to time.sleep?

Я пытался использовать QTimer, но казалось, что они должны быть связаны с другой функцией? Например, подождите десять секунд, затем запустите некоторую функцию. Есть ли способ просто ждать, а затем продолжить с текущей функцией? Благодаря!

def num(self): 
    for i in range(1,999): 
     print i 
     #Add some sleep here 

def testSleep(self): 
    QtCore.QTimer.singleShot(2000, self.num) 
+0

Функция разделения тока на две функции и использование 'QTimer' – furas

+0

функция выполняет выполнение снова и снова – PAR

+1

см. Doc [QTimer] (http://pyqt.sourceforge.net/Docs/PyQt4/qtimer.html) - it имеет метод 'singleShot()' – furas

ответ

1

Может быть, это можно было бы сделать лучше, но вы всегда можете использовать singleShot для запуска функции с задержкой, и lambda запустить функцию с аргументом.

import sys 
from PyQt4 import QtGui, QtCore 

#def num(self, i): 
def num(i): 
    print i 
    i += 1 
    if i < 999: 
     # run again after 2000ms with argument 
     QtCore.QTimer.singleShot(2000, lambda:num(i)) 
     #QtCore.QTimer.singleShot(2000, lambda:self.num(i)) 

app = QtGui.QApplication(sys.argv) 

# run first time with start argument 
num(1) 
#QtCore.QTimer.singleShot(2000, lambda:num(1)) 

sys.exit(app.exec_()) 
1

Вы не можете использовать time.sleep в PyQt основного цикла событий, как это было бы остановить цикл GUI событий от ответа.

Раствор в PyQt может выглядеть следующим образом, используя QTimer

import sys 
from PyQt4 import QtGui, QtCore 

application = QtGui.QApplication(sys.argv) 

i=0 
timer = QtCore.QTimer() 

def num(): 
    global i, timer 
    if i <999: 
     print (i) 
     i += 1 
    else: 
     timer.stop() 

timer.timeout.connect(num) 
timer.start(2000) 

sys.exit(application.exec_()) 
2

Я полагаю, вы спрашиваете, как держать GUI реагировать, если Num() занимает несколько секунд, чтобы бежать? У вас есть два варианта:

  • если num() состоит из множества мелких кусков «работы», вы можете позвонить application.processEvents() между кусками, это позволит GUI реагировать на события. Простая ситуация, с которой приходится иметь дело, когда большая часть времени num() проводится в цикле, то в начале или конце каждой итерации звоните application.processEvents(). В вашем реальном приложении, если у вас нет доступа к application, импортируйте qApp из PyQt4.
  • Лучшим подходом является выполнение num() в отдельной теме. Это много примеров на SO (например, this one). Один из способов сделать это

    • экземпляр QThread,
    • определяет класс (скажу NumberCruncher), который является производным от QObject и определяет num(self) и определяет сигнал «сделано», испускаемый num() перед возвращением
    • вызова numberCruncher.moveToThread(thread)
    • подключить сигнал нить started к num
    • начать нить
+0

Фактически функция num(), описанная здесь, внутренне импортирует несколько сценариев, поэтому в каждом другом скрипте, основанном на ответе, необходимо добавить соответствующее время сна. Это заставило GUI висели. Даже я не могу реализовать концепцию потока здесь, поскольку она включает в себя много изменений кода. Поэтому я пытался найти альтернативу для сна в Pyqt. – PAR

2

Фактически я искал альтернативу time.sleep для использования в pyqt без использования каких-либо концепций потоков.

И решение я понял, это:

from PyQt4 import QtTest 

QtTest.QTest.qWait(msecs) 

Это работает аналогично time.sleep делает GUI отзывчивым.

Благодарим вас за ответы.

+0

Вам это нужно для тестового набора или приложения? – Schollii

+0

Его применение. – PAR

+0

Тогда использование QtTest не подходит, это для модульных тестов. Кроме того, если это можно сделать с помощью QtTset, это можно сделать непосредственно в PyQt. Если вам нужно подождать некоторое время (прежде чем что-то попробовать), не блокируя графический интерфейс, вы используете 'QTimer.singleShot()'. Ваш ответ подразумевает, что ни один из трех других ответов от опытных пользователей PyQt не был адекватным, это означает, что вы не заданы вопросом. Вы должны либо уточнить это, либо, если вы не можете этого сделать, удалите его. – Schollii