Tkinter基于单选按钮更改进入状态

时间:2020-10-31 13:01:34

标签: python python-3.x tkinter radio-button tkinter-entry

我有四个单选按钮。这四个按钮下面是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始终可以键入。我究竟做错了什么。如果您仍然不了解发生了什么,请自己运行此代码,您将看到。

非常感谢您的宝贵时间,我期待您的回复。

2 个答案:

答案 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)) 时,仅在选择单选按钮时才会执行此操作。那是使用单选按钮的关键,对吗?

还要注意,当运行初始代码时,整个单选按钮都被选中,我认为这可能是由于三态值所致,为了摆脱这种情况,我知道了两种方法:

  1. command=lambda:func(arg)的声明更改为:
self.type
  1. 或者,您还可以继续为每个单选按钮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__