Seite 1 von 1

Shell Eingabe Löschen

Verfasst: Samstag 23. März 2019, 13:43
von Boggel
Hallo,

mich würde mal interessieren ob und wie man die Ein-/Ausgabe in der Shell löschen kann.
Damit meine ich man hat z.B. eine Ausgabe "Bitte drücke Enter..."
Wenn man dann Enter drückt soll die Shell "Leer" sein und ein neuer Text erscheinen.
Ich habe schon Codes gefunden bei denen die Shell "geleert" wird aber man auch aus dem Programm geschmissen wird.
Geht das auch das man trotzdem noch im Programm bleibt oder geht das nicht?

Mfg Boggel

Re: Shell Eingabe Löschen

Verfasst: Samstag 23. März 2019, 14:10
von __blackjack__
Erst mal sollte man überlegen ob man das wirklich will, denn die meisten Anwender sind sauer wenn man ihnen einfach so Inhalte aus dem Terminal löscht. Deshalb stellen Programme das Terminal komplett benutzen am Programmende die alte Ausgabe normalerweise wieder her.

Ansonsten schau Dir mal das `curses`-Modul an (muss man unter Windows extern installieren) oder vielleicht auch so etwas wie das externe `prompt_toolkit`. `click` hat auch eine Hilfsfunktion um das Terminal zu leeren.

Re: Shell Eingabe Löschen

Verfasst: Donnerstag 28. März 2019, 21:47
von Boggel
Danke ich werde mir das mal anschauen habe aber auch eine andere Lösung für mein Programm gefunden.

Re: Shell Eingabe Löschen

Verfasst: Freitag 29. März 2019, 08:50
von DeaD_EyE
Solche kleinen Aufgaben hab ich mit Ansi Escape Sequenzen gelöst.
Ist aber nur mit Linux und vielleicht MacOS kompatibel.

https://stackoverflow.com/questions/377 ... -character

Code: Alles auswählen

def cls_home_print(text):
    """
    Clear Screen
    Back to home position
    Print the text without linebreak
    """
    print('\033[2J\033[H', end='', flush=True)
    print(text, end='', flush=True)
Wenn man nur irgendeinen Status mal eben in der Konsole ausgeben will und diesen Status auch aktualisieren will, fängt man nicht unbedingt an ein komplettes neues Framework zu lernen.
Curses ist sehr low level. Wer Curses beherrscht hat verstanden wie Terminals funktionieren. Sicherlich ist aufgefallen, dass flush=True ist. Manchmal wird der Buffer nicht geleert und dann
wird auch nichts im Terminal ausgegeben. Das ist der Nachteil, wenn man alles zu Fuß macht. Das passiert vor allem in Schleifen.

Die vorgeschlagene Lösung stellt den Inhalt nicht wieder her.
Wenn du ein bisschen betrügen willst, kannst du das Programm tput verwenden. Rein von der Theorie her, macht es das selbe wie curses, nur über Befehle und parameter.

Code: Alles auswählen

import time
import subprocess
from contextlib import contextmanager


@contextmanager
def restore_terminal():
    subprocess.Popen(['tput', 'smcup']).wait()
    yield
    subprocess.Popen(['tput', 'rmcup']).wait()
Wenn man den Contextmanager nun aufruft, wird durch tput smcup der Inhalt des Terminals gespeichert. Der Befehl tput rmcup stellt den alten Inhalt wieder her.

Beispielcode:

Code: Alles auswählen

print('Hello World')
time.sleep(2)
with restore_terminal():
    for i in range(10):
        cls_home_print(i)
        time.sleep(0.1)
    time.sleep(2)