PySide, спать несколько раз, не замораживая окно

У меня есть список таких словарей, как dict = {'text': 'abcd', 'delay': 1.234}. У меня есть цикл, который для каждого словаря списка ждет 'delay' и после этого что-то делает с 'text':

for element in myList:
    time.sleep(element['delay'])

    self.ui.textEdit.append(element['text'])
    print element['text']
    myFunction(element['text'])

sleep, print и myFunction работают как надо. Но textEdit никогда не меняется, и в заголовке моего окна у меня есть: «Не отвечает». Как я могу избежать этой проблемы?


person Alain    schedule 02.07.2014    source источник
comment
возможный дубликат PySide/ждать или спать   -  person Trilarion    schedule 03.07.2014
comment
Я уже объяснил разницу между моей проблемой и вашей проблемой в комментарии на этой странице...   -  person Alain    schedule 03.07.2014


Ответы (2)


Ваш код блокирует основной цикл событий Qt. События обновления GUI ставятся в очередь и не будут обрабатываться до тех пор, пока цикл обработки событий не будет разрешен снова.

Возможным обходным решением может быть вызов QtCore.QCoreApplication.processEvents() после добавления текста к textEdit, чтобы заставить цикл событий запускаться и обрабатывать события в очереди.

Более общим решением было бы переместить ваш код в рабочий поток, чтобы основной поток мог продолжать обработку событий графического интерфейса. Взгляните на ответы от меня и Shadow9043 в этом вопросе для дальнейшая информация. Сам вопрос несколько отличается от вашего, но решение аналогично (обратите внимание, что закодированный пример написан на PyQt, поэтому может немного отличаться от PySide).

person user3419537    schedule 02.07.2014

хотел добавить комментарий, но у меня нет репутации 50, так что начнем: pyside и вопрос о проблеме со сном уже задан и на него дан ответ здесь PySide / ждать или спать :(

person hemraj    schedule 02.07.2014
comment
Я уже видел этот вопрос и этот ответ. Но проблема в том, что в моем списке может быть много элементов (более 100 000), а Pyside не очень любит создавать 100 000 QTimer... - person Alain; 02.07.2014
comment
@user3771487 user3771487 Вам действительно нужно 100000 независимых таймеров? Разве вы не можете просто запустить один таймер, затем выполнить действие и запустить следующий таймер? - person Trilarion; 03.07.2014
comment
Что вы подразумеваете под запуском следующего таймера? - person Alain; 03.07.2014