Seite 1 von 1

Wie schalte ich unter curses das textpad ein?

Verfasst: Donnerstag 24. August 2006, 23:08
von ainulindale
Hallo,

entschuldigt bitte, wenn Euch mein Neulingsgeschreibsel die Tränen in die Augen treibt.

Ich habe gerade angefangen mit Python zu programmieren und wollte zum Üben ein Programm mit einer curses-Oberfläche schreiben.

Bis jetzt habe ich erfolgreich das curses-modul eingebunden und gestartet sowie ein kleines Programm (ab)geschrieben, das die jeweils gedrückte Taste ausgibt. Jetzt wollte ich noch eine Textbox aufrufen, in der man Text eingeben kann. Allerdings kriege ich das nicht auf die Reihe. Ich habe auch noch nie objekt-orientiert Programmiert und finde das Konzept zumindest befremdlich.

Der Anfang des Programms bindet die benötigten Module ein:

Code: Alles auswählen

#! /usr/bin/python
# Filename : caries1.py

# Das curses-modul zur Verfuegung stellen
import curses

# Spaeter mal ausprobieren
# import curses.wrapper
import curses.textpad
...
neues_fenster = curses.newwin(12, 5)
ganztoll = Textbox(neues_fenster)
ergibt dann die Fehlermeldung

Code: Alles auswählen

ganztoll = Textpad(neues_fenster)
NameError: name 'Textpad' is not defined
Dabei müßte die Klasse doch bereits definiert sein? In der Anleitung zu curses.textpad steht:
The curses.textbox class provides a Textbox class...
Also gibt es die Klasse doch schon! Der Aufruf der Textbox ein paar Zeilen weiter unten wirft mich dann total aus der Bahn
You can instantiate a Textbox object as follows...

Code: Alles auswählen

class Textbox{win}
Ich dachte so wird eine noch nicht bestehende Klasse definiert.

Hat jemand vielleicht ein Anwendungsbeispiel zur Textbox - ich finde die Doku für einen Objektmuffel mehr als kryptisch.

Vielen Dank!

Ainulindale

Verfasst: Freitag 25. August 2006, 09:54
von BlackJack
Du hast nur das Modul importiert und zwar unter dem Namen `curses.textpad`. Die `Textbox` Klasse ist in diesem Modul definiert. Also musst Du entweder mit `curses.textpad.Textbox` darauf zugreifen, oder den Namen `Textbox` in Dein Modul importieren:

Code: Alles auswählen

from curses.textpad import Textbox
Jetzt ist der Name `Textbox` auch in Deinem Modul bekannt.

Danke! Hab's verstanden!

Verfasst: Freitag 25. August 2006, 14:21
von ainulindale
Folgendes funktioniert nun:

Code: Alles auswählen

neues_fenster = curses.newwin(4, 20, 10, 10)

ganztoll = curses.textpad.Textbox(neues_fenster)
ganztoll.edit()
Allerdings kann ich keine Umlaute schreiben und es gibt scheinbar nur einen Überschreibungsmodus. Die Entfernen-Taste funktioniert ebenfalls nicht.

Tatsächlich scheine ich sogar einen Bug gefunden zu haben. Wenn ich am Beginn einer anderen als der ersten Zeile "Backspace" drücke, der Cursor also das Zeichen am äußersten linken Rand löschen und eine Zeile hochrücken müßte, bekomme ich folgende Fehlermeldung:

Code: Alles auswählen

File "caries1.py", line 56, in ?
ganztoll.edit()
File "/usr/lib/python2.4/curses/textpad.py", line 157, in edit
if not self.do_command(ch):
File "/usr/lib/python2.4/curses/textpad.py", line 84, in do_command
self.win.move(y-1, self._end_of_line(y-1))
_curses.error: wmove() returned ERR
Dies passiert aber nur, wenn ich die erste Zeile durschreibe, der Umbruch also automatisch erfolgt. Wenn ich hingegen nach ein paar Buchstaben "Return" drücke, funktioniert die Backspace-Taste wie gewohnt, löscht also die gesamte zweite Zeile und springt dann in die erste.

Alles in allem kommt da glaube ich viiiel Arbeit auf mich zu, bis die Eingabe "wie üblich" funktioniert. Die Eingabe per se läuft ja schon.

Ich habe nun zusätzlich eine Auswertungsfunktion eingefügt. Die macht im Moment noch nicht richtig viel, aber so wie es ausschaut muß man den ganzen Eingabevorgang über diese Auswertungsfuntion lenken, damit man die o.g. Probleme umgehen kann.

Code: Alles auswählen

def auswertung(taste):
  letter_pressed = chr(taste)
  neues_fenster.addstr(3, 3, letter_pressed)

neues_fenster = curses.newwin(4, 20, 10, 10)

ganztoll = curses.textpad.Textbox(neues_fenster)
ganztoll.edit(auswertung)
Das spuckt schon mal den gedrückten Buchstaben im Eingabefenster aus. Bis ich allerdings die gesamte Eingabe über die Auswertungsfunktion laufen habe, bin ich alt und grau.

Gibt es noch eine andere Möglichkeit die Probleme zu lösen oder muß ich jetzt einfach tapfer sein?

Ainulindale

Verfasst: Freitag 25. August 2006, 14:50
von BlackJack
Vielleicht solltest Du mal einen Blick auf urwid werfen.

Wow...

Verfasst: Samstag 26. August 2006, 17:14
von ainulindale
Wenn das hält, was es verspricht, dann muß man ja fast nichts mehr selber machen :D

Automatisches resizing, utf-8 ... bin immer noch hin und weg.

Der einzige Nachteil ist wohl, daß es nur auf Linux-Systemen läuft. Da auf meiner Kiste ubuntu installiert ist und ich nichts für andere schreiben muß, nehme ich diese Einschränkung aber gerne in Kauf!

Danke für den Tipp!

Ainulindale

- der sich nun in ein neues Paket einarbeiten darf

Verfasst: Samstag 26. August 2006, 17:23
von Joghurt
curses läuft doch auch nur unter Unix, oder nicht?

Verfasst: Samstag 26. August 2006, 20:25
von Rebecca
urwid laeuft ueberall dort, wo es (n)curses gibt. Und es gibt sogar curses-Implementierungen fuer Windows.
Urwid Mailing List hat geschrieben:Urwid can be made to run on windows a number of ways:

You can run Urwid under cygwin:
http://www.cygwin.com
(using either the curses_display or raw_display modules)
This works with window resizing with the xterm that comes with cygwin,
but it will work with cygwin's regular terminal.

Or you can install cursesw:
http://adamv.com/dev/python/curses/
(using the curses_display module only)

Or you can use pdcurses:
http://pdcurses.sourceforge.net/
Ich persoenlich habs aber nur unter cygwin getestet -- laeuft prima.

Verfasst: Samstag 26. August 2006, 22:09
von ainulindale
Ncurses läuft nur unter Linux. Das Python-modul "curses" ist laut der python-library wohl in erster Linie auf ncurses ausgerichtet:
While curses is most widely used in the Unix environment, versions are available for DOS, OS/2, and possibly other systems as well. This extension module is designed to match the API of ncurses, an open-source curses library hosted on Linux and the BSD variants of Unix.
Gut zu wissen, daß urwid auch unter den anderen curses-Versionen funktionert - da kann ich mir das herumexperimentieren mit dem curses-modul nun endgültig sparen und mich ganz auf urwid stürzen.

Ainulindale

PS: Cygwin wollte ich schon immer mal auf dem Rechner meines kleinen Bruders installieren, um mich dort wenigstens ein bißchen heimisch zu fühlen.