跳转至

tkflu.designs.renderer · renderer 渲染引擎

渲染引擎选择(tkfluent → :mod:tkdeft.engines 的适配层)。

历史上这里用环境变量存一个整数:0 = tksvg、1 = wand。现在真正的 引擎实现在 :mod:tkdeft.engines,本模块只负责:

  • 保持 set_renderer(int) / get_renderer() 的行为不变(向后兼容);
  • 允许直接传引擎名:set_renderer("skia");
  • 在进程内把选择同步给 tkdeft 引擎注册表。

编号与引擎名的对应关系

=========== ================================================== get_renderer() 引擎 =========== ================================================== 0 tksvg(默认,保持既有行为) 1 wand 2 skia(进程内栅格,推荐) 3 pillow(进程内栅格,无额外依赖) 4 cairo(进程内栅格) =========== ==================================================

这张表就是 :data:tkdeft.engines.RENDERER_INDEX,tkfluent 不再自己维护一份。

用法

::

from tkflu import set_renderer, get_renderer_name, list_renderers

set_renderer("skia")        # 或 set_renderer(2)
get_renderer()              # -> 2
get_renderer_name()         # -> "skia"
list_renderers()            # -> [(0, 'tksvg', True), (1, 'wand', True), ...]

组件内部要"按引擎分支"时,只需要判断 get_renderer() == 1(Wand 的历史特例), 其余情况(含新增的栅格引擎)都走默认几何。

FluRenderer

Bases: object

面向对象风格的渲染器开关(保留旧 API)。

::

renderer = FluRenderer()
renderer.renderer("skia")      # 设置
renderer.renderer()            # 读取,-> 2
源代码位于: tkflu\designs\renderer.py
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
class FluRenderer(object):
    """面向对象风格的渲染器开关(保留旧 API)。

    ::

        renderer = FluRenderer()
        renderer.renderer("skia")      # 设置
        renderer.renderer()            # 读取,-> 2
    """

    def renderer(self, way=None):
        """读写当前渲染器。

        :param way: ``None`` 表示只读;否则等价于 :func:`set_renderer`
        :returns: 读取时返回编号,设置时返回 ``None``
        """
        if way is None:
            return get_renderer()
        set_renderer(way)
        return None

renderer(way=None)

读写当前渲染器。

:param way: None 表示只读;否则等价于 :func:set_renderer :returns: 读取时返回编号,设置时返回 None

源代码位于: tkflu\designs\renderer.py
256
257
258
259
260
261
262
263
264
265
def renderer(self, way=None):
    """读写当前渲染器。

    :param way: ``None`` 表示只读;否则等价于 :func:`set_renderer`
    :returns: 读取时返回编号,设置时返回 ``None``
    """
    if way is None:
        return get_renderer()
    set_renderer(way)
    return None

get_renderer()

当前渲染器编号(保持历史 API)。

:returns: 0–4;组件里判"是不是 Wand"用 get_renderer() == 1

源代码位于: tkflu\designs\renderer.py
207
208
209
210
211
212
def get_renderer() -> int:
    """当前渲染器编号(保持历史 API)。

    :returns: ``0``–``4``;组件里判"是不是 Wand"用 ``get_renderer() == 1``
    """
    return int(environ.get(_ENV_KEY, "0"))

get_renderer_name()

当前引擎名,比编号更直观。

源代码位于: tkflu\designs\renderer.py
215
216
217
def get_renderer_name() -> str:
    """当前引擎名,比编号更直观。"""
    return get_engine_name()

list_renderers()

列出 (编号, 引擎名, 是否可用)。

::

>>> list_renderers()
[(0, 'tksvg', True), (1, 'wand', True), (2, 'skia', True), ...]
源代码位于: tkflu\designs\renderer.py
220
221
222
223
224
225
226
227
228
229
230
231
232
def list_renderers():
    """列出 ``(编号, 引擎名, 是否可用)``。

    ::

        >>> list_renderers()
        [(0, 'tksvg', True), (1, 'wand', True), (2, 'skia', True), ...]
    """
    available = list_engines()
    return [
        (index, name, available.get(name, False))
        for index, name in sorted(RENDERER_INDEX.items())
    ]

renderer_description(name)

取某个引擎的一句话说明(用于 --list-engines 之类的输出)。

:param name: 引擎名;未知名字时返回空字符串

源代码位于: tkflu\designs\renderer.py
235
236
237
238
239
240
241
242
243
def renderer_description(name) -> str:
    """取某个引擎的一句话说明(用于 ``--list-engines`` 之类的输出)。

    :param name: 引擎名;未知名字时返回空字符串
    """
    for row in describe_engines():
        if row["name"] == str(name).lower():
            return row.get("description", "")
    return ""

set_renderer(way)

切换渲染引擎。

:param way: 整数编号(0–4)或引擎名("skia" / "pillow" / "cairo" / "tksvg" / "wand")

引擎不可用时抛 ValueError,避免"以为开了 skia 其实还在走慢路径"。 选择会同步给 tkdeft 的引擎注册表,并记在环境变量里以便子进程继承。

源代码位于: tkflu\designs\renderer.py
194
195
196
197
198
199
200
201
202
203
204
def set_renderer(way) -> None:
    """切换渲染引擎。

    :param way: 整数编号(0–4)或引擎名(``"skia"`` / ``"pillow"`` /
        ``"cairo"`` / ``"tksvg"`` / ``"wand"``)

    引擎不可用时抛 ``ValueError``,避免"以为开了 skia 其实还在走慢路径"。
    选择会同步给 tkdeft 的引擎注册表,并记在环境变量里以便子进程继承。
    """
    engine = set_engine(_to_engine_ref(way))
    environ[_ENV_KEY] = str(_INDEX_OF.get(engine.name, 0))