我有一个gui,我用wxPython编写,这是作为一个软件控制器进入PID型热控制器。 我需要从热控制器获得恒定的读数,以便始终输出设备的当前温度。
假设我在另一个文件中有这个功能:
def temp_read():
#this function will query a controller, then read the value
我导入该函数,并将其设置为TextCtrl小部件的值:
out_current = wx.TextCtrl(self, pos=(250,8), size=(110,23), style=TE_READONLY)
out_temp = temp_read()#get value from function
out_current.SetValue(out_temp)#set value to widget
如何设置它以使其不断输出,同时保留gui功能以允许用户设置其余的控制参数(设置温度和其他项目)?
答案 0 :(得分:2)
您没有指定如何获取串行数据。不过我想你会使用pyserial
。读取序列的主要问题是读取它将阻塞直到下一个字符到达。因为它会立即尝试读取下一个字节(并再次阻塞),GUI永远不会空闲。
所以基本上你必须在一个单独的线程中分离串行读取并将结果传回线程安全。
为了读出一个Arduino,我创建了一个small running example(这也更详细地解释了为什么需要线程化)。删除DRS / DTR的行时,它将应用于任何串行设备。
编辑:如果你进一步查看pyserial库并查看wxPython
示例,它就是使用线程。
答案 1 :(得分:1)
关于我的评论:
这来自pyserial手册:
>>> ser = serial.Serial('/dev/ttyS1', 19200, timeout=1)
>>> x = ser.read() # read one byte
>>> s = ser.read(10) # read up to ten bytes (timeout)
>>> line = ser.readline() # read a '\n' terminated line
>>> ser.close()
>>> ser = serial.Serial(1, 38400, timeout=0,
... parity=serial.PARITY_EVEN, rtscts=1)
>>> s = ser.read(100) # read up to one hundred bytes
... # or as much is in the buffer
如果您发现必须采用Thread路线,请参阅Fredrik Haard在makeKeyAndVisible
撰写的接受答案他的简单例子如下:
import threading
connected = False
port = 'COM4'
baud = 9600
serial_port = serial.Serial(port, baud, timeout=0)
def handle_data(data):
print(data)
def read_from_port(ser):
while not connected:
#serin = ser.read()
connected = True
while True:
print("test")
reading = ser.readline().decode()
handle_data(reading)
thread = threading.Thread(target=read_from_port, args=(serial_port,))
thread.start()