curses-Problem (u.a. mit Farben)

Du hast eine Idee für ein Projekt?
Antworten
Gast

Sonntag 10. April 2005, 18:44

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
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Sonntag 10. April 2005, 19:08

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 Modvoice
Gast

Sonntag 10. April 2005, 19:58

@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
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Montag 11. April 2005, 12:34

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 Modvoice
Gast

Montag 11. April 2005, 16:22

@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

Montag 11. April 2005, 22:37

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

Dienstag 12. April 2005, 14:10

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
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Dienstag 12. April 2005, 14:23

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 Modvoice
Antworten