为何Tkinter按钮使用comm参数正常,换其他名称会报错?
Tkinter自定义按钮参数报错原因解析
问题现象
编写create_button函数创建Tkinter按钮时,传入名为comm的自定义参数能正常运行,但换成其他名称(如cmd)时,会抛出_tkinter.TclError: unknown option "-cmd"错误。相关代码片段:
self.create_button("pi", 8, 1, comm=self.pi) self.create_button("e", 8, 2, comm=self.euler) self.create_button("His.", 8, 3, comm=self.history) # 创建按钮的函数(罗马尼亚语注释:functie care creaza butoanele) def create_button(self, text, row, column, comm=None): button = tk.Button(self.button_frame, text=text, width=4, height=1, font=self.display_font, activebackground='Gold', command=lambda: self.button_click(text), comm=comm) button.grid(row=row, column=column, padx=5, pady=5)
原因分析
你错误地将自定义参数直接传给了tk.Button的构造函数:
- Tkinter的Button组件底层基于Tcl/Tk,构造函数仅接受自身内置的配置选项。
- 巧合的是,Tcl/Tk的Button存在一个隐藏的
-comm配置选项,因此传入comm=comm时,Tkinter会将其识别为内置配置,不会报错。 - 但
cmd并非Button的内置配置选项,Tkinter找不到对应选项,就会抛出"unknown option"错误。
解决方法
不要将自定义参数直接传入Button构造函数,可通过以下两种方式处理:
方式1:在点击逻辑中直接调用自定义命令
如果comm是按钮点击时需要执行的额外命令,可直接在command绑定的逻辑里调用:
def create_button(self, text, row, column, comm=None): def on_click(): if comm: comm() self.button_click(text) button = tk.Button( self.button_frame, text=text, width=4, height=1, font=self.display_font, activebackground='Gold', command=on_click ) button.grid(row=row, column=column, padx=5, pady=5)
方式2:绑定为按钮对象的属性
如果需要后续在其他逻辑中使用这个自定义命令,可将其绑定为按钮的属性:
def create_button(self, text, row, column, comm=None): button = tk.Button( self.button_frame, text=text, width=4, height=1, font=self.display_font, activebackground='Gold', command=lambda: self.button_click(text) ) # 将自定义命令绑定为按钮属性,后续可通过button.custom_comm调用 button.custom_comm = comm button.grid(row=row, column=column, padx=5, pady=5)
内容的提问来源于stack exchange,提问作者JustAConfusedGuy
相关产品推荐
相关产品推荐

