TclError错误求助:tkinter交通标志分类GUI无法调用button命令
交通标志分类GUI的TclError错误排查与修复
错误原因分析
从报错信息和代码来看,核心问题有三个:
- 代码结构缩进错误:创建UI组件(上传按钮、标题标签等)和启动主循环的代码被错误缩进在
upload_image函数内部,导致程序启动时这些初始化代码不会自动执行。如果在交互环境中手动执行创建按钮的代码,此时top窗口实例可能已经被销毁,从而触发TclError: can't invoke "button" command: application has been destroyed。 - 未定义
classes变量:classify函数中使用了classes[pred+1]来获取分类结果,但代码中没有定义这个存储交通标志类别对应关系的变量。 - 按钮前景色与背景色重复:上传按钮和分类按钮的前景色(文字颜色)与背景色都是
#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
相关产品推荐
相关产品推荐

