首页 > 解决方案 > 如何识别使用 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()

标签: pythontkinter

解决方案


单选按钮通过让它们共享一个 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()

推荐阅读