curses-Problem (u.a. mit Farben)

Du hast eine Idee für ein Projekt?
Gast

curses-Problem (u.a. mit Farben)

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

Beitragvon Leonidas » 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

Farbprobleme

Beitragvon 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()


:?:
Benutzeravatar
Leonidas
Administrator
Beiträge: 16023
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Beitragvon Leonidas » 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

alle curses-Farbpaare setzen

Beitragvon 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

Beitragvon 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

Beitragvon 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)
Benutzeravatar
Leonidas
Administrator
Beiträge: 16023
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Beitragvon Leonidas » 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

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder