我目前正在制作一个小型应用程序,我希望用户输入一些数据,但有一个可选输入。我想为此使用一个复选按钮。如果选中,UI 应显示更多输入框,如果未选中,则 UI 应隐藏它们。
我正在使用最新版本的anaconda-spyder,并将spyder中的图形后端设置为tkinter
这是我迄今为止尝试过的:
import tkinter as tk
window=tk.Tk()
frame_a=tk.Frame(window)
frame_b=tk.Frame(window)
frame_c=tk.Frame(window)
entry1=tk.Entry(frame_a, width=10)
entry1.pack()
var1=tk.IntVar()
checkbtn=tk.Checkbutton(frame_b, text="more options?", variable=var1, onvalue=1, offvalue=0)
checkbtn.pack(side=tk.TOP)
if var1.get() ==1:
entry2=tk.Entry(frame_c, width=10)
entry2.pack()
frame_a.pack()
frame_b.pack()
frame_c.pack()
else:
frame_a.pack()
frame_b.pack()
window.mainloop()
我假设检查按钮的状态在主循环中被检查,但它似乎只在程序开始时被检查。
或者,如果未选中检查按钮,其他选项可能会变灰/不可交互,但仍然可见(我不知道这是否会让事情变得更容易)
为了从
Checkbutton
触发回调,您需要通过 command
参数传递一个函数。每当复选框改变状态时就会调用该函数。
要显示或隐藏给定的小部件,您可以分别使用
pack
或 pack_forget
。
在这里,我设置了一个名为
toggle_options
的回调函数,它将根据 frame_c
的状态以编程方式显示或隐藏 checkbtn
(我还将 var1
的类型更改为 BooleanVar
,因为这就是对于只有两种可能状态的事物来说,这是一个更明智的选择(恕我直言)。
import tkinter as tk
def toggle_options() -> None:
if var1.get():
frame_c.pack() # show the frame
else:
frame_c.pack_forget() # hide the frame
window = tk.Tk()
frame_a = tk.Frame(window)
frame_b = tk.Frame(window)
frame_c = tk.Frame(window)
frame_a.pack()
frame_b.pack()
entry1 = tk.Entry(frame_a, width=10)
entry1.pack()
entry2 = tk.Entry(frame_c, width=10)
entry2.pack()
var1 = tk.BooleanVar()
checkbtn = tk.Checkbutton(
frame_b,
text="more options?",
variable=var1,
command=toggle_options, # set the callback function here
)
checkbtn.pack()
window.mainloop()