curses macht Probleme

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
jerch
User
Beiträge: 1669
Registriert: Mittwoch 4. März 2009, 14:19

Folgendes Problem habe ich mit curses:

Wenn ich innerhalb eines Skriptes curses ein 2. Mal initialisiere, zerschießt es mir komplett das Terminal.
Beispielcode:

Code: Alles auswählen

import curses

# erstes Mal
scr = curses.initscr()
scr.addstr("Hallo Welt!")
scr.refresh()
scr.getch()
scr.clear()
curses.endwin()

# zweites Mal
scr2 = curses.initscr()
scr2.addstr("Hallo Welt!")
scr2.refresh()
scr2.getch()
curses.endwin()
In C ist es dagegen kein Problem:

Code: Alles auswählen

#include <ncurses.h>
int main()
{
    // erstes Mal
    initscr();
    printw("Hallo Welt!");
    refresh();
    getch();
    clear();
    endwin();
    
    // zweites Mal
    initscr();
    printw("Hallo Welt!");
    refresh();
    getch();
    endwin();
    
    return 0;
}
Weiß jemand Rat, oder noch besser einen Workaround für das Problem?
derdon
User
Beiträge: 1316
Registriert: Freitag 24. Oktober 2008, 14:32

Benutze curses.wrapper.
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

Kann ich bestätigen. Weiß auch nicht, was da passiert. Als Workaround fällt mir nur ein, am Ende des Programms noch mal ein `import os; os.system("reset")` auszuführen, um das Terminal wieder gangbar zu machen...

Stefan
jerch
User
Beiträge: 1669
Registriert: Mittwoch 4. März 2009, 14:19

@derdon:
Hatte ich auch schon probiert, fördert leider Selbiges Verhalten zutage. :(

@sma:
Das reset hab ich auch grad drin, allerdings mehr als einmal, da ich auch "ordnungsgemäße" Zwischenoutputs brauche. Wirklich schön ist es so nicht, aber funktioniert erstmal.

Danke euch beiden.
jerch
User
Beiträge: 1669
Registriert: Mittwoch 4. März 2009, 14:19

Hab noch einen anderen Workaround gefunden mit ctypes. Für das obige einfache Bsp. funktioniert es ohne Probleme, wie es um die aufwändigeren Zeichenfunktionen steht weiß ich noch nicht.

Wahrscheinlich müßte das Python-Modul mal überarbeitet werden, zumal ncurses in c so "einfach" gehalten ist.
jerch
User
Beiträge: 1669
Registriert: Mittwoch 4. März 2009, 14:19

Update:
Mit ctypes und "libncursesw.so" konnte ich das Problem umschiffen. Allerdings brauche ich in den curses-Skriptteilen nur printw() zum Ausgeben von Statuslogs. Diesen konnte ich via "import as" und ein paar Mappings das ctypes-Binding unterschieben. Alles andere als schön, aber erstmal praktikabel. (Und gänzlich unbrauchbar für die komplexeren curses-Funktionen.)

Zu dem curses-Modul hätte ich da noch die Frage: Is it a feature or a bug? Zumindest konnte ich nichts in den Docs diesbezüglich finden, daher der Bugverdacht. Ist das in Python 3 vllt. gelöst?

Und was ist eigentlich mit getch()? Den ersten Bytestring-Char auszugeben ist doch in einer Unicode-Welt eher fragwürdig. Oder ist die Funktion so definiert (das Terminal sieht ja nur die kodierten Zeichen)?
Antworten