如何从 tkinter 滑块/刻度重复输出,以便我可以通过串行向另一台设备发送恒定的数字流?

Posted

技术标签:

【中文标题】如何从 tkinter 滑块/刻度重复输出,以便我可以通过串行向另一台设备发送恒定的数字流?【英文标题】:How can I repeatedly output from a tkinter slider/scale so I can send a constant stream of numbers to another device via serial? 【发布时间】:2019-09-26 18:40:48 【问题描述】:

基本上我想做的是大约每 50 毫秒(或尽可能频繁地)发送(通过串行)一个 tkinter 刻度值。即使滑块静止,我也想发送此数据。这是针对我正在做的一个项目,其中包括通过树莓派控制四轴飞行器。

我熟悉 'get()' 函数和 'command =' 函数,但是我不知道如何利用它们来输出重复值。

import tkinter as tk
import serial

def outputValue(value):
    print(value)
    ser.write(value.encode())

def background(window, color):
    window.configure(bg = color)
    scale = tk.Scale(window, from_= 0, to= 20, command = outputValue)
    scale.pack()

ser = serial.Serial('/dev/ttyUSB0', 9600)
window = tk.Tk()
window.title("Drone Control")
background(window, "black")
window.mainloop()

这会在滑块移动时输出一个值,因此除非您将滑块移开并移回某个位置,否则您永远不会得到重复的数字。

完美的输出是每隔 'x'ms 输出一个值。

【问题讨论】:

我会在一个变量中跟踪您的比例,然后使用由after() 循环管理的另一个函数来监控该变量并不断发送数据。 你能给我举个例子吗@Mike-SMT 【参考方案1】:

我无法使用串行进行测试,但下面的示例应该是一个足够清晰的示例,可以让您继续前进。

我们可以使用 after 不断地将数据发送到串行,然后我们可以使用您的缩放器更新一个变量,然后发送到串行。

import tkinter as tk
# import serial

tracked_var = 0


def outputValue():
    print(tracked_var)
    #ser.write(value.encode())
    window.after(500, outputValue)


def update_tracked_variable(value):
    global tracked_var
    tracked_var = value


def background(color):
    window.configure(bg=color)
    scale = tk.Scale(window, from_=0, to=20, command=update_tracked_variable)
    scale.pack()


#ser = serial.Serial('/dev/ttyUSB0', 9600)
window = tk.Tk()
window.title("Drone Control")
background("black")
outputValue()
window.mainloop()

【讨论】:

以上是关于如何从 tkinter 滑块/刻度重复输出,以便我可以通过串行向另一台设备发送恒定的数字流?的主要内容,如果未能解决你的问题,请参考以下文章

如何从 Tkinter 滑块(“Scale”)中获取价值?

对数刻度上的闪亮滑块

如何在 WPF C# 中更改滑块上刻度的设计(刻度的厚度、刻度的形状等)

如何适应对数刻度[重复]

如何修改 KendoUI 滑块刻度上的标签?

Python-Tkinter 窗口组件之Scale