2011-08-15 20 views
10

Poniższy program zgłosi błąd:ostatni znak z okna w python + przeklina

import curses 

def test(scr): 
    top = curses.newwin(1, 10, 0, 0) 
    top.addstr(0, 9, "X") 

curses.wrapper(test) 

Wygląda na to, kiedy próbuję użyć addstr(), aby napisać znak w ostatniej kolumnie ostatniej linii okno (nawet jeśli jest mniejsze niż ekran), powoduje błąd. Nie chcę przewijać, nie dbam o pozycję kursora. Wszystko czego chcę, to móc pisać postacie w każdej pozycji okna. Czy to w ogóle możliwe? Jak mogę to zrobić?

+0

Powiązane: http://stackoverflow.com/questions/10877469 – augurar

Odpowiedz

9

Wygląda na to, że pisanie ostatniego znaku okna z przekleństwami jest niemożliwe z przyczyn historycznych.

Jedyne obejście, jakie mogłem znaleźć, polega na napisaniu znaku w jednym miejscu na lewo od miejsca docelowego i naciśnięciu go. Poniższy kod będzie apelować „X” do pozycji 9:

top = curses.newwin(1, 10, 0, 0) 
top.addstr(0, 8, "X") 
top.insstr(0, 8, " ") 
6

Okazuje się, że faktycznie robi curses skończyć pisanie do tej ostatniej pozycji: to właśnie powoduje błąd tuż po jej zakończeniu.

Tak więc, jeśli można żyć z następującym hack/niewykwitność:

#! /usr/bin/env python 
import curses 

def test(scr): 
    top = curses.newwin(1, 10, 0, 0) 
    try: 
     top.addstr(0, 9, "X") 
    except curses.error: 
     pass 

curses.wrapper(test) 

czyli wychwytywanie i ignorowanie błędu, wtedy kod będzie znacznie prostsze zarówno w zakresie projektowania i realizacji.

+0

Podoba mi się to podejście. To naprawdę nie jest czyste, ale oto jak sobie z tym poradziłem: owijam okna (których klasa jest niejasna) wewnątrz klasy "BaseWindow", gdzie definiuję wszystkie moje metody. Ta klasa rozwiązuje nazwy metod okien, takie jak 'addstr', implementując' __getattr__', które z kolei zwrócą atrybut rzeczywistego okna. Zaadaptowałem to podejście do metody 'addstr': moje' BaseWindow' teraz definiuje własną metodę 'addstr', która próbuje i wywołuje metodę' addstr' aktualnego okna i cicho przekazuje każdy wyjątek 'curses.error'. –

Powiązane problemy