Farbe von Widgets

Programmierung für GNOME und GTK+, GUI-Erstellung mit Glade.
mawe
Python-Forum Veteran
Beiträge: 1209
Registriert: Montag 29. September 2003, 17:18
Wohnort: Purkersdorf (bei Wien [Austria])

Hi!

Geschafft! Nach stundenlagem Fluchen und Haareraufen (meine Frisur sieht jetzt so ähnlich aus wie die von meinem Avatar :D), weiß ich endlich wie man den Hintergrund eines Buttons einfärbt:

Code: Alles auswählen

import pygtk
pygtk.require('2.0')
import gtk

class ColoredButton:
    def __init__(self):
        self.root = gtk.Window(gtk.WINDOW_TOPLEVEL)
        self.root.connect("destroy", lambda w: gtk.main_quit())
        self.root.set_border_width(10)
       
        button = gtk.Button("Color! Juhuu!!!")
                
        style = button.get_style()
        color = button.get_colormap()
        bg = color.alloc_color("red")
        style.bg[gtk.STATE_NORMAL] = bg
        button.set_style(style)

        self.root.add(button)
        button.show()
        
        self.root.show()
        gtk.main()

ColoredButton()
Keine Ahnung ob's auch besser/einfacher geht. Ich bin jetzt mal zufrieden :wink:

Gruß, mawe
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

mawe hat geschrieben:Keine Ahnung ob's auch besser/einfacher geht. Ich bin jetzt mal zufrieden :wink:
Wäre ich auch. Fast:

Code: Alles auswählen

        style.bg[gtk.STATE_PRELIGHT] = bg
        style.bg[gtk.STATE_ACTIVE] = bg
Würde ich noch einsetzen, damit der Button auch beim Hover und Eingedrückt Rot bleibt.

Cooler Code, nutzt tatsächlich gtk.Buttons :)
Eindeutig ein Kandidat für den Snippetsindex!
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

Hi nochmal,

hier Mawes Colorbutton in einer von gtk.Button abgeleiteten Klasse:

Code: Alles auswählen

class ColoredButton(gtk.Button):
    def __init__(self, label=None, stock=None, use_underline=True,
                 fg="black", bg="gray90",
                 states=(gtk.STATE_NORMAL,
                         gtk.STATE_PRELIGHT,
                         gtk.STATE_ACTIVE)):
        super(ColoredButton, self).__init__(label, stock, use_underline)
        st = self.get_style()
        cm = self.get_colormap()
        fgc = cm.alloc_color(fg)
        bgc = cm.alloc_color(bg)
        for state in states:
            st.fg[state] = fgc
            st.bg[state] = bgc
        self.set_style(st)
        self.child.set_use_markup(True)

Gruß

Dookie
[code]#!/usr/bin/env python
import this[/code]
mawe
Python-Forum Veteran
Beiträge: 1209
Registriert: Montag 29. September 2003, 17:18
Wohnort: Purkersdorf (bei Wien [Austria])

Hi!

Bevor ich mir noch die letzten Haare ausreisse, frag ich lieber gleich :)

Hier mal der Code:

Code: Alles auswählen

import pygtk
pygtk.require('2.0')
import gtk

class ColoredButton(gtk.Button):
    def __init__(self, label=None, stock=None, use_underline=True,
                states=(gtk.STATE_NORMAL, gtk.STATE_PRELIGHT, gtk.STATE_ACTIVE)):
        super(ColoredButton, self).__init__(label, stock, use_underline)
        self.states = states
        self.label = label
        self.st = self.get_style()
        self.cm = self.get_colormap()
      
        self.connect("clicked", self.click)
      
    def click(self,event):
        print self.label
      
    def set_bg_color(self, bg):
        bgc = self.cm.alloc_color(bg) 
        for state in self.states:
            self.st.bg[state] = bgc
        self.set_style(self.st)
        self.child.set_use_markup(True)


elements = ["H","C"]

root = gtk.Window(gtk.WINDOW_TOPLEVEL)
root.connect("destroy", lambda w: gtk.main_quit())

table = gtk.Table(1,2,gtk.TRUE)
root.add(table)

c,r = 0,0
for atom in elements:
    button = ColoredButton(label=atom)
    if atom == "H":
        button.set_bg_color("red")
    else:
        button.set_bg_color("blue")

    table.attach(button,c,c+1,r,r+1)
    button.show()
    c+=1
