【问题标题】:How do I identify which radio button was pressed using tkInter?如何识别使用 tkInter 按下了哪个单选按钮?
【发布时间】:2019-08-03 13:59:49
【问题描述】:

我正在学习 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()

【问题讨论】:

  • 您的 var 仍然为 0,因为您的代码中绝对没有任何东西会改变它。您需要将variable=var 传递给您的每个单选按钮,以将它们连接到特定的变量。您还需要使用兼容类型 - 要么将 value= 选项更改为 int,要么使用 StringVar

标签: python tkinter


【解决方案1】:

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

【讨论】:

  • 感谢您的帮助-您的描述非常清楚!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-29
  • 2012-09-08
  • 1970-01-01
  • 1970-01-01
  • 2012-08-30
  • 2017-07-24
相关资源
最近更新 更多