python - 如何识别使用 tkInter 按下了哪个单选按钮?
问题描述
我正在学习 Python,并开始探索 tkInter 来开发简单的 GUI 示例。我目前的练习是开发一组按钮,它们充当代表离散输入的开关。我的问题是,当pin_state_change
按下按钮后调用时,我无法知道按下了哪个按钮?
一旦我知道按下了哪个按钮,我就可以更改正确的 GPIO 状态。
经过大量谷歌搜索后,我在 tkInter 中遇到了这种IntVar()
方法,并且使用get()
调用我应该能够获取按下的按钮的 ID,但这不起作用 -print(var.get())
无论我按下哪个按钮,控制台上总是打印 0。
from gpio_pin import gpio_pin_type
import tkinter as tk
gpio_pins_rb = []
root = tk.Tk()
root.withdraw()
var = tk.IntVar()
window = tk.Tk()
def pin_state_change():
print(var.get())
def create_gui():
window.title("GPIO V1 GUI")
for radbut in range(0, 5):
tk.Radiobutton(window, text ="GPIO " + str(radbut),value = "GPIO " + str(radbut), bg = "red", indicatoron = False, command = pin_state_change).grid(row = 5, column = radbut)
window.mainloop()
def initialise_system(no_of_gpios):
gpio_pins = []
for pin in range (0, no_of_gpios):
gpio_pins.append(gpio_pin_type(pin, "discrete"))
gpio_pins[pin].set(1)
#print(gpio_pins[pin].get(), end =" ")
return gpio_pins
def main():
gpins = initialise_system(5)
print(gpins[1].get())
create_gui()
if __name__== "__main__":
main()
解决方案
单选按钮通过让它们共享一个 tkinter 变量来连接在一个组中。这样您就不需要知道具体点击了哪个按钮,您只需要获取相关变量的值。
tk.Radiobutton(window, variable=var, ...)
有了上面的,var.get()
总是会返回当前选中单选按钮的值。
您的代码中还有其他几个问题。您正在创建两个实例,Tk()
但您必须只有一个。此外,您将单选按钮值设置为字符串,但稍后您尝试将这些字符串转换为整数。目前尚不清楚您是否需要整数或字符串,但您必须在使用该值的方式上保持一致。
这是您的代码的精简版本,以说明它的工作原理。我假设您想要整数值而不是字符串,所以我已经适当地修改了代码。
import tkinter as tk
root = tk.Tk()
var = tk.IntVar()
def pin_state_change():
print(var.get())
def create_gui():
for radbut in range(0, 5):
rb = tk.Radiobutton(
root,
variable=var,
text ="GPIO " + str(radbut),
value = radbut,
bg = "red",
indicatoron = False,
command = pin_state_change
)
rb.grid(row = 5, column = radbut)
root.mainloop()
def main():
create_gui()
if __name__== "__main__":
main()
推荐阅读
- javascript - 将 firebase 侦听器附加到 React 应用程序时丢失状态
- flutter - 使用 RxDart 观察 Hive 数据库中的数据
- reactjs - 带有过滤数据的 Redux 分页
- c++ - 一种将 `\e` 与 C++ 中的 `\e[A` 等转义键区分开来的方法
- javascript - GraphQL:如何重用“单个对象”解析器来加载相同对象的数组
- node.js - Typescript 类型不适用于 VS Code 中的包
- flask - WTForms ListField of FieldForm 包含 RadioField - 表单没有属性“副本”
- javascript - 开玩笑地模拟 mapbox 单击处理程序回调
- java - 使用 Jackson 和 Autovalue 进行多态列表序列化
- jekyll - 在 Jekyll 中每 3 个帖子后更改网格列