curses.panel

Hier werden alle anderen GUI-Toolkits sowie Spezial-Toolkits wie Spiele-Engines behandelt.
Antworten
Benutzeravatar
Rebecca
User
Beiträge: 1662
Registriert: Freitag 3. Februar 2006, 12:28
Wohnort: DN, Heimat: HB
Kontaktdaten:

Ich habe mal angefangen, mich mit curses zu befassen, und langsam verzweifele ich... :(

Folgendes Programm erzeugt zwei Panels, dann wird das zweite Panel ueber das erste bewegt und dann wieder beiseite. Ich haette natuerlich gern, dass das der Inhalt des ersten Panelfensters zum Schluss wieder vollstaendig zu sehen ist, bekomme das aber nicht hin.

hide(), show() und refresh() (auf den Unterfenstern) bewirken nichts, mit panels.update_panels() sehe ich die Fensterinhalte mehrfach auf dem Bildschirm :?:

Oder muss ich den Inhalt per Hand nochmal neu in das Fenster reinmalen? Das kann doch nicht der Sinn der Sache sein?

Hier das Programm:

Code: Alles auswählen

#! /usr/bin/env python

import curses;
from curses import panel;
import time;


def init(mainwin):
    curses.curs_set(0);
    
    if curses.has_colors():
        curses.init_pair(1, curses.COLOR_WHITE, curses.COLOR_BLUE);
        curses.init_pair(2, curses.COLOR_BLACK, curses.COLOR_CYAN);
        curses.init_pair(3, curses.COLOR_BLACK, curses.COLOR_WHITE);
        
        mainwin.attrset(curses.color_pair(1));
        mainwin.bkgdset(' ', curses.color_pair(1)); 
        mainwin.clear();

######################################################################
def main(mainwin):

    init(mainwin);
    mainwin.refresh();
    
    #Ein Panel:
    win = mainwin.subwin(3, 15, 4, 4);
    win.attrset(curses.color_pair(2));
    win.bkgdset(' ', curses.color_pair(2));
    win.clear();
    win.addstr("Alle Voeglein sind schon da,");
    win.refresh();    
    panel1 = panel.new_panel(win);
    
    #Noch ein Panel:
    win = mainwin.subwin(3, 15, 4, 20);
    win.bkgdset(' ', curses.color_pair(3));
    win.attrset(curses.color_pair(3));
    win.clear();
    win.refresh();    
    panel2 = panel.new_panel(win);

    mainwin.refresh();
    time.sleep(1);

    #Ins zweite Panel was reinschreiben:
    panel2.window().addstr("alle Voeglein, alle! ");
    panel2.window().refresh();
    mainwin.refresh();
    time.sleep(1);

    #Zweites Panel bewegen:
    panel2.move(5, 15);
    mainwin.refresh();
    time.sleep(1);
   
    #Zweites Panel bewegen:
    panel2.move(6, 20);
    mainwin.refresh();
    time.sleep(1);


######################################################################
# Hauptprogramm                                                      #
######################################################################

curses.wrapper(main);
modelnine
User
Beiträge: 670
Registriert: Sonntag 15. Januar 2006, 18:42
Wohnort: Celle
Kontaktdaten:

Oder muss ich den Inhalt per Hand nochmal neu in das Fenster reinmalen?
Ja, musst Du. Das ist aber bei allen GUI-Toolkits so der Standard, denn stets wenn ein Fenster über einem anderen wegbewegt wird wird das Fenster was jetzt mehr zum Vorschein gekommen ist gefragt sich neu zu zeichnen (zum Beispiel unter Windows mittels der Window-Message WM_PAINT, unter X läufts ganz ähnlich).

Es gibt also kein Caching des Inhalts, und Curses macht das genausowenig. Du mußt also im Endeffekt die Inhalte der Fenster neu zeichnen, am besten machst Du dazu für die beiden Panels jeweils eine eigene Klasse die eine .draw() Methode hat um das Panel neu zu zeichnen wenn sich die Geometrie geändert hat.

Ganz davon abgesehen: es sieht nicht nur doof aus dass Du am Ende jeder Zeile ein Semikolon setzt, sondern es ist auch absolut und völlig unnötig. Wer Python programmiert sollte sich dieses Zeichen abgewöhnen. ;-)
--- Heiko.
Benutzeravatar
Rebecca
User
Beiträge: 1662
Registriert: Freitag 3. Februar 2006, 12:28
Wohnort: DN, Heimat: HB
Kontaktdaten:

Ach menno, ich bin wohl zu sehr durch Java Swing-Komponenten verwoeht. Obwohl, jetzt wo du's sagst, erinnere ich mich daran, dass die Java-Fenster auch eine paint-Funktion haben, die man ueberschreibt, wenn man direkt ins Fenster reinzeichnet.

Mmh, diese Window-Objekte und Panel-Objekte scheinen nicht Instanzen von Klassen zu sein, von denen man erben kann?
modelnine hat geschrieben:Ganz davon abgesehen: es sieht nicht nur doof aus dass Du am Ende jeder Zeile ein Semikolon setzt, sondern es ist auch absolut und völlig unnötig. Wer Python programmiert sollte sich dieses Zeichen abgewöhnen. ;-)
Hab ich versucht. Mit dem Effekt, dass ich, wenn ich dann Java und C programmiere, die Semikolons staendig vergesse, und wenn ich dann wieder Python programmiere, sie eh wieder zu oft mache. Also bin ich lieber konsequent und mache immer welche, dann bin ich auf dauer schneller. :) (Hat mir schon gereicht, dass ich letztens dauernd vergessen habe, mein C-Programm vorm Ausfuehren zu comilieren.)
Und ICH finde sowieso, dass Zeilen ohne Semikolon irgendwie nackt aussehen...
modelnine
User
Beiträge: 670
Registriert: Sonntag 15. Januar 2006, 18:42
Wohnort: Celle
Kontaktdaten:

Mmh, diese Window-Objekte und Panel-Objekte scheinen nicht Instanzen von Klassen zu sein, von denen man erben kann?
Nein, leider nicht... Wie wärs wenn Du ein Framework benutzt um die Programmierung zu machen, genau wie Du eben mittels wxPython o.Ä. hättest? Ich persönlich hab zwar noch nicht viel damit gemacht, aber es sieht ziemlich geil aus und ist auch toll zu benutzen:

http://excess.org/urwid/

Guck Dir das mal an!
--- Heiko.
Benutzeravatar
Rebecca
User
Beiträge: 1662
Registriert: Freitag 3. Februar 2006, 12:28
Wohnort: DN, Heimat: HB
Kontaktdaten:

Oh, und ein Tutorial giebt es auch! Das werde ich mir morgen mal ansehen. Danke! :)
henning
User
Beiträge: 274
Registriert: Dienstag 26. Juli 2005, 18:37

(Hat mir schon gereicht, dass ich letztens dauernd vergessen habe, mein C-Programm vorm Ausfuehren zu comilieren.)
Und ICH finde sowieso, dass Zeilen ohne Semikolon irgendwie nackt aussehen...
Vielleicht wäre der "Tiny C Compiler" (tcc) dann was für dich.
Der ist so verdammt schnell im compilen, dass du
#!/usr/bin/tcc am Anfang deines C-Codes schreiben und ihn so direkt ausführen kannst. Nachteil: Das Ding hat natürlich nicht alle Features von gcc, ist aber iirc ANSI-C-kompatibel.
Antworten