2015-10-25 5 views
1

я в настоящее время возникают проблемы со следующим кодом (Python 3.4.3 с помощью PyQt5):Python Loop Работает только с Print() включена

while not joblist ==[]:   

     currentitem = joblist.pop() 
     self.lstthreads.item(threadnum-1).setText("thread" + str(threadnum) + " - " + str(len(joblist)) + " items left to process.") 

Этот фрагмент кода в потоке, я сначала загрузить огромный текстовый файл в список, затем разделите его на 5 частей. Каждая часть работает в потоке выше. Как вы видите, элемент будет удален каждый цикл, используя pop(), и список (pyqt) обновляется с общим количеством элементов, оставшихся в списке после pop() для отслеживания прогресса.

Однако в списке показаны: Thread1 - 0 элементов осталось обработать. Thread2 - 0 элементов для обработки. Thread3 - 0 элементов для обработки. Thread4 - 0 элементов для обработки. Thread5 - 0 элементов для обработки.

Странная вещь, однако, что если добавить оператор печати, как так:

while not joblist ==[]:   
     print ("trash") 
     currentitem = joblist.pop() 
     self.lstthreads.item(threadnum-1).setText("thread" + str(threadnum) + " - " + str(len(joblist)) + " items left to process.") 

Я получаю то, что я ожидал: Резьба1 - 1396 пунктов осталось обработать. Thread2 - 1396 элементов, оставшихся для обработки. Thread3 - осталось 1396 элементов для обработки. Thread4 - 1396 элементов для обработки. Резьба 5 - 1396 элементов, оставшихся для обработки.

Элементы Listbox также обновляются, как и ожидалось, почему это так?

+1

Пожалуйста, следуйте [MCVE] {http://stackoverflow.com/help/mcve}. Вы близки, но мы могли бы использовать минимальный набор данных для воспроизведения проблемы для себя. Исправление кода с помощью глазного яблока - это интересная перспектива. – Prune

+1

Обновление списка из потока небезопасно. Вы должны взаимодействовать только с объектами GUI из основного потока. Таким образом, вы не можете полагаться на список, отображающий правильную информацию в вашем примере. У вас может быть еще одна проблема (которую оператор 'print' решает, замедляя потоки), но сначала исправляйте обновление списка, вместо этого выбирая сигнал из вашего потока (должен быть« QThread ») в ваш основной поток, который затем обновляет список ([this] (http://stackoverflow.com/a/21071865/1994235), в ответе есть пример «QThread», излучающего сигнал). –

ответ

-1

Ваш основной поток не работает из-за других потоков, не знаю причины без полного кода, но вызов QCoreApplication.processEvents() должен решить эту проблему.

Смежные вопросы