ASCII动画闪烁的python



决定为终端制作一个简单的mp3播放器。但当我做动画时,我遇到了一个问题——当发生变化时,它会闪烁。以下是它的视频:https://youtu.be/in4VLPOfzHw.代码:

import time, os, glob, eyed3, math, sys
from colorama import init
from mutagen.mp3 import MP3

mpts = glob.glob('*.mp3')
dark_grey = '33[1;30;40m'
light_grey = '33[0;37;40m'
white = '33[1;37;40m'
lime = '33[1;32;40m'
red = '33[0;31;40m'
i = 0
song_list = []
for mpt in mpts:
song = MP3(mpt)
duration = math.ceil(song.info.length)
m_duration = duration // 60
s_duration = duration % 60
song = eyed3.load(mpt)
name = song.tag.title
song_list.append([name, [m_duration, s_duration]])
init()
# draw
while True:
# cassette
res = ''
i += 1
res += light_grey + '  ■̅̅̅̅̅̅̅̅̅̅̅̅■   n'
res += dark_grey + ' |'
res += light_grey + '|############|'
res += dark_grey + '| n'
res += dark_grey + ' |'
res += light_grey + '|'
if i % 4 == 0:
res += white + ' (/)====(/) '
elif i % 4 == 1:
res += white + ' (-)====(-) '
elif i % 4 == 2:
res += white + ' (\)====(\) '
elif i % 4 == 3:
res += white + ' (|)====(|) '
res += light_grey + '|'
res += dark_grey + '| n'
res += dark_grey + ' |'
res += light_grey + '|############|'
res += dark_grey + '|n'
res += light_grey + '  ■____________■   n'
# green line
res += lime + ' ___________________________________nn'
# song list
res += red + ' #  NAME                        TIMEn'
for i1 in range(len(song_list)):
res += dark_grey + ' ' + str(i1+1) + '.'
res += white + ' ' + song_list[i1][0] + ' '*(28 - len(song_list[i1][0])) + f'{song_list[i1][1][0]}:{song_list[i1][1][1]}n'
os.system('cls')
sys.stdout.write(res)
sys.stdout.flush()
time.sleep(0.4)

它能被修复吗?或者我试着用其他语言代替python来制作它?

这是对cls的攻击。由于您已经在使用ANSI代码来处理其他内容,请尝试以下操作:

clear = '33c'

...
while True:
...
print(clear)

请注意,使用";清除屏幕然后重新绘制它";技术,但这将从每个循环中节省几毫秒,并应减少闪烁。

这样做的目的是避免清洁整个屏幕(os.system('cls')(。我们可以简单地将光标移到顶部并重新打印所有内容。然而,将光标移到顶部几乎是不可能的。我找到的一个解决方法是打印许多特殊字符,将光标向上移动一行,直到一直移动到顶部。

参考:

cmd主机游戏;减少闪烁

使用b的第一个解决方案在windows机器上不适用。所以我选择了ender_cythe的解决方案。你必须在第一次跑步时打印一行空行,以避免他/她提到的问题。以下是完全不闪烁的示例代码:

import time
import os
i = 0
dark_grey = '33[1;30;40m'
light_grey = '33[0;37;40m'
white = '33[1;37;40m'
lime = '33[1;32;40m'
red = '33[0;31;40m'

def my_cls(nrow = 0):
if nrow == 0:
os.system('cls')
else:
print('33[F'*nrow)
def my_display(chars):
print(''.join(chars))
return len(chars)
nrow = 0
while True:
my_cls(nrow)
# cassette
res = []
i+=1
if i == 1:
res.append('n')
res.append(light_grey + '  ■̅̅̅̅̅̅̅̅̅̅̅̅■   n')
res.append(dark_grey + ' |')
res.append(light_grey + '|###########|')
res.append(dark_grey + '| n')
res.append(dark_grey + ' |')
res.append(light_grey + '|')
if i % 4 == 0:
res.append(white + ' (/)====(/) ')
elif i % 4 == 1:
res.append(white + ' (-)====(-) ')
elif i % 4 == 2:
res.append(white + ' (\)====(\) ')
elif i % 4 == 3:
res.append(white + ' (|)====(|) ')
res.append(light_grey + '|')
res.append(dark_grey + '| n')
res.append(dark_grey + ' |')
res.append(light_grey + '|############|')
res.append(dark_grey + '|n')
res.append(light_grey + '  ■____________■   n')
# green line
res.append(lime + ' ___________________________________nn')
# song list
res.append(red + ' #  NAME                        TIMEn')
nrow = my_display(res)
time.sleep(0.4)

最新更新