я в настоящее время возникают проблемы со следующим кодом (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 также обновляются, как и ожидалось, почему это так?
Пожалуйста, следуйте [MCVE] {http://stackoverflow.com/help/mcve}. Вы близки, но мы могли бы использовать минимальный набор данных для воспроизведения проблемы для себя. Исправление кода с помощью глазного яблока - это интересная перспектива. – Prune
Обновление списка из потока небезопасно. Вы должны взаимодействовать только с объектами GUI из основного потока. Таким образом, вы не можете полагаться на список, отображающий правильную информацию в вашем примере. У вас может быть еще одна проблема (которую оператор 'print' решает, замедляя потоки), но сначала исправляйте обновление списка, вместо этого выбирая сигнал из вашего потока (должен быть« QThread ») в ваш основной поток, который затем обновляет список ([this] (http://stackoverflow.com/a/21071865/1994235), в ответе есть пример «QThread», излучающего сигнал). –