table.show()
root.show()
gtk.main()
Wie man sehen kann, will ich den H-Button rot, und den He-Button blau hinterlegen. Beide sind aber blau. Was mach ich da falsch? Hilfe!

Noch etwas zum Einfärben: Das Ändern der fg-Farbe bewirkt anscheinend etwas anderes als ich erwartet hatte (hab gedacht das ist die Textfarbe). Muss ich für die Textfarbe wieder auf pango zurückgreifen? Und was ist überhaupt dieses fg?

Gruß, mawe
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

Der Style gilt wohl für alle Buttons, also am besten mit einer Kopie arbeiten.
In der __init__ vom ColoredButton:

Code: Alles auswählen

        self.st = self.get_style().copy()
Dann gehts.

Die Fordergrundfarbe musst du im Label (button.child) ändern.

Code: Alles auswählen

    def set_fg_color(self, fg):
        fgc = self.child.get_colormap().alloc_color(fg)
        for state in self.states:
            self.child.modify_fg(state, fgc)

Gruß

Dookie
[code]#!/usr/bin/env python
import this[/code]
mawe
Python-Forum Veteran
Beiträge: 1209
Registriert: Montag 29. September 2003, 17:18
Wohnort: Purkersdorf (bei Wien [Austria])

Hi Dookie!

Ahh, sehr gut, so gehts (Frisur gerettet :D)
Vielen Dank!

Gruß, mawe
palo
User
Beiträge: 2
Registriert: Sonntag 26. November 2006, 14:41

hmm , ich hab das jetzt auch mal ausprobiert, und bei mir klappt das
alles ziemlich gut, mein einziges Problem ist, dass ich in nachhinein nicht die farben mehr aendern kann.

sowas in der art soll passieren:

Code: Alles auswählen

def click(self,event):
         print self.label
         self.set_bg_color("white")
aber wenn ich dann auf den button druecke , dann bekommt der das nicht geregelt die neue farbe einzusetzen.

waehre toll , wenn mir da jemand weiter helfen koennte
palo
User
Beiträge: 2
Registriert: Sonntag 26. November 2006, 14:41

lolz ich habs leber nach langem suchen herausgefunden :D

hat mich aber jetzt auch intensive arbeit gekostet,
hier nochmal der ganze code, ( hab aber nur in der set_bg_color) rutine was geaendert:

Code: Alles auswählen

import pygtk
pygtk.require('2.0')
import gtk

class ColoredButton(gtk.Button):
    def __init__(self, label=None, stock=None, use_underline=True,
                states=(gtk.STATE_NORMAL, gtk.STATE_PRELIGHT, gtk.STATE_ACTIVE)):
        super(ColoredButton, self).__init__(label, stock, use_underline)
        self.states = states
        self.label = label
        self.cm = self.get_colormap()
        self.connect("clicked", self.click)
      
    def click(self,event):
        print self.label
        self.set_bg_color("white")

    def set_bg_color(self, bg):
        rc_style = gtk.RcStyle()
        bgc = self.cm.alloc_color(bg)
        self.set_style(None)
        self.modify_style(rc_style)
        for state in self.states:
            self.modify_bg(state, bgc)
        self.child.set_use_markup(True)

elements = ["H","C"]
root = gtk.Window(gtk.WINDOW_TOPLEVEL)
root.connect("destroy", lambda w: gtk.main_quit())

table = gtk.Table(1,2)
root.add(table)

c,r = 0,0
for atom in elements:
    button = ColoredButton(label=atom)
    if atom == "H":
        button.set_bg_color("red")
    else:
        button.set_bg_color("blue")

    table.attach(button,c,c+1,r,r+1)
    button.show()
    c+=1
table.show()
root.show()
gtk.main()
gummibaerchen
User
Beiträge: 51
Registriert: Samstag 7. Oktober 2006, 15:13

Das letzte ist schon besser ;)

Die anderen Button sahen auch nicht nach GTK2 aus. (Keine runden Ecken und so.)

Auf jeden Fall wert, sich das hier zu bookmarken :)

Was nur vllt stört, ist, dass man trotzdem noch den Ubuntu "nativen" Glanzeffekt hat.

Ansonsten muss ich gleich mal gucken, ob Kalzium Buttons oder Drawing-Areas hat :roll:
Antworten