Наличие заявления на печать исчезает через определенный срок

Я хотел бы знать, можно ли ограничить количество времени, в течение которого оператор печати появляется в пользовательской консоли. У меня есть проект, который является Contact Manager, и он использовал файл CSV для хранения контактных данных. Программа предназначена для создания нового CSV-файла, даже если он не доступен в каталоге. Если я запустил программу без CSV-файла в каталоге, у меня на консоли отобразится сообщение, сообщающее пользователю, что создан новый файл. Я хотел бы, чтобы это сообщение отображалось только в течение примерно 10 секунд, а затем исчезало с консоли. Это возможно? Если так, я был бы признателен за некоторые предложения. Ниже приведен фрагмент кода, который проверяет наличие файла CSV, затем создает новый и уведомляет пользователя, если новый был создан.

    def read_contacts():
        try:
           contacts = []
           with open(FILENAME, newline="") as file:
                reader = csv.reader(file)
                for row in reader:
                    contacts.append(row)
           return contacts
        except FileNotFoundError:
           print("Could not find " + FILENAME + " file!\n + "Starting new contacts file...\n")

На этом этапе код продолжает создавать новый файл CSV. Я хотел бы, чтобы предыдущий оператор печати исчез через 10 секунд, чтобы он не отображался в консоли все время работы программы.

4 ответа

Вы можете использовать возврат каретки ("\r"), чтобы вернуться к началу напечатанной строки, подождать 10 секунд, а затем заменить текст.

Пример:

import time
def read_contacts():
    try:
        contacts = []
        with open(FILENAME, newline="") as file:
            reader = csv.reader(file)
            for row in reader:
                contacts.append(row)
        return contacts
    except FileNotFoundError:
        msg = "Could not find " + FILENAME + " file! Starting new contacts file..."
        print(msg, end="\r")
        time.sleep(10)
        print(" " * len(msg), end="\r")

Самое простое решение - использоватьsysмодуль.

      import sys
import time

FILENAME = "build_local.sh"


def disappear(msg: str, seconds: int = 3):
    # Multiple lines cannot be flushed from screen without leaving empty gaps
    msg = msg.replace('\n', '\t').strip()
    sys.stdout.write(f"\r{msg}")
    time.sleep(seconds)
    sys.stdout.write("\r")
    sys.stdout.flush()
    # Don't use print after flush as it will make future messages print on top of previous
    sys.stdout.write("\rTimed wait is done")


def read_contacts():
    try:
        contacts = []
        with open(FILENAME, newline="") as file:
            reader = csv.reader(file)
            for row in reader:
                contacts.append(row)
        return contacts
    except FileNotFoundError:
        disappear(msg=f"Could not find {FILENAME} file!\nStarting new contacts file...")


if __name__ == '__main__':
    read_contacts()

Если вы не на окнах, вы можете заглянуть в проклятия. Существует также порт для окон, который называется Unicurses.

Другим альтернативным подходом может быть использование символа \033[F: (поскольку вы не хотите, чтобы задержка прерывала оставшийся скрипт, воспользуйтесь библиотекой потоков Python)

import sys
import time
import threading

def func():
    time.sleep(10)
    sys.stdout.write("\033[F")

def read_contacts():
    try:
       contacts = []
       with open(FILENAME, newline="") as file:
            reader = csv.reader(file)
            for row in reader:
                contacts.append(row)
       return contacts
    except FileNotFoundError:
       errmsg="Could not find " + FILENAME + " file!\n + "Starting new contacts file...\n"
       print(errmsg)
       t = threading.Thread(target=func)
       t.start()
       #remaining code
Другие вопросы по тегам