You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求助:如何让Term::Animation加载条停在最后一帧

解决Term::Animation加载条到末尾后停止循环的问题

要让加载条到达最后一帧后停止循环,不能依赖库的默认回调函数(它会自动让帧索引循环),需要自定义回调函数来控制帧的更新逻辑,具体实现如下:

核心思路

自定义一个回调函数,在每次更新时检查当前帧是否已经是加载条数组的最后一帧:

  • 如果还没到达最后一帧,继续按设定的步长递增帧索引
  • 一旦到达最后一帧,就停止帧的更新,保持当前状态

修改后的完整代码

#!/usr/bin/perl

use strict;
use warnings;

use Curses;
use Term::Animation 2.0;

my $s = Term::Animation->new();
$s->color(1);
 
my $phrase = "Press q to exit";

my @loading= (q{
=
},
q{
==
},
q{
===
},
q{
====
},
q{
=====
},
q{
======
});

# 自定义回调:控制加载条停在最后一帧
sub stop_at_last_frame {
    my ($entity, $delta) = @_;
    my $current_frame = $entity->position->[3];
    # 计算最后一帧的索引(数组从0开始计数)
    my $max_frame = scalar(@loading) - 1;
    
    # 仅当未到达最后一帧时,才执行帧更新
    if ($current_frame < $max_frame) {
        $entity->position->[3] += $delta->[3];
    }
}

$s->new_entity(
        shape           => \@loading,
        position        => [ 30, 2, 20],
        callback_args   => [0,0,0,1], # 保留帧更新步长(每次加1帧)
        callback        => \&stop_at_last_frame, # 指定自定义回调函数
        default_color   => 'YELLOW',
);

my $shape = q#
<=O=>
#; 
$s->new_entity(
             shape         => $shape,
             position      => [3, 7, 10],
             callback_args => [1, 0, 0, 0],
             wrap          => 1
);

halfdelay( 2 );

for(1..500) {
$s->animate();
my $in = lc( getch() );
if($in eq 'q') { last; }
}

关键细节说明

  1. 自定义回调函数stop_at_last_frame接收两个参数:动画实体对象和callback_args传入的增量数组
  2. 通过$entity->position->[3]获取当前帧的索引,scalar(@loading)-1计算加载条的最后一帧索引
  3. 保留原callback_args的最后一位1,用来控制帧更新的速度(每次递增1帧),但由自定义回调决定是否执行递增操作

修改后,加载条会逐步显示到最长的======状态,之后就会停止在该帧,不会再循环回到初始状态。

内容的提问来源于stack exchange,提问作者Exponecial

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 03:53:13