You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将字符串用作变量名?解决Tkinter图片加载报错问题

如何将字符串值用作变量名(Tkinter图片按钮场景)?

你遇到的核心问题是:生成的字符串只是变量的名字,但Tkinter的Button组件需要的是实际的ImageTk.PhotoImage对象,不是字符串。直接传字符串的话,Tkinter会把它当成图片的标识符去查找,自然找不到对应的资源,所以报错。

正确的解决方式:用字典管理图片对象

不要用exec或者直接通过字符串查找全局变量,字典是最规范、易维护的方案:

  1. 重构图片定义代码,把分散的score0、score1变量换成字典存储:
# 初始化字典存储所有分数图片
score_images = {}

# 循环生成0-9的图片(按需调整范围)
for score_num in range(10):
    # 按文件名规则拼接路径,同时用scoreX作为字典的键
    score_images[f'score{score_num}'] = ImageTk.PhotoImage(Image.open(f"scores/{score_num}9.png"))
  1. 修改按钮创建代码,通过字符串键从字典中获取图片对象:
# 生成对应的字典键名
img_key = 'score' + str(correct)
# 直接从字典取出图片对象传给Button
self.rez = Button(window, relief="sunken", image=score_images[img_key], bd=0, bg='#cecece', activebackground='#cecece') 
self.rez.place(x=520, y=330)

为什么不推荐用exec/globals()?

  • exec存在安全风险,尤其是如果correct的值不可控时,可能执行恶意代码;
  • 用globals()[img]获取变量虽然能实现,但全局变量管理混乱,后续维护成本高;
  • 字典存储还能避免Tkinter图片对象被垃圾回收的问题:如果是单独的局部变量,可能会被Python自动回收导致图片不显示,而字典只要处于有效作用域内,里面的图片对象就会被保留。

内容的提问来源于stack exchange,提问作者xllies

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 17:05:19