Freie Ausgabe auf Zeilen des Displays

Ja, der Betreff ist etwas kryptisch, aber mir fiel nichts besseres ein... Ich möchte ein Skript schreiben, das auf n Zeilen ausgibt. So etwas wie... 1 8 8 8 15 2 2 9 9 9 3 3 3 10 10 4 -> 4 -> 4 --> 11 -> 11 5 5 5 12 12 6 6 6 13 13 7 7 7 14 14 ... wohlgemerkt, nicht nebeneinander, sondern "an der gleichen Stelle". Normalerweise kann ich mit "print" ja immer nur eine neue Zeile "aufmachen". Gibt so etwas wie "n DISP" (auf dem HP48) unter Python, mit dem ich wahlfrei auf Zeile n des Displays schreiben kann, oder wie ließe sich das machen? Thorsten _______________________________________________ python-de maillist - python-de@python.net http://python.net/mailman/listinfo/python-de

z.B. print '%5d %5d %5d' % (1,2,3) -aj --On Montag, 26. April 2004 14:22 Uhr +0200 Thorsten Kampe <thorsten@thorstenkampe.de> wrote:
Ja, der Betreff ist etwas kryptisch, aber mir file nichts besseres ein...
Ich möchte ein Skript schreiben, das auf n Zeilen ausgibt. So etwas wie...
1 8 8 8 15 2 2 9 9 9 3 3 3 10 10 4 -> 4 -> 4 --> 11 -> 11 5 5 5 12 12 6 6 6 13 13 7 7 7 14 14
... wohlgemerkt, nicht nebeneinander, sondern "an der gleichen Stelle". Normalerweise kann ich mit "print" ja immer nur eine neue Zeile "aufmachen".
Gibt so etwas wie "n DISP" (auf dem HP48) unter Python, mit dem ich wahlfrei auf Zeile n des Displays schreiben kann, oder wie ließe sich das machen?
Thorsten
_______________________________________________ python-de maillist - python-de@python.net http://python.net/mailman/listinfo/python-de
_______________________________________________ python-de maillist - python-de@python.net http://python.net/mailman/listinfo/python-de

* Andreas Jung (2004-04-26 14:30 +0100)
z.B.
print '%5d %5d %5d' % (1,2,3)
Hm, danke, aber das ist ja /nebeneinander/, also genau das, was ich nicht haben will. 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... Thorsten _______________________________________________ python-de maillist - python-de@python.net http://python.net/mailman/listinfo/python-de

* 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 _______________________________________________ python-de maillist - python-de@python.net http://python.net/mailman/listinfo/python-de

Thorsten Kampe wrote:
* 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
_______________________________________________ python-de maillist - python-de@python.net http://python.net/mailman/listinfo/python-de
Hallo Thorsten, das Problem mit ansi.py ist, dass die Befehle für move usw... jeweils ein print aufrufen. Das Probloem dabei ist, dass nach dem print befehl der Cursor in die nächste Zeile hüpft. Ich bin hingegangen, und habe mir nur die Escape-Sequenzen aus der ansi.py genommen, und meine Ausgabe in einem Print Statement zusammengefasst, und siehe da, es funzt. Ich persönlich nutze lieber curses, und hab mir ne eigene kleine Lib mit Befehlen wie cls() say(x,y,text) setcolor(fg,bg) usw... geschrieben. CU Marco _______________________________________________ python-de maillist - python-de@python.net http://python.net/mailman/listinfo/python-de

Thorsten Kampe wrote:
Ja, der Betreff ist etwas kryptisch, aber mir fiel nichts besseres ein...
Ich möchte ein Skript schreiben, das auf n Zeilen ausgibt. So etwas wie...
1 8 8 8 15 2 2 9 9 9 3 3 3 10 10 4 -> 4 -> 4 --> 11 -> 11 5 5 5 12 12 6 6 6 13 13 7 7 7 14 14
... wohlgemerkt, nicht nebeneinander, sondern "an der gleichen Stelle". Normalerweise kann ich mit "print" ja immer nur eine neue Zeile "aufmachen".
Gibt so etwas wie "n DISP" (auf dem HP48) unter Python, mit dem ich wahlfrei auf Zeile n des Displays schreiben kann, oder wie ließe sich das machen?
Thorsten
_______________________________________________ python-de maillist - python-de@python.net http://python.net/mailman/listinfo/python-de
Hallo Thorsten, wenn ich das richtig verstanden habe, möchtest du beim PRINT die Zeile angeben, in der die Ausgabe statt finden soll. Wenn dein Terminal ANSI unterstützt, ist das relativ einfach mit einer Escape-Sequenz zu lösen. pos_x = 5 pos_y = 10 print "\033[" + str( pos_x ) + ";" + str ( pos_y ) + "H" + "Hello World" Das kleine Beispiel gibt Hello World an Spalte 5 / Zeile 10 des Bildschirms aus. Unter Windows musst Du allerdings sicherstellen, dass die ansi.sys geladen wird, sonst geht das nicht. Es gibt auch noch Sequenzen für verschiedene Farben, Bildschirm löschen, usw... Ein gutes Beispiel ist die "ansi.py" die man ohne weiteres bei Google findet. PS: Hab auch ziemlich lange danach gesucht Ich hoffe ich konnte dir bei deinem Problem helfen, CU Marco _______________________________________________ python-de maillist - python-de@python.net http://python.net/mailman/listinfo/python-de

-----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1 Thorsten Kampe wrote: | Gibt so etwas wie "n DISP" (auf dem HP48) unter Python, mit dem ich | wahlfrei auf Zeile n des Displays schreiben kann, oder wie ließe sich | das machen? Entweder du machst einen eigenen Ausgabepuffer und überschreibst immer den ganzen Schirm neu (oder du bist ein guter Ansihacker, dann darfst du es auch elegant lösen). Oder du nimmst curses. Gruß ~ Daniel - -- nihil me cirumdat .. . .. ... . . .. . ... . .. . ... . . . pgp key @ http://files.poelzi.org/pgp.txt ED80 E53D 5269 4BB1 1E73 3A53 CBF9 A421 0A7B 003D -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.2.4 (GNU/Linux) Comment: Using GnuPG with Debian - http://enigmail.mozdev.org iD8DBQFAjRP1y/mkIQp7AD0RAlzXAJ4q6NmUPdDTrDIgSU5G+8fyVAgPlQCePRLO eiKMCoqpqkD7d+yLtLVQThw= =MtCv -----END PGP SIGNATURE----- _______________________________________________ python-de maillist - python-de@python.net http://python.net/mailman/listinfo/python-de
participants (5)
-
Andreas Jung
-
daniel.poelzleithner
-
mab
-
Marco Bartel
-
Thorsten Kampe