如何用单个通用函数动态获取CustomTkinter点击按钮的text属性?
实现单个函数适配所有按钮动态获取文本
有三种实用方法可以解决这个问题,不用为每个按钮单独编写函数:
方法一:用lambda表达式传递按钮实例
先定义一个通用函数,接收按钮对象作为参数,再获取其文本内容:
import customtkinter as ctk def output_text(button): button_text = button.cget("text") # 注意pack()要加括号,否则组件不会渲染到界面 ctk.CTKLabel(Orderlist, text=button_text).pack() # 创建按钮时,用lambda把当前按钮实例传给通用函数 button1 = ctk.CTKButton(ButtonFrame, text="Button 1", font=('Arial', 14), command=lambda btn=button1: output_text(btn)) button2 = ctk.CTKButton(ButtonFrame, text="Button 2", font=('Arial', 14), command=lambda btn=button2: output_text(btn))
提示:这里写
btn=button1是为了避免变量捕获问题——如果以后在循环里批量创建按钮,必须这样写,否则所有按钮都会指向最后一个创建的实例。
方法二:绑定点击事件获取触发按钮
这种方式不用设置command参数,而是给按钮绑定鼠标点击事件,通过event.widget直接拿到被点击的按钮:
import customtkinter as ctk def output_text(event): # event.widget就是被点击的按钮对象 button_text = event.widget.cget("text") ctk.CTKLabel(Orderlist, text=button_text).pack() # 创建按钮后绑定<Button-1>(左键点击)事件 button1 = ctk.CTKButton(ButtonFrame, text="Button 1", font=('Arial', 14)) button1.bind("<Button-1>", output_text) button2 = ctk.CTKButton(ButtonFrame, text="Button 2", font=('Arial', 14)) button2.bind("<Button-1>", output_text)
方法三:用functools.partial绑定参数
functools.partial可以预先给函数绑定参数,效果和lambda类似,适合参数较多的场景:
import customtkinter as ctk from functools import partial def output_text(button): button_text = button.cget("text") ctk.CTKLabel(Orderlist, text=button_text).pack() # 用partial把按钮实例绑定到通用函数上 button1 = ctk.CTKButton(ButtonFrame, text="Button 1", font=('Arial', 14), command=partial(output_text, button1)) button2 = ctk.CTKButton(ButtonFrame, text="Button 2", font=('Arial', 14), command=partial(output_text, button2))
额外注意点
- 你原来的代码里
.pack少了括号,必须写成.pack(),否则组件不会被渲染到界面。 - 原
output_text2函数里错误引用了button1,这也是重复写函数容易犯的错误,用通用函数就能完全避免这类问题。
内容的提问来源于stack exchange,提问作者onexcent
相关产品推荐
相关产品推荐

