通过单选按钮切换Python tkinter Entry小部件状态

6 投票
1 回答
11170 浏览
提问于 2025-04-16 19:05

这是一个简单的问题(对像我这样的tkinter新手来说可不简单):我正在制作一个图形界面(GUI),想要有两个单选按钮来控制一个输入框(Entry)的状态(启用或禁用),用户可以在这个输入框里输入数据。当第一个单选按钮被按下时,我希望输入框被禁用;当第二个单选按钮被按下时,我希望输入框也被禁用。

这是我的代码:

from Tkinter import *

root = Tk()
frame = Frame(root)

#callbacks
def enableEntry():
    entry.configure(state=ENABLED)
    entry.update()

def disableEntry():
    entry.configure(state=DISABLED)
    entry.update()

#GUI widgets
entry = Entry(frame, width=80)
entry.pack(side='right')

var = StringVar()
disableEntryRadioButton = Radiobutton(frame, text="Disable", variable=var, value="0", command=disableEntry)
disableEntryRadioButton.pack(anchor=W)
enableEntryRadioButton = Radiobutton(frame, text="Enable", variable=var, value="1", command=enableEntry)
enableEntryRadioButton.pack(anchor=W)

我的想法是,当每个单选按钮被按下时,调用相应的回调函数。但我不太确定我写的代码是否真的能做到这一点,因为当我选择单选按钮时,输入框的状态并没有改变。

我哪里出错了呢?

1 个回答

7

你的程序有几个地方需要改进,但整体结构还不错。

  1. 你没有调用 root.mainloop()。这个调用是必须的,它可以让程序处理一些事件,比如按钮点击等。
  2. 你使用了 ENABLEDDISABLED,但没有在任何地方定义或导入它们。个人来说,我更喜欢用字符串值 "normal""disabled"
  3. 你没有把主 frame 组件放入布局中。

我修正了这三个问题后,你的代码就能正常工作了。以下是修正后的代码:

from Tkinter import *

root = Tk()
frame = Frame(root)
frame.pack()

#callbacks
def enableEntry():
    entry.configure(state="normal")
    entry.update()

def disableEntry():
    entry.configure(state="disabled")
    entry.update()

#GUI widgets
entry = Entry(frame, width=80)
entry.pack(side='right')

var = StringVar()
disableEntryRadioButton = Radiobutton(frame, text="Disable", variable=var, value="0", command=disableEntry)
disableEntryRadioButton.pack(anchor=W)
enableEntryRadioButton = Radiobutton(frame, text="Enable", variable=var, value="1", command=enableEntry)
enableEntryRadioButton.pack(anchor=W)

root.mainloop()

撰写回答