Python - 从scale小部件发送常量串行数据

时间:2014-09-02 19:49:10

标签: python tkinter

嗨,这个论坛的新手和一般的编程。我有一个项目,要求每秒通过串口发送一个tkinter规模的值。我一直在试着寻找这个问题的答案。任何意见,将不胜感激。谢谢:-)

编辑 - 当运行波纹管时,我得到一个带有刻度的tkinter窗口,但是在移动刻度时,数据没有通过串口推送。

import serial
from tkinter import *

mGui = Tk ()
mGui.geometry(500x250)

ser = serial.Serial(,'/dev/ttyUSB0',9600)
def scale1():
ser.write(s.get)
s=Scale (mGui, from_=0, to=100, orient=HORIZONTAL, command=scale1)
s.pack()

1 个答案:

答案 0 :(得分:0)

您想要的是异步或线程生产者/消费者模式,本质上需要定期轮询串行端口以获取新的传入数据,并定期写入传出数据。

可以从stdlib Queue模块中获取此通用示例。您可以轻松地修改它,以便当Scale()的值发生更改时,它会将新值放入队列中 - 并拥有一个专用线程来读取新数据(如果可用)或写入“串口到串口。

您可能会遇到的问题是,如果您非常快速地移动Scale控件,那么队列将获得更多的值,而不是及时写入。

如果是这种情况,您可能只想完全跳过队列,只需通过定期写入Scale()的当前值来使串行读/写器工作(0.02秒延迟可能是你能得到的最小,但如果你真正连接@ 9600波特,只需将写入间隔修改为不能写入超过可以物理放入串行缓冲器的UART。

def worker():
    while True:
        item = q.get()
        do_work(item)
        q.task_done()

q = Queue()
for i in range(num_worker_threads):
     t = Thread(target=worker)
     t.daemon = True
     t.start()

for item in source():
    q.put(item)

q.join()       # block until all tasks are done