如何修复Python Ursina体素游戏中的NameError及Texture析构异常?
嘿,我帮你搞定这两个Ursina体素游戏开发里的问题,先解决那个让程序直接崩掉的致命错误,再处理那些烦人的析构警告:
一、修复致命的NameError(程序终止问题)
这个错误的核心原因是你没有正确初始化Ursina应用实例,也没启动应用。看你的代码里这两行:
app = Ursina # 只引用了类,没创建实例 # ... app.run # 只引用了方法,没调用它
Ursina的render全局对象是在Ursina()实例初始化时才会被创建的,没实例化的话,render根本不存在,所以FirstPersonController内部调用self.get_position(render)时就会触发NameError。
修复步骤:
把这两行改成带括号的调用,正确创建并启动应用:
app = Ursina() # 创建Ursina应用实例 # ... app.run() # 调用run方法启动应用
二、修复Texture类析构异常(大量被忽略的AttributeError)
这个是Ursina旧版本的小bug:当Texture对象被垃圾回收时,__del__方法会尝试删除self._cached_image,但这个属性可能还没被初始化,或者已经被提前清理了,所以抛出了被忽略的异常。
解决办法二选一:
- 升级到最新版Ursina(推荐):官方已经修复了这个问题,打开终端运行:
pip install --upgrade ursina - 临时手动修复:找到你的Ursina安装目录下的
texture.py(路径是C:\Users\POM\AppData\Local\Programs\Python\Python310\lib\site-packages\ursina\texture.py),修改__del__方法,先检查属性是否存在再删除:def __del__(self): if hasattr(self, '_cached_image'): # 先判断属性是否存在 del self._cached_image # 保留原方法的其他代码
完整修复后的代码
把你的代码修正后应该是这样:
from ursina import * from ursina.prefabs.first_person_controller import FirstPersonController app = Ursina() # 修复:创建Ursina实例 class Voxel(Button): def __init__(self, position = (0,0,0)): super().__init__( parent = scene, position = position, model = 'cube', texture = 'white_cube', color = color.white, highlight_color = color.lime, origin_y = 0.5, scale = 0.5 ) for z in range(8): for x in range(8): voxel = Voxel(position = (x,0,z)) player = FirstPersonController() voxel = Voxel() app.run() # 修复:启动应用
内容的提问来源于stack exchange,提问作者Dumucane




