Shell Eingabe Löschen

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Boggel
User
Beiträge: 23
Registriert: Samstag 15. Dezember 2018, 12:56

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
Benutzeravatar
__blackjack__
User
Beiträge: 13068
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

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.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Boggel
User
Beiträge: 23
Registriert: Samstag 15. Dezember 2018, 12:56

Danke ich werde mir das mal anschauen habe aber auch eine andere Lösung für mein Programm gefunden.
Benutzeravatar
DeaD_EyE
User
Beiträge: 1016
Registriert: Sonntag 19. September 2010, 13:45
Wohnort: Hagen
Kontaktdaten:

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)
sourceserver.info - sourceserver.info/wiki/ - ausgestorbener Support für HL2-Server
Antworten