2015-05-30 3 views
0
def updateV(self, event): 
    """""" 
    global v 
    v=random.uniform(1,10) 
    print('battery voltage =') 
    print(v) 
    if v>3: 
     self.labelOne.SetBackgroundColour('red') 
     self.labelOne.SetLabel('Battery Voltage : ' + str(v)) 


    else: 
     self.labelOne.SetBackgroundColour('white') 
     self.labelOne.SetLabel('Battery Voltage : ' + str(v)) 


    self.Refresh() 

Это функция в моем графическом интерфейсе wxpython, который я использую для генерации случайных значений. Я добавил эту функцию в свой класс панели GUI. Я поместил функцию wx.Bind, которая присваивает ему значение таймера и регулярно обновляет его для изменения значения.Интеграция последовательной связи в wx GUI

Теперь графический интерфейс должен иметь последовательную связь, так как мне нужно получить значения датчиков и ввести их в свой экран графического интерфейса. Таким образом, я нашел этот код для последовательного inputing значения:

def updateV(self, event): 
    """""" 
    global v 
    v=ser.readline() 
    print v 
    if v>3: 
     self.labelOne.SetBackgroundColour('red') 
     self.labelOne.SetLabel('Battery Voltage : ' + str(v)) 


    else: 
     self.labelOne.SetBackgroundColour('white') 
     self.labelOne.SetLabel('Battery Voltage : ' + str(v)) 


    self.Refresh() 

Я тогда пошел ему инициализации части класса панели и добавил этот код:

ser = serial.Serial('COM3', 9600, timeout=0) 

На запущене графического интерфейса пользователя, значение не отображается и не печатает его в графическом интерфейсе. Я знаю, что здесь совершаю большую ошибку. В любом случае значения прямо сейчас проходят через arduino uno, подключенный к экрану XBEE, который получает 1-20 значений через другой arduino, conencted к экрану XBEE. Кстати, случайные переменные генерируются должным образом и печатаются в графическом интерфейсе, поэтому нет никакой функции с функцией. Мне нужно, чтобы python читал значение серийно и назначал его переменной, чтобы я мог напечатать значение, которое я получаю на экране моего графического интерфейса. PS: Я использовал тот же серийный код, чтобы правильно получить 0 1 2 3 4 5 6 7 8 9 10 значение на экране команды модуля python.

import serial 
import time 
ser = serial.Serial('COM3', 9600, timeout=0) 

while 1: 
    v=ser.readline() 
    print v 
    time.sleep(1) 

Я пытаюсь привыкнуть к питону, но эти маленькие вещи мешают моему прогресс .. Я новичок в Python, пожалуйста, медведь со мной!

ответ

0

Ваша проблема, по существу, что чтение последовательного интерфейса в while цикле с ser.readline(), как в последнем примере (edit1: а также при опросе с wx.Timer события) будет блокировать GUI, когда он ждет данных о Последовательный интерфейс. Вызовapp.MainLoop()запустит систему событий wxPython. Тем не менее, единственное, что сделает ваш пример GUI, - это блокировка на ser.readline(). Как только появятся некоторые данные, он будет продолжен в методе updateV. Но поскольку следующее событие таймера уже ожидает, оно будет работать до ser.readline() и блокировать его снова и предотвращать любые обновления графического интерфейса пользователя.

Вы опробовали пример wxTerminal в pyserial пакете?

Он показывает, как вращать поток, который будет выполнять чтение и отправку пользовательского SerialRxEvent, чтобы все было поточно-безопасным.

Вы также должны прочитать LongRunningTasks in the wxPython wiki, чтобы получить представление о том, как использовать потоки для длительных запусков/блокировок в wxPython и безопасно связываться с ним.

+0

Я никогда не добавлял цикл while в графическом интерфейсе. Я ожидал, что mainloop() будет выполнять ту же работу, что и бесконечный цикл, но никогда не работает. В любом случае, я могу получить последовательную связь в графическом интерфейсе с помощью mainloop()? –

+0

Вы прочитали (и поняли) примеры, которые я опубликовал в своем ответе? – nepix32

+0

Я прочитал его, но в них больше ясности. Я не могу связать, как использовать их в моем графическом интерфейсе. Мне нужно больше материала, я думаю –

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