curses-Problem (u.a. mit Farben)

Du hast eine Idee für ein Projekt?
Antworten
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
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

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.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
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()
:?:
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

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()
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
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() 
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".
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)
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Anonymous hat geschrieben:Schlag mal bitte eine Ausnahme vor.
Ich würde die nehmen:

Code: Alles auswählen

class BadColorError(Exception):
    pass
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Antworten