如何实现Tkinter按钮触发Pillow函数?点击无响应问题排查
问题排查与修复方案
你的代码按钮无响应是因为存在几个关键错误,导致函数执行时抛出异常却没被捕获,以下是问题点和修复后的代码:
核心问题分析
- 局部变量绑定错误:函数
CLique中先引用了全局变量im2的size属性,随后又对im2赋值,Python会将其视为局部变量,引发UnboundLocalError,直接导致函数执行中断 - 输入内容获取错误:直接把
vnome(Entry控件对象)转成字符串,无法拿到用户输入的文本,必须用vnome.get()方法 - 全局图片重复修改:
Fundo是全局变量,每次点击按钮都会在原图片上叠加修改,应该每次都重新读取原始图片文件 - 缺少异常处理:出现错误时没有提示,无法快速定位问题
修复后的完整代码
from tkinter import * from PIL import Image, ImageDraw, ImageFont import traceback def CLique(): try: # 每次点击都重新加载原始图片,避免叠加修改 fundo = Image.open(r'D:\Projetos\Jogos\Python\Teste\Fundo.jpg') im2 = Image.open('Poção.png') ftitle = ImageFont.truetype("Centaur MT Italic.ttf", 240) W = 3125 H = 4675 LarguraBase = 1890 # 处理图片缩放 wpercent = LarguraBase / float(im2.size[0]) hsize = int(im2.size[1] * wpercent) im2_resized = im2.resize((LarguraBase, hsize), Image.Resampling.LANCZOS) # 粘贴缩放后的图片到背景 fundo.paste(im2_resized, (-75, 500), im2_resized) # 获取输入框的文本内容 nome_item = vnome.get().strip() if not nome_item: print("请输入物品名称") return # 添加文本到图片 dn = ImageDraw.Draw(fundo) _, _, wn, hn = dn.textbbox((0, 0), text=nome_item, font=ftitle) dn.text(((W - wn) / 2, 200), nome_item, font=ftitle, fill=(168, 39, 0, 255)) # 显示处理后的图片 fundo.show() except Exception as e: # 打印错误信息,方便排查 print("执行出错:", str(e)) traceback.print_exc() app = Tk() app.title("Criador de Hand-Out") app.geometry('1100x800') app.configure(background="#ECDEC1") # 界面元素 Label(app, text="Nome do Item", background="#ECDEC1", foreground="#826637", anchor=W, font=30).place(x=897, y=10, width=100, height=20) vnome = Entry(app, background="#D1B786") vnome.place(x=867, y=30, width=165, height=20) Button(app, text="testar", command=CLique).place(x=810, y=460, width=280, height=60) app.mainloop()
关键修改说明
- 每次点击都重新加载原始背景图和物品图,避免多次点击导致内容叠加
- 用
vnome.get()获取用户输入的文本,添加空值判断 - 对缩放后的图片使用新变量
im2_resized,避免修改全局变量引发的绑定错误 - 添加
try-except块捕获并打印错误,方便调试 - 路径前加
r转义,避免Windows路径的反斜杠引发问题
内容的提问来源于stack exchange,提问作者DeathAngel Halo
相关产品推荐
相关产品推荐

