curses: newwin() und letzte Zeile

Hier werden alle anderen GUI-Toolkits sowie Spezial-Toolkits wie Spiele-Engines behandelt.
Antworten
miriki66
User
Beiträge: 8
Registriert: Freitag 4. März 2022, 17:35

Moinsens!

Ist das hier der passende Bereich für curses-Fragen? Ein paar vereinzelte hatte ich hier gesehen. Wenn nicht, bitte kurzen Hinweis...

Ich versuche gerade, nach etlichen Jahren, mich mal wieder etwas mit curses zu beschäftigen. Nun wollte ich neben dem gesamten Bildschirm auch mal einzelne Bereiche mittels newwin() benutzen. Aber das haut irgendwie gar nicht so recht hin. Bislang habe ich 2 grundlegende Probleme:

( die loop() wird von main() aufgerufen und ruft seinerseits die lifetime(screen) über wrapper(lifetime) auf. )

a) Mein screen ist 32x96 Zeichen (Putty Terminal). Aber wenn ich einen Rahmen zeichnen möchte, dann krieg ich eine Fehlermeldung von addstr(), wenn ich in 31,0 schreiben möchte. Wenn ich den unteren Rand des Rahmens in 30,0 schreibe, funktioniert es, aber es bleibt eben eine freie Zeile am unteren Bildschirmrand. Von "damals" erinnere ich mich, dass ich Probleme mit dem einen Zeichen ganz rechts unten hatte, was sich auch irgendwie lösen liess. Aber dass ich die ganze Zeile nicht benutzen kann...?

b) Neben dem Problem der letzten Zeile, dass es auch in einem Window zu geben scheint, habe ich noch das Problem, dass die addstr() zwar ausgeführt, das Ergebnis aber nicht angezeigt wird. Und dabei ist's auch egal, ob ich win.refresh() oder screen.refresh() aufrufe.

Konkret versuche ich, einen "Button" darzustellen, der dann auch später vom Touch-Display gedrückt werden kann. Der obere (z.Z. aktive) Teil der Routine bewirkt nichts, keine Ausgabe der Zeichen auf dem Bildschirm. Der untere Teil, der direkt auf dem screen und nicht auf dem window schreibt, funktioniert hingegen.

Code: Alles auswählen

def newButton( y, x, h, w, t ):
    btn = curses.newwin( h + 1, w, y, x )
    frameBorder( btn, 0, 0, h, w, False )
    for i in range( 1, h - 1 ):
        for j in range( 1, w - 1 ):
            btn.addch( i, j, chr( 0x253c ))
    btn.addstr( 2, 4, t )
    btn.refresh()
    #frameBorder( screen, y, x, h, w, False )
    #for i in range( 1, h - 1 ):
    #    for j in range( 1, w - 1 ):
    #        screen.addch( y + i, x + j, chr( 0x253c ))
    #screen.addstr( y + 2, x + 4, t )
    return btn

Code: Alles auswählen

╔══════════════════════════════════════════════════════════════════════════════════════════════╗
║                                                                                              ║
║                                                                                              ║
║                                                                                              ║
║                                                                                              ║
║                                                                                              ║
║                                                                                              ║
║                                                                                              ║
║                                                                                              ║
║                                                                                              ║
║                        ┌──────────────────────────────────────────────────────────┐          ║
║                        │                                                          │          ║
║                        │                                                          │          ║
║                        │                                                          │          ║
║                        │                                                          │          ║
║                        │                                                          │          ║
║                        │                                                          │          ║
║                        │                                                          │          ║
║                        │                                                          │          ║
║                        └──────────────────────────────────────────────────────────┘          ║
║                                                                                              ║
║                                                                                              ║
║                                                                                              ║
║                                                                                              ║
║                                                                                              ║
║╔══════════════════╗                                                      ╔══════════════════╗║
║║┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼║                                                      ║┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼║║
║║┼┼┼Previous┼┼┼┼┼┼┼║                                                      ║┼┼┼Next┼┼┼┼┼┼┼┼┼┼┼║║
║║┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼║                                                      ║┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼║║
║╚══════════════════╝                                                      ╚══════════════════╝║
╚══════════════════════════════════════════════════════════════════════════════════════════════╝
Was übersehe ich da jetzt?

Michael
miriki66
User
Beiträge: 8
Registriert: Freitag 4. März 2022, 17:35

miriki66 hat geschrieben: Freitag 4. März 2022, 18:42 Was übersehe ich da jetzt?
Okay, ich hab mal neu aufgesetzt und bin dem langsam auf die Spur gekommen...

Das Problem ist das getch() in der mainloop. Darauf soll man erstmal kommen. Den entscheidenden Hinweis bekam ich durch https://stackoverflow.com/questions/364 ... in-ncurses. Es war, wie ich letztendlich eingekreist hatte, nicht so, dass nichts auf den sdtscr kam, sondern dass getch() ein refresh() macht und mir den sdtscr dadurch wieder geleert hatte. Ich hatte nur in newwin() Fenstern geschrieben.

Richtig fies: Ich hatte ja neu aufgesetzt und jetzt mal in Visual Studio ein Python Projekt gebaut. Das Ding hatte plötzlich irgendwann auch einen "leeren" stdscr und ich hab mir 'n Wolf gesucht. Und in diesem Fall war es ein ganz dödeliger Schreibfehler, der try/except gleich aussteigen liess. *grmblfx*

Also alles gut, Problem gelöst.

Michael
Antworten