Python代码动画显示旋转风扇保持不动

4 投票
4 回答
1505 浏览
提问于 2025-04-16 14:26

我想用Python打印一个旋转的风扇,参考了这个答案

import threading
import subprocess

I = 0

class RepeatingTimer(threading._Timer):
    def run(self):
        while True:
            self.finished.wait(self.interval)
            if self.finished.is_set():
                return
            else:
                self.function(*self.args, **self.kwargs)


def status():
    global I
    icons = ['|','/','--','\\']
    print icons[I]
    I += 1
    if I == 4: I = 0

timer = RepeatingTimer(1.0, status)
timer.daemon = True # Allows program to exit if only the thread is alive
timer.start()

proc = subprocess.Popen([ 'python', "wait.py" ])
proc.wait()

timer.cancel()

这段代码可以让我显示风扇,但它是通过回车来显示的,效果如下。

|
/
--
\
|
/
--
...

请问有什么Python代码可以在不移动光标位置的情况下打印字符?

4 个回答

1
def spin():
    sys.stdout.write('\\')
    sys.stdout.fflush()
    time.sleep(1)
    sys.stdout.write('\b|')

这算是个开始。print 会在输出后换行,而 sys.stdout.write 则不会。\b 是一个退格符,fflush 有时候需要用来清空缓冲区,特别是在打印不完整的行时。你应该能很容易地把这个方法扩展到你的代码中。

3

这是你的完整解决方案:

import itertools
import sys
import time

def whirl(max=50):
    parts = ['|', '/', '-', '\\']

    cnt = 1
    for part in itertools.cycle(parts):
        if cnt >= max:
            break
        sys.stdout.write(part)
        sys.stdout.flush()
        time.sleep(.1)
        sys.stdout.write('\b')
        cnt += 1
3

\n(换行符)是你在使用 print 语句时自动加上的。如果你想避免换行,可以在语句的结尾加一个逗号。

如果你想让风扇(fan)单独占一行,可以使用:

print icons[I]+"\r",

\r 代表回车符。

如果你想让风扇出现在一行的末尾,可以使用 \b 这个退格符:

print icons[I]+"\b",

但要注意,退格后不要再写其他字符,除了风扇的字符。

由于 print 还有其他一些特别的地方,你可能想按照 kshahar 的建议,使用 sys.stdout.write()

撰写回答