像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()