npyscreen: Eingabe von Umlauten in Windows-Konsole

Hier werden alle anderen GUI-Toolkits sowie Spezial-Toolkits wie Spiele-Engines behandelt.
Antworten
Benutzeravatar
snafu
User
Beiträge: 6738
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Hallo!

Ich nutze npyscreen unter Windows 11 und Python 3.10 in Verbindung mit windows-curses. Generell zeigen sowohl die cmd.exe als auch die PowerShell problemlos Umlaute an und erlauben ebenso auch deren Eingabe. Wenn ich aber eine npyscreen App starte und er somit in die Curses-Umgebung wechselt, dann klappt zwar weiterhin die Anzeige der Umlaute, nicht jedoch deren Eingabe. Bei letzterem wird einfach nichts angezeigt, wenn ich zB ein "ä" eingebe und der Cursor springt auch nicht weiter.

Da Windows ja seit einiger Zeit auch das Installieren von Linux-Gastsystemen via WSL2 erlaubt, habe ich genau das mal getan und eine Ubuntu-Umgebung aufgesetzt (20.04 LTS). Hier verhält es sich bei den Eingaben wie gewünscht: Ich kann problemlos Umlaute bzw nicht-ASCII-Zeichen in mein npyscreen-Formular eintragen.

Das Problem ist wahrscheinlich etwas exotisch, aber ich hoffe trotzdem, dass irgendwer helfen kann. Die Frage ist ja auch, ob das eine Sache von npyscreen ist (da wurde recht spät der UTF-8 Support nachgerüstet) oder ob windows-curses die betreffenden Eingaben nicht unterstützt. Ich jedenfalls bin mit meinem Latein am Ende.

Hier noch der (triviale) Code zum Problem (die Umlaute sind zum Testen gedacht):

Code: Alles auswählen

#!/usr/bin/env python3
import npyscreen

class TestApp(npyscreen.NPSApp):
    def main(self):
        form = npyscreen.ActionForm(name="Create new äccount")
        owner = form.add(npyscreen.TitleText, name="Owner:")
        address = form.add(npyscreen.TitleText, name="Äddress:")
        iban = form.add(npyscreen.TitleText, name="IBAN:")
        credit = form.add(npyscreen.TitleText, name="Credit:")

        form.edit()
        print(owner.value)


def main():
    TestApp().run()

if __name__ == "__main__":
    main()
Benutzeravatar
snafu
User
Beiträge: 6738
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Das Problem liegt sehr wahrscheinlich in der _get_ch()-Methode der Textfield-Klasse, die intern zum Lesen von Eingaben benutzt wird. Darin ist sogar ansatzweise die Nutzung von get_wch() zum Erhalten von Unicode-Input erwähnt, allerdings auskommentiert (s. https://github.com/npcole/npyscreen/blo ... et.py#L475).

Schade dass das Projekt nicht mehr betreut wird. Ich werde mal versuchen, das selber entsprechend zu patchen. In einem Minimal-Beispiel klappt die Nutzung von get_wch(), was ja aus der Curses-API stammt, schon mal wie erwartet in der Windows-Konsole.

EDIT: Genauer gesagt wird _get_ch() in der Widget-Basisklasse definiert. Über Textfield bin ich aber halt darauf gestoßen. Ist ja auch im Endeffekt egal.
Benutzeravatar
snafu
User
Beiträge: 6738
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Okay, das hat leider nicht geklappt. Die Umlaute können zwar eingegeben werden, wenn ich die getch()-Aufrufe durch get_wch() ersetze, aber der Cursor bewegt sich anschließend nicht mehr korrekt. Dass es grundsätzlich möglich ist, zeigt das Beispiel von https://github.com/microsoft/vscode/iss ... -945457018. Das Problem, was dort beschrieben wird, bezieht sich nur auf das VS Code Terminal. In einem "normalen" Konsolenfenster funktioniert das Programm wie gewünscht.

So ein paar Abfragen lassen sich ja scheinbar doch mit halbwegs überschaubarem Aufwand direkt in curses realisieren. Ich schwanke gerade zwischen selber schreiben, von dem was ich brauche oder npyscreen anzupassen. Letzteres sieht halt schicker aus, aber der Code dahinter ist wie gesagt von keinem besonders guten Python-Programmierer erstellt worden und das nervt.
Antworten