Seite 1 von 1

curses-Problem (u.a. mit Farben)

Verfasst: Sonntag 10. April 2005, 18:44
von Gast
Hallo

Ich hab bisher nur Pascal in den Händen gehabt :lol: und da gab es die crt-Unit.
Bei python muß man sich mit print zufriedengeben oder sich mit curses anfreunden.
Ich wollte eigentlich nur eine Procedure haben was einen Text in Farbe an eine bestimmte Position schreibt.
Die curses-Beispielprogramme laufen ja wohl in einer Schleife(curses.wrapper(def)) was ich nicht will.
Ich wollte es so haben(funktioniert nicht):

Code: Alles auswählen

import curses

class crt:
    def __init__(self):
        self.screen = curses.initscr() 
        curses.start_color()
        curses.nonl()
        curses.noecho()
        curses.cbreak()
    def outtext(self,s,x,y,fgCol,bgCol):
        if curses.has_colors():
            curses.init_pair(1, fgCol, bgCol)
            self.screen.attrset(1)
        self.screen.addstr(y,x,s)
    def clear(self):
        self.win.clear()
    def free(self):
        curses.nocbreak()
        curses.echo()
        curses.endwin()
Was mache ich falsch?
Ich hab jetzt lang genug rumprobiert.... :cry:

Danke für jede Hilfe

Verfasst: Sonntag 10. April 2005, 19:08
von Leonidas
Hier ein kurzes Beispiel:

Code: Alles auswählen

#!/usr/bin/env python

import curses

screen = curses.initscr()
curses.start_color()
curses.init_pair(1, curses.COLOR_RED, curses.COLOR_WHITE)
screen.addstr(0, 0, "Balbal", curses.color_pair(1))
screen.refresh()
curses.endwin()
Curses Programming in Python ist schon eine ganz nette Doku.

Farbprobleme

Verfasst: Sonntag 10. April 2005, 19:58
von Gast
@Leonidas

Danke (diese Doku hatte ich auch schon in den Händen...)

Wenn ich jetzt dein Programm erweiter und die Farben tausche, dann wird nichts geändert, das erste Farbenpaar wird weiter genommen, auch mit attroff/on.

Code: Alles auswählen

import curses,time

screen = curses.initscr()
curses.start_color()
curses.init_pair(1, curses.COLOR_RED, curses.COLOR_WHITE) #red/white
screen.addstr(0, 0, "Balbal 1", curses.color_pair(1))
screen.refresh()
screen.attroff(curses.color_pair(1))
curses.init_pair(1, curses.COLOR_WHITE, curses.COLOR_RED) #white/red
screen.addstr(10, 10, "Balbal 2", curses.color_pair(1))
screen.attron(curses.color_pair(1))
screen.refresh()
time.sleep(3)
curses.endwin()
:?:

Verfasst: Montag 11. April 2005, 12:34
von Leonidas
Nein, es wird das zweite Farbenpaar genommen. Dies ist insofern ein Unterschied, als dass die Farben sozusagen "nachträglich" geändert werden. Du kannst einfach ein zweites Paar anlegen. Wenn du jetzt Paar 1 auf grün setzt, werden alle Texte die auf das Paar 1 zeigen, grün.

Code: Alles auswählen

#!/usr/bin/env python

import curses

screen = curses.initscr()
curses.start_color()
curses.init_pair(1, curses.COLOR_RED, curses.COLOR_WHITE) #red/white
screen.addstr(0, 0, "Balbal 1", curses.color_pair(1))
screen.refresh()
curses.init_pair(2, curses.COLOR_WHITE, curses.COLOR_RED) #white/red
screen.addstr(10, 10, "Balbal 2", curses.color_pair(2))
screen.attron(curses.color_pair(1))
screen.refresh()
curses.endwin()

alle curses-Farbpaare setzen

Verfasst: Montag 11. April 2005, 16:22
von Gast
@Leonidas

Nochmal danke.
Ich komm wohl nicht drumrum jedes mögliche Farbpaar(8*8 ) zu setzen.
Hab ich hier gemacht, scheint jetzt echt zu klappen :)

Code: Alles auswählen

import curses

class crt:
    def __init__(self):
        self.screen = curses.initscr() 
        curses.start_color()
        for bg in range(8):       # alle moeglichen Farb-Paare(64-1) setzen
            for fg in range(8):
                if bg+fg > 0:        # Farb-Paar 0 wird von curses gesetzt
                    curses.init_pair((bg*8)+fg, fg, bg)                
        curses.nonl()
        curses.noecho()
        curses.cbreak()
    def outtext(self,s,x,y,fgCol,bgCol):
        if fgCol < 0: fgCol = 0  # unschön
        if fgCol > 7: fgCol = 7
        if bgCol < 0: bgCol = 0
        if bgCol > 7: bgCol = 7
        self.screen.addstr(y, x, s, curses.color_pair((bgCol*8)+fgCol))
        self.screen.refresh()
    def clear(self):
        self.screen.clear()
    def free(self):
        curses.nocbreak()
        curses.echo()
        curses.endwin() 

Verfasst: Montag 11. April 2005, 22:37
von BlackJack
Was findest Du denn an dem Quelltext unschön, wo der entsprechende Kommentar dransteht? Vielleicht wäre eine Ausnahme besser als still und heimlich die Parameter zu "korrigieren".

Verfasst: Dienstag 12. April 2005, 14:10
von Gast
Was findest Du denn an dem Quelltext unschön, wo der entsprechende Kommentar dransteht? Vielleicht wäre eine Ausnahme besser als still und heimlich die Parameter zu "korrigieren"
Schlag mal bitte eine Ausnahme vor.
Mir gefiel das auch nicht, aber da es nur Farben von 0..7 gibt und auch nur Farbpaare von 0..63(mehr sind auch nicht erlaubt)

Verfasst: Dienstag 12. April 2005, 14:23
von Leonidas
Anonymous hat geschrieben:Schlag mal bitte eine Ausnahme vor.
Ich würde die nehmen:

Code: Alles auswählen

class BadColorError(Exception):
    pass