Создание эффекта скольжения терминала в Python

Я работаю над проектом, где мне нужен эффект перехода, когда это необходимо. Я запускаю этот проект Python через «крутой ретро-термин» эмулятор терминала CRT.

Я хочу сделать его похожим на ЭЛТ-терминал старой школы, где на экране плавно перемещаются все символы вверх, чтобы представить следующую строку или обновить экран. Так: Эффект слайда терминала

НЕ ПЕЧАТАЮТСЯ СИМВОЛЫ ИНДИВИДУАЛЬНО, А ПРОКРУТКА ЭКРАНА.

На данный момент лучшее, что я сделал, — это создал функцию с кучей пустых отпечатков в цикле:

import time

def slide_up():
    for _ in range(30):
        print("")
        time.sleep(0.03)
    clear()

Clear() — это функция, которая очищает экран терминала:

clear = lambda: os.system('clear')

Если кто-нибудь знает, как мне добиться такого эффекта, я был бы очень признателен.

🤔 А знаете ли вы, что...
Синтаксис Python известен своей простотой и читаемостью.


1
51
3

Ответы:

Эмуляторы терминала автоматически прокручивают текст при печати новой строки. Может быть, попробовать что-то вроде этого?

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, но это слишком усложняет ситуацию.