如何获取Tkinter按钮控件绑定的图像变量名?
解决Tkinter按钮获取绑定的PhotoImage变量名问题
Tkinter的PhotoImage对象绑定到组件后,组件的image属性返回的是Tcl内核分配的内部标识(比如pyimage1),而非Python层面的变量名——因为Tcl内核无法识别Python的变量名。要获取对应的变量名或图像对象,有两种实用方案:
方法一:给按钮添加自定义属性直接存储
最直观的方式是创建按钮后,手动将图像对象和变量名绑定到按钮的自定义属性上:
from tkinter import * master = Tk() FiveStarsImg = PhotoImage(file=r"D:\Users\Jean Paul\OneDrive\Programming\JP\Programs\Prog 7 - Generals Online Game\Characters\1- Five stars.png") myBtn = Button(master, image=FiveStarsImg) # 存储图像对象 myBtn.bound_img = FiveStarsImg # 可选:单独存储变量名字符串 myBtn.bound_img_name = "FiveStarsImg" # 后续获取 print(myBtn.bound_img) # 输出FiveStarsImg对应的PhotoImage对象 print(myBtn.bound_img_name) # 输出"FiveStarsImg" master.mainloop()
这种方法简单直接,还能避免PhotoImage因Python垃圾回收导致图像消失的问题,适合单图像或少量图像的场景。
方法二:维护图像标识与变量的映射字典
如果需要管理多个图像,可以建立字典,把Tkinter的图像内部标识(即PhotoImage.name属性)映射到对应的变量名和对象:
from tkinter import * master = Tk() FiveStarsImg = PhotoImage(file=r"D:\Users\Jean Paul\OneDrive\Programming\JP\Programs\Prog 7 - Generals Online Game\Characters\1- Five stars.png") # 构建映射:key是图像的Tcl标识,value包含对象和变量名 image_map = { FiveStarsImg.name: { "obj": FiveStarsImg, "name": "FiveStarsImg" } } myBtn = Button(master, image=FiveStarsImg) # 获取按钮绑定的图像标识 img_tcl_id = myBtn['image'] # 从映射中取出变量名和对象 print(image_map[img_tcl_id]["name"]) # 输出"FiveStarsImg" print(image_map[img_tcl_id]["obj"]) # 输出对应的PhotoImage对象 master.mainloop()
这种方案适合多图像场景,方便统一管理所有绑定的图像资源。
内容的提问来源于stack exchange,提问作者The_Fishy
相关产品推荐
相关产品推荐

