跳转至

tkflu.designs.animation · 动画参数

动画参数与缓动函数。

控制主题切换等过渡动画的帧数、帧间隔与缓动曲线。

.. code-block:: python

from tkflu import set_animation_steps, set_animation_step_time

set_animation_steps(5)              # 5 帧
set_animation_step_time(20)         # 每帧 20ms
set_theme_easing("ease_in_out")     # 缓动曲线(默认)

两者都设为 0 即关闭动画(默认就是关闭)。

单控件动画的"暂停开关"

:func:~tkflu.theme_transition.run_theme_transition 会把整棵控件树的颜色插值 放到同一条时间轴上统一驱动。那一刻它必须先"静默地"把每个组件的目标配色写进 attributes(否则算不出插值起点),此时各个组件自己的 _theme() 动画 必须让路,否则同一次换肤会排出两套互相打架的帧。

:func:suspended_widget_animation 就是那个让路开关:它在上下文里把 :func:get_animation_steps / :func:get_animation_step_time 都读成 0, 于是所有组件的 _theme() 自然退化成"直接写目标值",一行组件代码都不用改。

ease_in(t)

慢起快落。

源代码位于: tkflu\designs\animation.py
56
57
58
def ease_in(t: float) -> float:
    """慢起快落。"""
    return t * t * t

ease_in_out(t)

两头慢、中间快(cubic)。换肤的默认曲线。

源代码位于: tkflu\designs\animation.py
66
67
68
69
70
def ease_in_out(t: float) -> float:
    """两头慢、中间快(cubic)。换肤的默认曲线。"""
    if t < 0.5:
        return 4.0 * t * t * t
    return 1.0 - pow(-2.0 * t + 2.0, 3) / 2.0

ease_out(t)

快起慢落。

源代码位于: tkflu\designs\animation.py
61
62
63
def ease_out(t: float) -> float:
    """快起慢落。"""
    return 1.0 - pow(1.0 - t, 3)

ease_out_back(t)

末端轻微过冲的弹回曲线,想"更活泼"时可以换它。

源代码位于: tkflu\designs\animation.py
73
74
75
76
77
def ease_out_back(t: float) -> float:
    """末端轻微过冲的弹回曲线,想"更活泼"时可以换它。"""
    c1 = 1.70158
    c3 = c1 + 1
    return 1.0 + c3 * pow(t - 1.0, 3) + c1 * pow(t - 1.0, 2)

easing_function(name)

按名字取缓动函数;名字不认识时退回默认曲线而不是抛异常。

理由和 :meth:tkflu.button.FluButton.theme 里那个"未知 style 退回默认值" 的约定一致:一次换肤不该因为一个拼错的曲线名整趟崩掉。

:param name: 曲线名,或一个可调用对象(原样返回)

源代码位于: tkflu\designs\animation.py
 98
 99
100
101
102
103
104
105
106
107
108
109
110
def easing_function(name: Optional[str]):
    """按名字取缓动函数;名字不认识时**退回默认曲线**而不是抛异常。

    理由和 :meth:`tkflu.button.FluButton.theme` 里那个"未知 style 退回默认值"
    的约定一致:一次换肤不该因为一个拼错的曲线名整趟崩掉。

    :param name: 曲线名,或一个可调用对象(原样返回)
    """
    if callable(name):
        return name
    if not name:
        return EASINGS[DEFAULT_EASING]
    return EASINGS.get(str(name).lower(), EASINGS[DEFAULT_EASING])

easing_names()

所有可用的缓动名字(排序后)。

源代码位于: tkflu\designs\animation.py
93
94
95
def easing_names():
    """所有可用的缓动名字(排序后)。"""
    return sorted(EASINGS)

get_theme_easing()

当前主题过渡的缓动曲线名。

源代码位于: tkflu\designs\animation.py
118
119
120
def get_theme_easing() -> str:
    """当前主题过渡的缓动曲线名。"""
    return environ.get("tkfluent.theme_easing", DEFAULT_EASING)

linear(t)

匀速。老实现用的就是它。

源代码位于: tkflu\designs\animation.py
51
52
53
def linear(t: float) -> float:
    """匀速。老实现用的就是它。"""
    return t

set_theme_easing(name)

设置主题过渡的缓动曲线,取值见 :data:EASINGS。

源代码位于: tkflu\designs\animation.py
113
114
115
def set_theme_easing(name: str) -> None:
    """设置主题过渡的缓动曲线,取值见 :data:`EASINGS`。"""
    environ["tkfluent.theme_easing"] = str(name)

suspended_widget_animation()

在这个上下文里,各组件自己的 _theme() 动画全部让路。

:func:~tkflu.theme_transition.run_theme_transition 用它来"静默地"把 目标配色写进各组件,从而拿到干净的插值起点。

.. note:: 用计数而不是布尔量:统一过渡本身也可能被嵌套调用(窗口 → 面板 → 菜单栏), 布尔量会在内层退出时把外层的暂停提前解除。

源代码位于: tkflu\designs\animation.py
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
@contextmanager
def suspended_widget_animation():
    """在这个上下文里,各组件自己的 ``_theme()`` 动画全部让路。

    :func:`~tkflu.theme_transition.run_theme_transition` 用它来"静默地"把
    目标配色写进各组件,从而拿到干净的插值起点。

    .. note::
       用计数而不是布尔量:统一过渡本身也可能被嵌套调用(窗口 → 面板 → 菜单栏),
       布尔量会在内层退出时把外层的暂停提前解除。
    """
    global _suspension_depth
    _suspension_depth += 1
    try:
        yield
    finally:
        _suspension_depth -= 1

widget_animation_suspended()

当前是否处于"让路"状态。

源代码位于: tkflu\designs\animation.py
149
150
151
def widget_animation_suspended() -> bool:
    """当前是否处于"让路"状态。"""
    return _suspension_depth > 0