wxpython TextCtrl и вопрос с бесконечным циклом - PullRequest
1 голос
/ 11 марта 2011

TextCtrl не работает, когда он по какой-то причине находится внутри бесконечного цикла, вот мой код:

   while 1:
        localtime = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
        i = i + 1
        #print str(i)

        serRead = ser.readline()
        serSplit = serRead.split(",")

        #this works
        print str(i)+', '+tempOrShock+', '+localtime+', '+serSplit[1]

        #this doesn't
        self.displayTextCtrl.WriteText(str(i)+', '+tempOrShock+', '+
                                        localtime+', '+serSplit[1])

Этот бесконечный цикл находится внутри события нажатия кнопки, я в основном запускаю бесконечный цикл после кнопкищелкаю и говорю моему TextCtrl постоянно писать вещи, и это не работает.Тем не менее, оператор печати работает нормально.Есть идеи, почему это так?

Ответы [ 3 ]

6 голосов
/ 11 марта 2011

Я подозреваю, что wxpython выполняет некоторую обработку (отправку событий и т. Д.) В своем основном цикле.Но пока вы не вернетесь из обработчика событий, этот цикл не может быть запущен.Возможно, вам лучше настроить таймер для периодического обновления текстового элемента управления.

3 голосов
/ 11 марта 2011

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

Наивное решение заключается в том, что внутри вашего собственного цикла вы извлекаете события из очереди и обрабатываете их.Поскольку уже запущен бесконечный цикл («цикл обработки событий»), лучшим решением будет не писать свой собственный бесконечный цикл.Вместо этого используйте wx.CallAfter или wx.CallLater, чтобы добавить работу, которая будет выполняться после обработки событий низкого уровня (т. Е. Когда графический интерфейс пользователя находится в режиме ожидания)

В действительности каждый вызов wx.CallAfterстановится одной итерацией вашего собственного цикла.

3 голосов
/ 11 марта 2011

Вы, вероятно, должны использовать wx.Timer вместо бесконечного цикла. Другой вариант для изучения - wx.Yield.

...