Seite 1 von 1

curses macht Probleme

Verfasst: Sonntag 3. Mai 2009, 18:50
von jerch
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?

Verfasst: Sonntag 3. Mai 2009, 19:00
von derdon
Benutze curses.wrapper.

Verfasst: Sonntag 3. Mai 2009, 19:12
von sma
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

Verfasst: Sonntag 3. Mai 2009, 19:21
von jerch
@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.

Verfasst: Sonntag 3. Mai 2009, 20:14
von jerch
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.

Verfasst: Montag 4. Mai 2009, 13:07
von jerch
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)?