欢迎访问宙启技术站
智能推送

使用Python的Spinner()实现一个带有旋转效果的进度指示器

发布时间:2023-12-17 15:14:49

在Python中,可以使用curses库提供的Spinner()函数来实现一个带有旋转效果的进度指示器。Spinner()函数可以在终端中显示一个旋转的图标,用于表示正在进行中的任务。

首先,需要安装curses库。在终端中运行以下命令进行安装:

pip install windows-curses

接下来,我们可以编写一个示例代码来演示如何使用Spinner()函数。

import curses
import time
import threading

def run_spinner(stdscr):
    # 创建一个新的窗口
    win = curses.newwin(1, 40, 10, 10)

    # 获取屏幕的最大尺寸
    max_y, max_x = stdscr.getmaxyx()

    # 设置窗口的位置
    win_y = (max_y - 1) // 2
    win_x = (max_x - 40) // 2

    # 将窗口移到指定位置
    win.mvwin(win_y, win_x)

    # 创建一个Spinner对象
    spinner = curses.textpad.Spinner()

    # 开始旋转动画
    while True:
        win.clear()  # 清空窗口
        win.border()  # 绘制边框
        win.addstr(0, 10, "Please wait...")  # 显示消息

        # 更新并显示旋转图标
        spinner.update()
        win.addstr(0, 1, spinner.current()) 
        win.refresh()

        # 暂停一段时间
        time.sleep(0.1)

def main():
    # 初始化curses
    stdscr = curses.initscr()
    curses.noecho()  # 禁止输入字符的显示
    curses.cbreak()  # 立即响应输入字符
    stdscr.keypad(True)  # 开启功能键支持

    # 创建一个子线程运行Spinner
    t = threading.Thread(target=run_spinner, args=(stdscr,))
    t.start()

    # 等待子线程完成
    t.join()

    # 清理curses环境
    curses.nocbreak()
    stdscr.keypad(False)
    curses.echo()
    curses.endwin()

if __name__ == "__main__":
    main()

在上面的代码中,我们首先导入cursestimethreading模块。然后,定义了一个run_spinner()函数,该函数运行在一个子线程中,并使用curses库在终端中显示旋转的图标。run_spinner()函数接受一个stdscr参数,该参数是一个curses._CursesWindow对象,表示终端窗口。

run_spinner()函数中,首先创建一个新的窗口win,并根据终端窗口的尺寸设置窗口的位置。然后,创建一个Spinner对象用于绘制旋转图标。接下来,使用一个无限循环来更新和显示旋转图标。在每一次循环中,先清空窗口、绘制边框和显示消息。然后,调用spinner.update()方法更新旋转图标的状态,最后使用win.addstr()方法将旋转图标显示到窗口中。在每次循环结束之前,暂停一段时间以减缓旋转的速度。

main()函数中,首先初始化curses环境,并设置一些终端属性。然后,创建一个子线程来运行run_spinner()函数,并等待子线程完成。最后,清理curses环境。

要执行上面的示例代码,可以保存为spinner_example.py文件,然后在终端中运行以下命令:

python spinner_example.py

当运行该脚本时,终端窗口会显示一个带有旋转效果的进度指示器。示例代码中使用的是一个无限循环,可以根据需要在合适的地方添加退出循环的条件。

希望这个例子能帮助你理解如何使用Spinner()函数实现一个带有旋转效果的进度指示器。