Python Tkinter触发条件显示Label 2秒后自动删除报错问题求解
问题修复方案
错误原因分析
- Label实例赋值错误:
warnlabel = Label(root, text="MUST ENTER ALL 3").grid(row=1, column=3)写法中,grid()方法没有返回值,因此warnlabel实际为None,后续所有对warnlabel的操作都会失效。必须先创建Label实例赋值给变量,再单独调用grid()方法。 root.destroy()用法错误:该方法是用来销毁整个根窗口的,仅接收self一个参数,传入组件对象会触发参数数量不匹配的报错。销毁单个组件需要调用组件自身的destroy()方法。forget()方法调用错误:普通组件没有全局的root.forget()方法,使用grid布局的组件需要调用自身的grid_forget()方法移除布局,pack布局对应pack_forget(),你调用的root.forget实际是顶层窗口的wm操作接口,不适用于普通Label组件。after()方法用法错误:你写的root.after(1000, root.destroy(warnlabel))会立即执行root.destroy(warnlabel),再把执行的返回值传给after,而非延迟1秒执行。正确写法是传入待执行的函数引用,或用lambda包装执行逻辑。
修复代码
def get_API_KEYS(): #Main function root = Tk() # 提前声明warnlabel变量,方便后续操作 warnlabel = None """...other declarations / conditions / window settings ...""" def Save_KC_Keys(): #Button press triggers this function nonlocal warnlabel if len(UE1_var.get()) == 0 or len(UE2_var.get()) == 0 or len(UE3_var.get()) == 0: # 避免重复创建多个提示标签 if warnlabel is None: # 先创建Label实例,再调用grid warnlabel = Label(root, text="MUST ENTER ALL 3") warnlabel.grid(row=1, column=3) # 2秒后移除标签 def remove_warn(): nonlocal warnlabel if warnlabel: warnlabel.destroy() warnlabel = None root.after(2000, remove_warn) """...other conditions...""" root.mainloop()
如果仅需要隐藏标签不需要销毁,把warnlabel.destroy()替换为warnlabel.grid_forget()即可,下次显示时无需重新创建实例,直接调用warnlabel.grid()就能重新渲染。
内容的提问来源于stack exchange,提问作者Sanko Hunbucse
相关产品推荐
相关产品推荐

