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

TclError错误求助:tkinter交通标志分类GUI无法调用button命令

交通标志分类GUI的TclError错误排查与修复

错误原因分析

从报错信息和代码来看,核心问题有三个:

  1. 代码结构缩进错误:创建UI组件(上传按钮、标题标签等)和启动主循环的代码被错误缩进在upload_image函数内部,导致程序启动时这些初始化代码不会自动执行。如果在交互环境中手动执行创建按钮的代码,此时top窗口实例可能已经被销毁,从而触发TclError: can't invoke "button" command: application has been destroyed。
  2. 未定义classes变量:classify函数中使用了classes[pred+1]来获取分类结果,但代码中没有定义这个存储交通标志类别对应关系的变量。
  3. 按钮前景色与背景色重复:上传按钮和分类按钮的前景色(文字颜色)与背景色都是#364156,导致文字无法看清。

修复后的完整代码

import tkinter as tk
from tkinter import filedialog
from tkinter import *
from PIL import ImageTk, Image
import numpy as np
from tensorflow.keras.models import load_model

# 加载训练好的模型
model = load_model('my_model.h5')

# 定义交通标志类别(根据你的模型分类结果调整补充)
classes = {
    1: "限速20km/h",
    2: "限速30km/h",
    3: "限速50km/h",
    4: "限速60km/h",
    # 此处添加模型对应的所有分类类别
}

# 创建主窗口
top = tk.Tk()
top.geometry('800x600')
top.title('Traffic sign classification')
top.configure(background='#bad5ff')

# 初始化UI组件
label = Label(top, background='#bad5ff', font=('arial', 25, 'bold'))
sign_image = Label(top)

def classify(file_path):
    image = Image.open(file_path)
    image = image.resize((32, 32))
    image = np.expand_dims(image, axis=0)
    image = np.array(image)
    print(image.shape)
    pred = np.argmax(model.predict([image]), axis=-1)[0]
    # 根据模型输出调整索引(若模型输出从0开始且与classes键对应,可删除+1)
    sign = classes.get(pred+1, "未知标志")
    print(sign)
    label.configure(foreground='#364156', text=f"Result: {sign}")

def show_classify_button(file_path):
    classify_b = Button(top, text="Classify Image", command=lambda: classify(file_path), padx=10, pady=5)
    classify_b.configure(background='#364156', foreground='#ffffff', font=('arial', 20, 'bold'))
    classify_b.place(relx=0.362, rely=0.925)

def upload_image():
    try:
        file_path = filedialog.askopenfilename()
        uploaded = Image.open(file_path)
        uploaded.thumbnail(((top.winfo_width()/2.25), (top.winfo_height()/2.25)))
        im = ImageTk.PhotoImage(uploaded)

        sign_image.configure(image=im)
        sign_image.image = im  # 保留引用防止图片被垃圾回收
        label.configure(text='')
        show_classify_button(file_path)
    except Exception as e:
        print(f"上传出错: {e}")

# 创建并布局UI组件
upload = Button(top, text="Upload an image", command=upload_image, padx=10, pady=5)
upload.configure(background='#364156', foreground='#ffffff', font=('arial', 20, 'bold'))
upload.pack(side=BOTTOM, pady=50)

sign_image.pack(side=BOTTOM, expand=True)
label.pack(side=BOTTOM, expand=True)

heading = Label(top, text="Traffic Sign Recognition", pady=20, font=('arial', 25, 'bold'))
heading.configure(background='#bad5ff', foreground='#364156')
heading.pack()

# 启动主循环
top.mainloop()

关键修复点说明

  • 调整代码缩进:将UI组件创建和主循环启动的代码移到upload_image函数外部,确保程序启动时自动初始化界面。
  • 添加classes变量:补充交通标志类别与模型输出索引的对应关系,需根据自身训练数据修改字典内容。
  • 修正按钮颜色:将按钮前景色改为白色#ffffff,保证文字清晰可见。
  • 异常处理优化:在upload_image函数中捕获具体异常并打印,便于调试问题。
  • 索引调整提示:classify函数中的pred+1需根据模型输出情况调整,若模型输出索引与classes键直接对应,可移除+1。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 14:36:22