Создание эффекта скольжения терминала в 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 есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
0
51
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 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

спасибо, но я больше имел в виду, как терминал скользит вверх, как показано в .gif, но спасибо за то, как символы скользят по экрану.

TrickyTaco11 21.07.2024 13:41
Ответ принят как подходящий

Чтобы напрямую управлять прокруткой экрана, нужно что-то вроде управляющих кодов 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, но это слишком усложняет ситуацию.

Другие вопросы по теме