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中的一个函数。我在GUI的面板类中添加了这个函数。我已经放置了一个wx.Bind函数,它为它分配一个计时器值并定期刷新它以定期更改值。
现在GUI需要进行串行通信,因为我需要获取传感器值并在GUI屏幕中输入它们。所以我发现这个代码用于连续输入值:
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()
然后我去了面板类的 init 部分并添加了这段代码:
ser = serial.Serial('COM3', 9600, timeout=0)
在运行GUI时,该值不会显示,也不会在GUI上打印。我知道我在这里犯了一个大错。无论如何,这些值现在通过一个连接到XBEE屏蔽的arduino uno,通过另一个连接到XBEE屏蔽的arduino接收1-20个值。顺便说一句,随机变量是正确生成的,并在GUI中打印,因此该函数存在任何问题。 我需要一种方法让python串行读取值并将其分配给变量,以便我可以打印我在GUI屏幕中获得的值。 PS:我使用相同的序列号在python模块的命令屏幕上正确获取0 1 2 3 4 5 6 7 8 9 10值。
import serial
import time
ser = serial.Serial('COM3', 9600, timeout=0)
while 1:
v=ser.readline()
print v
time.sleep(1)
我正在尝试习惯python,但是这些小事阻碍了我的进步..我是python的新手,请耐心等待我!
答案 0 :(得分:0)
您的问题主要是在#1054 - Unknown column 't.workday_start_time' in 'field list'
循环中使用while
读取串行接口,如上例所示( EDIT1 :以及使用{{1进行轮询时)在等待串行接口上的数据时,将阻止GUI。 调用 ser.readline()
将循环wxPython事件系统。但是,GUI示例唯一要做的就是阻止wx.Timer
。一旦数据出现,它将继续app.MainLoop()
方法。但是因为下一个计时器事件已经在等待,它将运行到ser.readline()
并再次阻止它并阻止任何GUI更新。
您是否尝试过pyserial包中的wxTerminal示例?
它展示了如何旋转一个将执行读取并发送用户定义的updateV
的线程,以便一切都是线程安全的。
您还应该阅读LongRunningTasks in the wxPython wiki以了解如何在wxPython中使用线程进行长时间运行/阻塞任务,并安全地与主GUI线程进行通信。