我有四个单选按钮。这四个按钮下面是Entry
小部件。我试图使此Entry
小部件仅在选择最后一个单选按钮时才可键入。 gui
在一个类中,如下面的代码所示:
class Gui:
def __init__(self):
pass
def draw(self):
global root
if not root:
root = tk.Tk()
root.geometry('280x350')
self.type = tk.StringVar()
self.type_label = tk.Label(text="Game Mode")
self.name_entry = tk.Entry()
self.name_entry.configure(state="disabled")
self.name_entry.update()
self.type_entry_one = tk.Radiobutton(text="Garage", value="garage", variable=self.type, command=self.disable_entry(self.name_entry))
self.type_entry_two = tk.Radiobutton(text="Festival", value="festival", variable=self.type, command=self.disable_entry(self.name_entry))
self.type_entry_three = tk.Radiobutton(text="Studio", value="studio", variable=self.type, command=self.disable_entry(self.name_entry))
self.type_entry_four = tk.Radiobutton(text="Rockslam", value="rockslam", variable=self.type, command=self.enable_entry(self.name_entry))
self.type_label.pack()
self.type_entry_one.pack()
self.type_entry_two.pack()
self.type_entry_three.pack()
self.type_entry_four.pack()
self.name_entry.pack()
root.mainloop()
def enable_entry(self, entry):
entry.configure(state="normal")
entry.update()
def disable_entry(self, entry):
entry.configure(state="disabled")
entry.update()
if __name__ == '__main__':
root = None
gui = Gui()
gui.draw()
但是,self.name_entry始终可以键入。我究竟做错了什么。如果您仍然不了解发生了什么,请自己运行此代码,您将看到。
非常感谢您的宝贵时间,我期待您的回复。
答案 0 :(得分:1)
我看到的唯一问题是,在使用(..)
时,您没有将值“正确”传递到函数中,而是调用函数,以便摆脱使用{ {1}},例如:
lambda
使用self.type_entry_one = tk.Radiobutton(text="Garage", value="garage", variable=self.type, command=lambda: self.disable_entry(self.name_entry))
self.type_entry_two = tk.Radiobutton(text="Festival", value="festival", variable=self.type, command=lambda:self.disable_entry(self.name_entry))
self.type_entry_three = tk.Radiobutton(text="Studio", value="studio", variable=self.type, command=lambda:self.disable_entry(self.name_entry))
self.type_entry_four = tk.Radiobutton(text="Rockslam", value="rockslam", variable=self.type, command=lambda:self.enable_entry(self.name_entry))
时,仅在选择单选按钮时才会执行此操作。那是使用单选按钮的关键,对吗?
还要注意,当运行初始代码时,整个单选按钮都被选中,我认为这可能是由于三态值所致,为了摆脱这种情况,我知道了两种方法:
command=lambda:func(arg)
的声明更改为:self.type
self.type = tk.StringVar(value=' ')
添加一个额外的选项,例如:tristatevalue=' '
但是请确保仅执行上述解决方案之一。阅读here,了解有关三态值的更多信息。
还请注意,您不会在任何self.type_entry_one = tk.Radiobutton(text="Garage",..,tristatevalue=' ')
窗口中传递窗口小部件,只要您只有一个窗口,那么在使用多个窗口时,它可能会混淆窗口小部件的显示位置,这会很好
也请注意,如果这是完整的代码,那么如果对master
不做任何操作,则可以删除其定义。
答案 1 :(得分:1)
您对使用this.state = {
order: {
oid: '',
order_date: '',
products: '',
first_name: '',
last_name: '',
email: '',
address: '',
city: '',
province: '',
zip: '',
country: ''
}
}
启用/禁用条目小部件具有正确的想法。大多数情况下是您的类设计存在缺陷-它介于OO代码和过程代码之间。
我修复了类结构,并使其成为RadioButton
的子类,因此它完全封装了您的GUI。现在,仅在选择tk.Tk
单选按钮后才启用name_entry
,否则将其禁用。我已经设置了在启动时选择的最后一个按钮,但是您可以轻松更改它;它会导致在启动时启用该条目。
删除了传递给方法的多余变量,以及type_entry_four
方法和对其的调用;现在可以在draw
GUI.__init__