Wie kann man Platformübergreifen einen einfaches Terminal emulieren???
z.Z. mache ich ein einfaches char = sys.stdin.read(1) in einem separaten Thread.
Vollständige Skript: https://github.com/jedie/DragonPy/blob/ ... 09_test.py
Das Dumme: Man sieht die Zeichen die man eintippt. Doch ich würde diese gern nicht anzeigen lassen, weil es eh quasi per "echo" angezeigt wird.
btw. eine Platformübergreifende Lösung um Dinge im Terminal an einer bestimmten Stelle zu schreiben, gibt es nicht wirklich, oder?
Also z.B. sowas wie eine Aktualisierende Status-Zeile...
Terminal emulieren...
Mehrere Fragen wären da zu klären:jens hat geschrieben:Wie kann man Platformübergreifen einen einfaches Terminal emulieren???
- plattformübergreifend: Welche Plattformen soll es unterstützen?
- einfaches Terminal: Was soll es können?
- emulieren: Was alles soll emuliert werden?
Zu den Plattformen wäre zu sagen, dass z.B. Pseudoterminals POSIX spezifiziert sind und man daher auf POSIX-konformen Systemen diese Funktionalität nutzen könnte. Hat den Vorteil, dass man bei der Emulation das Verhalten des basalen Zeichengerätes nicht nachbauen müsste. Betrifft Unices wie BSD, OSX als auch Linux-Systeme. Windows kann das nicht, dort sind Terminals im Vergleich zu POSIX weniger mächtig (dumm ) und die API ist komplett verschieden.
Dein echo-Problem lässt sich relativ einfach auf beiden Systemen lösen. Wobei ich mich frage, ob Du nicht gerade auf der Suche nach dem "Grafiktreiber" für den Dragon bist. Dann wäre Deine jetzige Lösung übers Selbstzeichnen in einem Fenster vielversprechender, als Systemterminals umständlich verbiegen zu wollen. In Deinem Fenster hast Du ja alle Kontrolle über Events, Positionen etc. Damit lässt sich ein einfaches Cursor-System recht schnell realisieren.
Vllt. hab ich Deine Frage auch missverstanden.
- jens
- Python-Forum Veteran
- Beiträge: 8502
- Registriert: Dienstag 10. August 2004, 09:40
- Wohnort: duisburg
- Kontaktdaten:
Nein um eine grafische Lösung geht es hier nicht. Aber du hast recht, bei dieser habe ich per event volle Kontrolle. Das hab ich als consolen Anwendung aber nicht.
Das einzige was mir noch eingefallen ist: stdout um biegen und dann nur die Ausgabe des Emulators ausgeben. So sieht man die Eingaben vom user nicht, denke ich.
Das einzige was mir noch eingefallen ist: stdout um biegen und dann nur die Ausgabe des Emulators ausgeben. So sieht man die Eingaben vom user nicht, denke ich.
Ja klar als echte Konsolenanwendung bleibt Dir nichts anderes übrig, als diese zu verwenden. Üblicher Verdächtiger zur Terminalansteuerung wäre `urwid`, das ließe sich mit PDCurses selbst unter Windows nutzen.
Falls Du nur wenige Primitive wie Farbe- und Cursorpositionsetzen brauchst, könntest Du unter Windows das auch mit ctypes und der Win-API relativ schnell lösen.
Falls Du nur wenige Primitive wie Farbe- und Cursorpositionsetzen brauchst, könntest Du unter Windows das auch mit ctypes und der Win-API relativ schnell lösen.
- jens
- Python-Forum Veteran
- Beiträge: 8502
- Registriert: Dienstag 10. August 2004, 09:40
- Wohnort: duisburg
- Kontaktdaten:
Das hört sich mehr nach Arbeit an, als nach "fertige Lösung"
Ich hab gerade mal probiert sys.stdout und sys.stderr umzubiegen.
Das bringt es nicht. Weder unter Linux, noch unter Windows. Anscheinend werden eingaben erst nach dem ENTER nach stdin gesendet und schon vorher auf stdout ausgegeben
Ich hab gerade mal probiert sys.stdout und sys.stderr umzubiegen.
Das bringt es nicht. Weder unter Linux, noch unter Windows. Anscheinend werden eingaben erst nach dem ENTER nach stdin gesendet und schon vorher auf stdout ausgegeben
@jens: Diese beiden Dateien haben nicht wirklich etwas mit dem Terminal selbst zu tun. Die sind sozusagen die minimale, plattformübergreifende Schnittstelle für Ein- und Ausgaben, und müssen auch gar nicht mit einem Terminal verbunden sein. Da kann ja auch ein anderes Programm dranhängen, oder Dateien auf der Festplatte.
Wenn Du keine Zeilenpufferung haben möchtest, dann musst Du das Terminal von ”cooked” auf ”raw” umstellen um jeden Tastendruck zu bekommen. Wie man das macht ist bei Windows anders als bei Unix. Als nächstes ist dann die Frage wie Steuertasten im ”raw”-Modus eigentlich an das Programm gemeldet werden. Das ist dann selbst unter Unix nicht mehr einheitlich. Darum gibt es an der Stelle so etwas wie `curses` was über den Unix-Terminal-Zoo eine gemeinsame API legt. Wie jerch schon erwähnte gibt es einen Windows-Port vom `curses`-Modul. Und wenn man sich mit der API von `curses` (der Name ist wohl nicht zufällig gewählt ) nicht herumschlagen möchte, gibt es das ebenfalls von jerch erwähnte `urwid` als hübschere Schicht darüber.
Wenn Du keine Zeilenpufferung haben möchtest, dann musst Du das Terminal von ”cooked” auf ”raw” umstellen um jeden Tastendruck zu bekommen. Wie man das macht ist bei Windows anders als bei Unix. Als nächstes ist dann die Frage wie Steuertasten im ”raw”-Modus eigentlich an das Programm gemeldet werden. Das ist dann selbst unter Unix nicht mehr einheitlich. Darum gibt es an der Stelle so etwas wie `curses` was über den Unix-Terminal-Zoo eine gemeinsame API legt. Wie jerch schon erwähnte gibt es einen Windows-Port vom `curses`-Modul. Und wenn man sich mit der API von `curses` (der Name ist wohl nicht zufällig gewählt ) nicht herumschlagen möchte, gibt es das ebenfalls von jerch erwähnte `urwid` als hübschere Schicht darüber.
- jens
- Python-Forum Veteran
- Beiträge: 8502
- Registriert: Dienstag 10. August 2004, 09:40
- Wohnort: duisburg
- Kontaktdaten:
hab eine Plattform unabhängige pure Python Lösung gefunden:
http://pypi.python.org/pypi/pager
bzw.
https://bitbucket.org/techtonik/python-pager/
bzw. die Datei:
https://bitbucket.org/techtonik/python- ... p/pager.py
Im Prinzip, nur char = sys.stdin.read(1) durch char = pager.getch() ersetzten: https://github.com/jedie/DragonPy/commi ... e6b2513966
Sehr feine Sache!
pager.py soll in die Standard Bibliothek aufgenommen werden, siehe: http://bugs.python.org/issue8408
http://pypi.python.org/pypi/pager
bzw.
https://bitbucket.org/techtonik/python-pager/
bzw. die Datei:
https://bitbucket.org/techtonik/python- ... p/pager.py
Im Prinzip, nur char = sys.stdin.read(1) durch char = pager.getch() ersetzten: https://github.com/jedie/DragonPy/commi ... e6b2513966
Sehr feine Sache!
pager.py soll in die Standard Bibliothek aufgenommen werden, siehe: http://bugs.python.org/issue8408
@jens: Der Autor *wollte* das gerne in der Standardbibliothek aufgenommen haben. Und den Bug den er dazu aufgemacht hat, haben sie ihm wieder geschlossen, mit dem Hinweis, dass das ein Bug-Report nicht der passende Weg ist ein neues Modul in die Standardbibliothek zu bekommen. Das war 2010.