AppCenter/
main.pyw
|
|
_apps/
__init__.py
TabularApp.py
UserAdministrationApp.py
RegisterApp.py
FnAdminApp.py
PyUi/
__init__.py
:import sys
sys.path.insert(1, '.')
__all__ = ['TabularApp',
'UserAdministrationApp',
'RegisterApp',
'FnAdminApp']
当main.pyw尝试from _apps import *
时。
在UserAdministrationApp.py
我正在尝试动态地向某些QListWidget
项添加工具提示,如下所示:
for app in self.__APPS__:
app_icon = str(os.path.join(app_icons, f"{app}.png")).replace('\\', '/')
icon = QIcon(app_icon)
if app != self.__class__:
ttip_txt = eval(f'_apps.{app}.__doc__')
else:
ttip_txt = self.__doc__
item = QListWidgetItem(icon, app)
item.setText(app)
item.setToolTip(ttip_txt)
wdg.addItem(item)
self.__APPS__
只是_apps.__all__
的副本。
我遇到的第一个问题是我会在AttributeError
中module x has no attribute y
说ttip_txt = eval(f'_apps.{app}.__doc__')
我在UserAdministrationApp模块中通过from _apps import *
解决了这个问题。此时我已经重命名了这个模块用于测试目的并且一切正常,但是当我将名称更改回UserAdministrationApp.py
时,我得到另一个AttributeError
说module __apps has no attribute UserAdministrationApp
。
我试过阅读python导入文档但其中没有任何内容真的跟我说话。 我感觉它与尝试导入自身的脚本有关。 但我仍然对这些问题很感兴趣:
import _apps
?ImportError
而不是AtributeError
?答案 0 :(得分:0)
好的,我找到了一个解决方案,虽然我认为它有点脏,但不是最好的风格,但它确实有效。
删除from _apps import *
,只删除from _apps import __all__
。
在跳过UserAdministrationApp
import
self.__class_.__name__
初始化主类
self.__APPS__ = _apps.__all__
self.class_name = self.__class__.__name__
for app in self.__APPS__:
if self.class_name != app:
exec(f'import _apps.{app}')
for app in self.__APPS__:
app_icon = str(os.path.join(app_icons, f"{app}.png")).replace('\\', '/')
icon = QIcon(app_icon)
if app != self.class_name:
ttip_txt = eval(f'_apps.{app}.__doc__')
else:
ttip_txt = self.__doc__
找到解决方案之后,我仍然希望听到为什么错误是出于教育目的。 因此,如果有人在任何时候浏览了这一点并且知道如何......你非常欢迎。