Tkinter中无法通过教程代码禁用/启用组件的问题求助
Tkinter中无法通过教程代码禁用/启用组件的问题求助
我用了一段来自YouTube教程的代码,想在Tkinter窗口里启用和禁用一个组件,但没得到预期效果。我原本希望点击按钮后能启用文本组件,但它一开始就是禁用状态,而且点击按钮也没法启用。我哪里错了?
以下是我使用的代码:
import tkinter as tk from tkinter import ttk class MainWindow(tk.Tk): def __init__(self): super().__init__() self.style = ttk.Style() self.create_main_frame().pack(expand=True) def on_enable_button_clicked(self): self.lbl_welcome.state(["!disabled"]) def on_disable_button_clicked(self): self.lbl_welcome.state(["disabled"]) def create_main_frame(self): frame_main = ttk.Frame(self) self.lbl_welcome = ttk.Label(frame_main,text="Testing") btn_enable = ttk.Button(frame_main,text="enable",command=self.on_enable_button_clicked()) btn_disable = ttk.Button(frame_main,text="disable",command=self.on_disable_button_clicked()) self.lbl_welcome.grid(row=0, column=0, columnspan=2) btn_enable.grid(row=1,column=0,padx=2,pady=(10,0)) btn_disable.grid(row=1,column=1,padx=2,pady=(10,0)) return frame_main def main(): main_window = MainWindow() main_window.geometry("450x400") main_window.mainloop() if __name__ == "__main__": main()
嘿,这问题其实很常见,我来帮你梳理一下:
问题1:按钮的command参数错误
你给按钮的command传了self.on_enable_button_clicked(),这里的括号会让程序在初始化按钮的时候就直接执行这个函数,而不是把函数绑定到点击事件上。等你真正点击按钮时,command其实是这个函数执行后的返回值(也就是None),自然不会有任何反应。
问题2:初始状态没设置
你希望标签一开始是禁用状态,但代码里创建lbl_welcome时并没有设置state="disabled",所以它默认是正常可交互的。不过因为按钮绑定失效,你点击禁用按钮也没法把它改成禁用状态。
修正后的代码
import tkinter as tk from tkinter import ttk class MainWindow(tk.Tk): def __init__(self): super().__init__() self.style = ttk.Style() self.create_main_frame().pack(expand=True) def on_enable_button_clicked(self): self.lbl_welcome.state(["!disabled"]) def on_disable_button_clicked(self): self.lbl_welcome.state(["disabled"]) def create_main_frame(self): frame_main = ttk.Frame(self) # 初始设置为禁用状态 self.lbl_welcome = ttk.Label(frame_main, text="Testing", state="disabled") # 去掉command参数里的括号,绑定函数本身 btn_enable = ttk.Button(frame_main, text="enable", command=self.on_enable_button_clicked) btn_disable = ttk.Button(frame_main, text="disable", command=self.on_disable_button_clicked) self.lbl_welcome.grid(row=0, column=0, columnspan=2) btn_enable.grid(row=1,column=0,padx=2,pady=(10,0)) btn_disable.grid(row=1,column=1,padx=2,pady=(10,0)) return frame_main def main(): main_window = MainWindow() main_window.geometry("450x400") main_window.mainloop() if __name__ == "__main__": main()
现在运行这段代码,标签一开始是禁用的,点击“enable”按钮就能启用,点击“disable”又会变回禁用状态,完全符合你的预期啦!
备注:内容来源于stack exchange,提问作者Jacob
相关产品推荐
相关产品推荐

