python - 读取串行输入并打印到 Tkinter GUI

标签 python python-2.7 tkinter

我正在尝试制作一个基于 Tkinter 的 GUI,用于 Arduino 打印传感器值并响应用户输入。

我试图用来消除 while 循环的代码是这样的,它不会打印任何传感器信息,唯一的输出是“正在尝试.../dev/ttyACM0”,然后打开 tkinter 窗口。 进口系列 导入时间 从 Tkinter 导入 *

connected = False
write_to_file_path = "output.txt"
output_file = open(write_to_file_path, "w+")

locations=['/dev/ttyACM0','/dev/ttyACM1','/dev/ttyACM2','/dev/ttyACM3']

for device in locations:
    try:
        print "Trying...",device
        ser = serial.Serial(device, 9600)
        break
    except:
        print "Failed to connect on",device

## loop until the arduino tells us it is ready
while not connected:
    serin = ser.read()
    connected = True

time.sleep(0.1)
ser.flushInput()
time.sleep(1)

def serialRead():
    if ser.inWaiting():
        line = ser.readline()
        data = line.decode("utf-8").split('\t')
        print(data)
        output_file.write(line)
        root.after(1000, serialRead)



root = Tk()
root.title("Temperature Control")
serialRead()
root.mainloop()

另一方面,除了没有 tkinter 窗口之外,它可以完美地工作。但它会从缓冲区中删除旧输入并读取新输入。

import serial
import time

connected = False
write_to_file_path = "output.txt"
output_file = open(write_to_file_path, "w+")

serial_port = '/dev/ttyACM0'
baud_rate = 9600
ser = serial.Serial(serial_port, baud_rate, timeout=5)
time.sleep(0.1)
ser.flushInput()
time.sleep(1)

while True:
    if ser.inWaiting():
        line = ser.readline()
        data = line.decode("utf-8").split('\t') #ser.readline returns a binary, convert to string
        print data[0] + '\t' + data[1]
        output_file.write(line)

这是受到不久前另一篇 stackoverflow 帖子的启发:Run an infinite loop in the backgroung in Tkinter

我看过一些使用线程的示例,但我对 python 和线程都不太了解,所以如果可能的话,我真的很想让它与 root.after() 一起使用。我还尝试了使用 root.after 的示例,所有这些都与我链接的示例非常相似,但我无法让它们中的任何一个工作。我是否做了任何明显错误的事情,或者做了比需要的困难得多的事情?如果有人能指出我正确的方向,我将不胜感激。

最佳答案

我在 TK 中创建了一个 UI,用于从 GPS 接收器读取数据,但我很难让 root.mainloop() 运行,因此我在 TK 应用程序中放置了一个回调,最终调用 root.update() 而不是主循环。

代码看起来像这样:

class App:

def __init__(self, master):
    self.sats = tk.StringVar()
    self.satsnum = tk.Label(self.frame, textvariable=self.sats, bg="blue")
    self.satsnum.pack()

def update_display(self, master):

    while source:

        self.sats.set(n_sats)

        if n_sats < 10:
            satsbgcolor = 'red'
        else:
            satsbgcolor = 'green'
        self.satsnum.configure(bg = satsbgcolor)

        master.update()
        time.sleep(1)


with serial_link.get_base_args_driver(args) as driver:
    with Handler(Framer(driver.read, driver.write, verbose=True)) as source:
        root = tk.Tk()
        app = App(root)
        app.update_display(root)

请注意,time.sleep(1) 在 MacOS 上是必需的,因为如果调用更新太快,tk.update() 会泄漏内存。

关于python - 读取串行输入并打印到 Tkinter GUI,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52010473/

相关文章:

Python/BeautifulSoup 中的多线程抓取根本没有加速

python - 新窗口是空的

python - FileDialog 方法的文件类型属性在 Windows 10 上没有文件扩展名

python - Seabornpairplot kde 对角线默认行为

python - 在 django 中使用 block 内容时 <a> 标签有问题

python - 如何使用派生类中的属性覆盖基类中的字段?

python - 导入seaborn产生SHIM警告

python - 将python代码编译成单个exe

python 如何将scrapy更新到0.22

python - 将对象连接到 Treeview 小部件中的项目