wxformbuilder 生成的 Python 代码抛出 NameError

1 投票
2 回答
676 浏览
提问于 2025-04-17 08:49

我不确定背景信息是否重要,但我还是把它写上来以防万一。

我之前在用wxglade,现在我从wxglade生成了一个XRC文件,然后把它导入到wxformbuilder里。

我有一个网格(grid),我对它进行了子类化,以添加一些功能。在wxformbuilder中,这个网格显示得很正确,子类的属性也没问题(是mygrid.MyGrid)。

但是生成的代码显然没有正确导入mygrid,所以当我运行它的时候就报错了:

NameError: global name 'mygrid' is not defined

这是个bug,还是我哪里做错了?有没有什么解决办法?

2 个回答

2

你的解决办法让我用了几个月,真的很有帮助。

直到今天,我终于忽略了header字段的提示,上面写着仅限C++,并在里面指明了我放置子类的模块名称。现在,生成的类可以正确导入我的子类定义了。

header字段就在wxFormBuilder界面中subclass字段的正下方。如果你想手动编辑wxFormBuilder项目,可以把<property name="subclass">mygrid; </property>替换成<property name="subclass">mygrid; mygrid</property>。重新生成后,你会在gui.py中看到一行from mygrid import mygrid

1

好的,我找到了一种看起来有效但不太优雅的解决办法。

基本上,我手动将模块的全局字典添加了引用:
在这个例子中,代码是在文件 gui.py 中生成的,而我的类则在文件 mygrid.py 中。

import mygrid
import gui
import sys
setattr(sys.modules["gui"], "mygrid", mygrid)

撰写回答