Steuerzeichen in Text- Widget

Fragen zu Tkinter.
Antworten
Barabbas
User
Beiträge: 349
Registriert: Dienstag 4. März 2008, 14:47

Hallo zusammen,

ich versuche gerade, die Rückgabe einer Pipe- Ausgabe in einem Text- Widget anzuzeigen.
Die Ausgabe ist der Prozentstatus eines Packers, der im Hintergrund läuft. Dieser Packer hat die Eigenart, nicht immer neue Zeilen auszugeben, sondern einfach die letzten 4 Zeichen mit dem Steuerzeichen \b zu löschen und dann die neue Prozentangabe zu schreiben.

So sieht die Ausgabe dann ungefähr aus:

Code: Alles auswählen

Entpacke XYZ: 10%\b\b\b\b 20%\b\b\b\b 30%
etc.

In der Konsole führt dies dazu, dass nur eine einzige Zeile zu sehen ist, bei der sich die Prozentzahlen immer aktualisieren.
Wenn ich das Ganze aber aus der Pipe auslese und in ein Text- Widget packe, werden die Steuerzeichen natürlich angezeigt (wie im oben zitierten abschnitt).

Nun ist meine Frage, ob Tkinters Text- Widget oder Python allgemein eine Möglichkeit kennt, Steuerzeichen "umzusetzen", d.h. entsprechend zu interpretieren. Ich habe versucht, das von Hand zu machen, das scheint mir aber zu fehlerträchtig.

Vielen Dank schoneinmal,

lG

Daniel
Benutzeravatar
mkesper
User
Beiträge: 919
Registriert: Montag 20. November 2006, 15:48
Wohnort: formerly known as mkallas
Kontaktdaten:

Wie wär's damit:

Code: Alles auswählen

>>> packer = 'Entpacke XYZ: 10%\b\b\b\b 20%\b\b\b\b 30%'
>>> ausgabe = packer.split()[-1]
>>> ausgabe
'30%'
Barabbas
User
Beiträge: 349
Registriert: Dienstag 4. März 2008, 14:47

hm, habe ich auch erst überlegt, führt aber in der Praxis nur zu noch mehr String- Arbeit, weil ja z.B mehrere Dateien entpackt werden.

Momentan mache ich es so, falls jemand mal ein ähnliches Problem hat:

Code: Alles auswählen

    def parsen(self, txt_to_parse):
        stin = txt_to_parse
        stout = ""
        ###         Steuerzeichen am Ende entfernen         ###
        ### weil diese zu merkwürdigen Ausgaben führen ###
        while ord(stin[-1:]) == 8:
            stin = stin[:-1]
        
        ###  Steuerzeichen parsen -> \b   ###
        ### wenn ord==8, zeichen nicht   ###
        ### anzeigen und das vorherige   ###
        ###            entfernen                  ###
        for i in range(0, len(stin)):
            if ord(stin[i])==8:
                stout = stout[0:-1]
            else:
                stout += txt_to_parse[i]
Allerdings ist das Ganze zur Zeit noch recht hässlich und rechenlastig, meine Pipe mit der Ausgabe von unrar kann ich damit aber prima abarbeiten.

lG

Barabbas
BlackJack

Da werden durch ständiges "slicen" viele Zeichenketten erzeugt. Ich hätte es so geschrieben (weitgehend ungetestet):

Code: Alles auswählen

def interprete_backspace(text):
    result = list(text.rstrip('\b'))
    j = -1
    for character in result:
        if character == '\b':
            j = max(-1, j - 1)
        else:
            j += 1
            result[j] = character
    return ''.join(result[:j+1])


def main():
    for text in ('', '\b\b', 'a', 'ab', '\ba', 'Ja\b\bNein'):
        print repr(interprete_backspace(text))
Barabbas
User
Beiträge: 349
Registriert: Dienstag 4. März 2008, 14:47

Ah, besten Dank, werde es später mal testen.
Antworten