Я работаю над проектом, где мне нужен эффект перехода, когда это необходимо. Я запускаю этот проект Python через «крутой ретро-термин» эмулятор терминала CRT.
Я хочу сделать его похожим на ЭЛТ-терминал старой школы, где на экране плавно перемещаются все символы вверх, чтобы представить следующую строку или обновить экран. Так: Эффект слайда терминала
НЕ ПЕЧАТАЮТСЯ СИМВОЛЫ ИНДИВИДУАЛЬНО, А ПРОКРУТКА ЭКРАНА.
На данный момент лучшее, что я сделал, — это создал функцию с кучей пустых отпечатков в цикле:
import time
def slide_up():
for _ in range(30):
print("")
time.sleep(0.03)
clear()
Clear() — это функция, которая очищает экран терминала:
clear = lambda: os.system('clear')
Если кто-нибудь знает, как мне добиться такого эффекта, я был бы очень признателен.
🤔 А знаете ли вы, что...
Синтаксис Python известен своей простотой и читаемостью.
Эмуляторы терминала автоматически прокручивают текст при печати новой строки. Может быть, попробовать что-то вроде этого?
import time
def smooth_print(text, delay=0.1):
"""Prints the given text smoothly, character by character, with a specified delay.
Args:
text (str): The text to print.
delay (float): The delay in seconds between each character.
"""
for char in text + "\n": # Manually add newline because is set to ""
print(char, end = "", flush=True)
time.sleep(delay)
smooth_print("Hello, world!", 0.1) # Example
Чтобы напрямую управлять прокруткой экрана, нужно что-то вроде управляющих кодов VT100. Попробуйте эту демо-версию. Он использует различные коды управления VT100 для скрытия/отображения курсора и прокрутки вверх/вниз.
import time
def smooth_scroll(lines=10, delay=0.1):
"""
Smoothly scrolls the terminal up or down a specified number of lines with a delay using VT100 escape codes.
Args:
lines (int): The number of lines to scroll. Positive values scroll up, negative values scroll down.
delay (float): The delay in seconds between each line scroll.
"""
print("\033[?25l", end = "", flush=True) # Hide the cursor
if lines > 0:
for _ in range(lines):
print("\033[1S", end = "", flush=True) # Scroll up one line
time.sleep(delay)
else:
for _ in range(abs(lines)):
print("\033[1T", end = "", flush=True) # Scroll down one line
time.sleep(delay)
print("\033[?25h", end = "", flush=True) # Show the cursor
# Example usage
smooth_scroll(lines=20, delay=0.2) # Scrolls up 20 lines
smooth_scroll(lines=-10, delay=0.2) # Scrolls down 10 lines
Вам необходимо использовать терминал, поддерживающий коды управления VT100.
Ваш код правильный, за исключением одного: вам нужно добавить flush=True
к вызовам печати. Кроме того, вам не обязательно иметь пустые строки в вызовах печати, print()
работает без аргументов. Я добавил несколько удобных аргументов для большей настройки, но все они имеют значения по умолчанию, поэтому вы можете вызывать их без аргументов. Я также сделал плавную прокрутку по всей длине экрана с помощью os.get_trrminal_size
. Документация здесь.
from time import sleep
from os import system, get_terminal_size
clear = lambda: system('clear')
def slide_up(n:int=get_terminal_size().lines, sleep_: float=0.05):
for _ in range(n):
print("")
sleep(sleep_)
clear()
Если вы не укажетеlush=True, в некоторых системах (или даже иногда) это не даст того эффекта, о котором вы говорите.
Или вы можете использовать curses
, но это слишком усложняет ситуацию.