[Python-de] Re: Freie Ausgabe auf Zeilen des Displays

Thorsten Kampe thorsten at thorstenkampe.de
Mon Apr 26 21:19:34 CEST 2004


* Thorsten Kampe (2004-04-26 15:21 +0100)
> Vielleicht war meine "Zeichnung" mißverständlich, also noch ein
> Versuch...:
> 
>>>> foobar('A-Z', 'auf fuenf Zeilen')
> A
> B
> C
> D
> E
> <nun wird die erste Zeile überschrieben>
>>>> foobar('A-Z', 'auf fuenf Zeilen')
> F
> B
> C
> D
> E
> <undsoweiter>
>>>> foobar('A-Z', 'auf fuenf Zeilen')
> F
> G
> H
> I
> E
> <schlußendlich>
>>>> foobar('A-Z', 'auf fuenf Zeilen')
> V
> W
> X
> Y
> Z
> 
> Das Problem ist nicht der "Modulo-Algorithmus", sondern das
> "überschreiben" der ersten Zeile...

Hm, einige haben das curses-Modul vorgeschlagen, das erscheint mir
aber zu komplex für diese simple Aufgabe. "ansi.py" (welches auch
vorgeschlagen wurde) unterstützt nicht nur farbige Ausgabe sondern
auch Cursor-Bewegungen (move, moveUp, moveForward, clear, save, etc.)

Folgendes Beispielprogramm[1] klappt auch, nur leider ist die Ausgabe
suboptimal, das heißt die Ausgabe fängt immer vier Zeilen (statt
einer) unter dem Prompt an.

Außerdem werden Zeilen "übersprungen", wenn der Prompt am "Boden" des
Terminalfensters ist.

Wenn ich's mit clear(), move(0, 0) oder moveUp(n) wird entweder eine
Zeile zweimal überschrieben oder es passiert nichts.

Ist ansi.py (das einfache ANSI Escape-Sequenzen verwendet) buggy oder
mein simpler Code?


Thorsten

[1] Aufruf: testfunc(); benötigt ansi.py von
http://www.demonseed.net/~jp/code/ansi.py

"periodic" sorgt für die "Periode" (65(A) -> 1; 66(B) -> 2, 74(J) ->
10 ... Z(90) -> 6)

from ansi import *
from time import sleep

def testfunc():
   save()
   for ord_char in range(ord('A'), ord('Z') + 1):
        moveDown(periodic(ord_char, ord('A'), 1, 10))
        print chr(ord_char)
        sleep(1)
        restore()

def periodic(counter, counter_at_sop, sop, eop):
    """ wrap counter in range(sop, eop + 1) 
    sop = start of period; eop = end of period """
    return (counter - counter_at_sop) % (eop - sop + 1) + sop