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

Python游戏开发:调用Widget.destroy()报错name 'title' is not defined

问题原因
  1. 变量作用域限制:title是startscreen方法内的局部变量,start方法属于类的另一个方法,无法跨局部作用域访问该变量,因此触发NameError。
  2. 链式调用的陷阱:Label(...).place(...)这种写法会把place()的返回值(固定为None)赋值给title,即便解决了作用域问题,后续调用destroy()也会触发AttributeError。
修复方案

将title定义为类的实例属性(添加self.前缀),同时拆分组件创建与布局代码,确保实例属性指向的是组件对象而非None:

from tkinter import Tk, Canvas, Label, Button

class Game():
    def __init__(self):
        self.startscreen()
    def startscreen(self):
        # 先创建Label对象并赋值给实例属性
        self.title = Label(root, bg='dark red', text='story game', font=('Arial', 25))
        self.title.place(x = 150, y = 100)
        # 按钮若后续需要操作,同样建议用实例属性存储
        self.startbutton = Button(root, text='start', bg='dark orange', font=('Arial', 15), command=self.start)
        self.startbutton.place(x = 400, y = 1000)
    def start(self):
        # 通过实例属性访问Label对象并调用destroy
        self.title.destroy()
        
cw = 1100
ch = 2200
root = Tk()
c = Canvas(root, bg='dark red',  width=cw, height=ch)
c.pack()
Game()
root.mainloop()
额外优化建议

避免直接依赖全局变量root,可以将其作为参数传入Game类,增强代码封装性:

class Game():
    def __init__(self, root):
        self.root = root
        self.startscreen()
    # 其他方法保持不变

# 实例化时传入root
Game(root)

内容的提问来源于stack exchange,提问作者Ferre Liekens

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 17:15:39