当前位置: 首页 > 知识库问答 >
问题:

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

董花蜂
2023-03-14

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

我试图用来消除循环的代码是这个,它不打印任何传感器信息,唯一的输出是“尝试.../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帖子的启发:在Tkinter的背景中运行一个无限循环

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

共有1个答案

笪建章
2023-03-14

我在TK中制作了一个用户界面,用于从GPS接收器读取数据,但我很难找到根。mainloop()运行,因此我在TK应用程序中放置了一个回调函数,最终调用root。update()而不是mainloop。

代码如下所示:

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)

注意,时间。在MacOS上,睡眠(1)作为tk是必需的。如果调用更新太快,update()将泄漏内存

 类似资料:
  • 本文向大家介绍OCaml 从标准输入读取并打印到标准输出,包括了OCaml 从标准输入读取并打印到标准输出的使用技巧和注意事项,需要的朋友参考一下 示例 我们准备一个包含reverser.ml以下内容的文件: 然后,我们使用以下命令编译程序: 我们通过将数据传递到新的可执行文件进行测试: 该reserver.ml程序以命令式风格编写。虽然命令式样式很好,但是将其与功能翻译进行比较很有趣: 由于引入

  • 问题内容: 我为IA32编写了以下汇编脚本。应该从stdin读取一个数字,将其递增并打印到stdout,但是它的行为不符合预期,它不会打印任何内容(也许从stdin的读取不会终止,或者打印有问题吗?) 看到错误了吗?对于任何帮助,我要先感谢您, 祝一切顺利,西蒙 问题答案: 这部分都是错误的。您无法将读取结果存储在寄存器中。这实际上是在将结果存储在%edi中包含的地址中,由于您没有设置它,所以可能

  • 我有以下课程 我不能输入歌曲名nr 1,因为它总是同时显示前两首歌。 如果我输入3,就像这样:

  • 问题内容: 我想在同一行上打印列表中的项目。我尝试过的代码: 输出= 我想输出到= 此代码仍在新行上打印我的模具的ASCII艺术表示。我想将其打印在同一行上,以节省空间并在一个屏幕上显示每个玩家的状态。 问题答案: 由于的元素是多行字符串,因此要比这更难。 首先,从每个字符串的开头删除换行符,并确保ASCII图形中的所有行都具有相同的长度。 然后尝试以下 如果您将描述的更改应用于ASCII艺术作品

  • 我需要从用户处读取输入的工资,然后使用文本文件中的数字格式对象打印工资超过指定值的员工的姓名(姓氏必须为大写字母)。如果输入的薪资小于100,则打印消息“薪资必须大于100”;如果输入的薪资大于文件中的薪资,则打印消息“没有员工拥有此薪资” 文本文件名employee.text包含员工姓名、城市、部门、工资和日期 卡尔·约翰逊巴黎制作900 2000年7月20日 Wiley Cyrus伊斯坦布尔采

  • 我只是卡住了。如何在Django上打印html数据库?我有“jegy.html”,我想打印爵士桌,但我说,我卡住了。 views.py: 模型。来自django的py。数据库导入模型