Seite 1 von 1

Curses-Programm stürzt beim Maximieren ab

Verfasst: Mittwoch 23. Dezember 2009, 08:43
von snafu
Ich möchte mal `less` in Python mit Hilfe von [mod]curses[/mod] implementieren. `less` bekommt es hin, bei Veränderung der Terminal-Maße (z.B. Vergrößerung des Emulator-Fensters), eine vormals umgebrochene Zeile neu auszurichten. Wenn also genug Platz da ist, wird alles in eine Zeile gesteckt. Mein Programm hingegen stürzt einfach nur ab. Woran kann es liegen bzw was sollte ich ändern?

Der Code ist noch recht dürftig:

Code: Alles auswählen

from contextlib import closing
import curses
import sys
from time import sleep


class ScrollableScreen(object):

    def __init__(self, s=''):
        self.screen = curses.initscr()
        curses.curs_set(0)
        self.screen.immedok(True)
        self.screen.scrollok(True)
        self.add_string(s)

    def add_string(self, s):
        self.screen.addstr(s)

    def close(self):
        curses.endwin()

def main():
    with closing(ScrollableScreen()) as screen:
        screen.add_string(sys.stdin.read())
        sleep(10)

if __name__ == '__main__':
    main()
EDIT: "Abstürzen" heißt, dass sich das Programm ohne Meldung beendet.
EDIT2: Wieso springt die Ausgabe (z.B. von `ls -l`) eigentlich bis zum Ende?

Verfasst: Mittwoch 23. Dezember 2009, 11:36
von sma
Kurzes Googlen sagt, dass ein SIGWINCH Signal meldet, wenn sich die Terminalgröße ändert. Das könnte man abfangen und darauf reagieren. Siehe http://invisible-island.net/ncurses/ncurses-intro.html. Allerdings hat Google auch dies hier gefunden: http://bugs.python.org/issue3948 und http://bugs.python.org/issue3949, sodass das vielleicht gar nicht unter Python funktioniert.

Stefan

Verfasst: Mittwoch 23. Dezember 2009, 21:50
von snafu
Sieht wirklich nicht so gut aus. Das werd ich wohl ctypes bemühen müssen... Danke aber für die Mühe.