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

如何实现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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 01:37:43