【问题标题】:Return choice in radiobutton Tkinter function单选按钮 Tkinter 函数中的返回选择
【发布时间】:2021-10-21 14:00:11
【问题描述】:

我尝试设置一个函数来动态创建一个单选按钮小部件(基于函数参数)。我想调用这个函数,它会返回我在单选按钮选择中所做的选择。 使用下面的代码,它被第一个单选按钮的值卡住了(我理解的是默认值)。谢谢!

def radiobox(frame, size_checkbox, *text_label):
    var = tk.IntVar()
    for k in range(size_checkbox):
        radiobox = tk.Radiobutton(frame, text=text_label[k], variable=var, value=k) 
        radiobox.pack()
    
    choice = text_label[var.get()]
return choice

【问题讨论】:

  • 请看一些 tkinter/事件驱动的编程教程。大多数时候,您不应该调用只获取用户输入的函数。您应该使用绑定/命令创建一个处理用户输入的函数。

标签: python tkinter radio-button


【解决方案1】:

您可以使用 tkinter 的 wait_variable 让函数的执行暂停,直到设置变量为止。

这里有一个简单的例子来说明这项技术,尽管我实际上并不推荐这个特定的例子作为你应该做的事情。需要注意的是,由于使用了wait_variableradiobox 函数在用户做出选择之前不会返回:

def radiobox(frame, size_checkbox, *text_label):
    var = tk.IntVar(value=-1)
    buttons = []
    for k in range(size_checkbox):
        radiobox = tk.Radiobutton(frame, text=text_label[k], variable=var, value=k)
        radiobox.pack()
        buttons.append(radiobox)

    frame.wait_variable(var)
    choice = var.get()

    # destroy the buttons
    for rb in buttons:
        rb.destroy()

    return choice

【讨论】:

  • 感谢它的工作!它似乎对单选按钮小部件非常有用。这有点难看,但它确实有效:)
【解决方案2】:

tkinter 这样的GUI 框架通常是“事件驱动的”,这是一种处理范例,其中程序中的逻辑流由事件驱动,例如用户操作、来自其他程序的消息以及来自设备(例如键盘)的硬件输入和老鼠——见event-driven programming。这意味着您可能熟悉的程序化或imperative 编程方式无法使用。

在这种情况下,这意味着您必须以不同的方式等待用户做出选择。在下面的代码中,每当按下Radiobuttons 之一时都会调用一个函数,并且该函数会相应地设置IntVar 的值——但它不会“返回”任何东西。

执行类似操作的一种方法是在用户单击 完成 按钮(或关闭对话窗口)时临时“弹出”一个对话窗口。

下面显示了一个可运行的示例来说明如何执行这些操作。

import tkinter as tk
from tkinter import ttk
from tkinter.messagebox import showinfo


class App(tk.Tk):
    def __init__(self, width, height, title=None):
        super().__init__()

        self.title('Choose' if not title else title)
        self.geometry(f'{width}x{height}')

        self.choice = 'nothing'
        self.radiobox(3, 'Label 0', 'Label 1', 'Label 2')
        tk.Button(self, text='Done', command=self.close_down).pack()

        self.protocol("WM_DELETE_WINDOW", self.close_down)

    def radiobox(self, size_checkbox, *text_label):
        self.var = tk.IntVar(value=-1)
        for k in range(size_checkbox):
            tk.Radiobutton(self, text=text_label[k], variable=self.var, value=k,
                           command=self.radio_button_pressed).pack()

    def radio_button_pressed(self):
        self.choice = self.var.get()

    def close_down(self):
        showinfo(title='Information', message=f'You chose {self.choice}')
        self.destroy()


app = App(200, 100, 'Select one:')
app.mainloop()

【讨论】:

  • 感谢您的回答!这不是我想要做的,但我牢记这个结构,我相信它会很有用。
猜你喜欢
  • 2015-05-06
  • 1970-01-01
  • 2015-09-23
  • 2022-01-17
  • 2018-09-26
  • 1970-01-01
  • 2020-02-18
  • 1970-01-01
  • 2016-05-03
相关资源
最近更新 更多