#5557·flet

特性: 图标包的树摇动

作者: FeodorFitsner创建于 2025年8月15日更新于 2026年9月4日

这是在#5468,#5556的续作.

巨型集像Matrial system需要树摇图标. 没有树摇晃的设定会给应用程序捆绑增加大约30 MB !

这个想法:

  • Flet Building ' 扫描Python程序编码库时,查找从Flet'继承的所有铝的图标值。 例如:ft.Icons.ABC'或ft.CupertinoIcons.ALARM'。
  • flet building'模板中,在达特一侧重写getIconData'方法,该方法从前一步骤所找到的硬码图标列表中返回`IconData'。 例如:

达特 切换( iconCode) { 大小写 0x0001: 回放。 图标。 乙型六氯环己烷; 0x0002:回放. CupertinoIcons.ALARM; 存档副本. 默认: 返回为无效; {\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}你觉得呢?


* 由于没有参考的 Dart 编译器的`materialIcons' 或`cupertinoIcons' 列表将显示图标并只留下开关中使用的图标。

< 细节>

<摘要> 图标扫描器的虚拟编码原型 </摘要 >

[Python]
导入点
导入导入lib
从 pathlib 导入路径
从类型导入模块Type
从输入选项、 设置、 调制解调器


def 解析  enum  引用 ()
模块:模块Type,类 名称:str,成员 名称:str
) - > 可选[对象]:
尝试 :
enum class = getatr(模块,类 名称,无)
如果 enum  class 和 hasattr( enum  class, 成员  名称) :
返回 getattr( enum  class, 成员  名称)
除外:
通过
无


def find icon usages( source code: str) - > 设置 [Tuple [str, str]]:
已使用逗号 = set ()

类 Iconvisitor( ast. nodevisitor) :
def 访问  属性( 本身, 节点: ast. 属性) :
完整链 = []
当前=节点

状态时( 当前, 天体) 。 属性 :
完整链. append( 当前. attr)
当前值 = 当前值
如果存在( 当前, ast) 。 名称 :
完整链. append( 当前. id)

full chain = 列表(已更改(full chain))

如果len(full chain) == 3和full chain [0] ==="ft":
enum class = 全链 [1]
图标 名称=完整 链 [2]
已使用的 icons.add(( enum  class, 图标  名))

自行.generic visit(节点)

树 = ast.parse( source code)
图标Visitor (. visit (树)
返回已使用逗号


def 扫描  project icons( root  dir: Path) - > 设置 [Tuple [str, str]] :
全部( U)
用于root dir.rglob ("*.py") 中的文件 :
尝试 :
source=文件.read text(编码="utf-8").
已找到 = find icon usages(来源)
如果找到的话:
打印(f) {file. relative to(root dir)}: { found}"
所有已使用的 icons.update(已找到)
例外作为e:
打印(f) QQ 错误读取{文件} :{e}"
返回全部已使用( C)


def 打印  已解析  icons ()
使用: 设置 [Tuple [str, str]],
enum module: str, (中文(简体) ).
图标  base  class  path: str,
:
base mod path, base class name=图标 base class path.rsplit (""), 1)
base mod = 导入lib.import module(base mod path)
图标DataBase =
. . . . . . .