Python Tkinter删除Label报错及输出值无限堆叠问题求助
问题根因
- 第一,Tkinter中所有布局方法
grid()/pack()/place()的返回值为None,你代码中直接将链式调用布局方法的结果赋值给组件变量,导致变量实际存储的是None而非组件实例:
比如
label = Label(...).grid()语句,label变量拿到的是grid方法的返回值None,后续调用label.after()自然会抛出NoneType无after属性的错误。同理你代码中的Labelframe、inputbox、imperial、metric变量全部都是None,只是部分场景未触发报错而已。
- 第二,数值堆叠的原因是你每次触发换算都新建一个Label组件放在窗口中,旧的Label不会自动销毁/更新,自然会不断堆叠。
修复方案
- 拆分组件创建和布局逻辑,先实例化组件赋值给变量,再单独调用布局方法
- 提前创建唯一的结果展示Label,每次换算只更新该Label的text属性,不需要反复新建和销毁组件
修复后的完整可运行代码:
import tkinter from tkinter import * import tkinter as tk stonestotal = 0 gramstotal = 0 def metricimperial(): Amount = stonestotal.get() global gramstotal gramstotal = Amount * 0.00220462 print(gramstotal) final() def imperialmetric(): Amount = stonestotal.get() global gramstotal gramstotal = Amount * 453.592 print(gramstotal) final() window = Tk() # 拆分组件创建和布局步骤 Labelframe = LabelFrame(window, text="this is a LabelFrame") Labelframe.grid() stonestotal = tkinter.IntVar(value=1) inputbox = Spinbox(Labelframe, textvariable=stonestotal, from_=0, to = 99999999999999999) inputbox.grid(row = 0, column = 0) imperial = Button(Labelframe,text="imperial to metric",command = imperialmetric) imperial.grid(row=1,column=0) metric = Button(Labelframe,text="metric to imperial",command = metricimperial) metric.grid(row=1,column=1) # 提前创建结果展示Label,全局复用 result_label = Label(Labelframe, text="") result_label.grid(row=2, column=0, columnspan=2) def final(): # 直接更新已有Label的文本,无需重复新建组件 result_label.config(text=str(gramstotal)) window.mainloop()
内容的提问来源于stack exchange,提问作者benjamin
相关产品推荐
相关产品推荐

