Pygtk Graphikkontexte und Zuordnen Farben
Frage
Ich habe auf diesem gesucht, aber nichts, was ich suche.
http://www.mail-archive.com/pygtk@daa.com.au/msg10529 .html - Niemand antwortete ihm. Das ist genau das, was ich erlebe. Als ich den Vordergrund auf einem Grafikkontext gesetzt, es scheint nicht wirklich zu ändern.
Ich war durch das Tutorial und FAQ, aber weder sagen viel. Sie verwenden entweder nur die Schwarz-Weiß-Kontexten oder sie geben Sie defekte Links. Ich bin links denken vielleicht ist es ein Bug. Aber das Kind in mir sagt, ich bin gerade etwas fehlt und ich immer ignoriert die Tatsache, ich habe eine funktionierende Alternative. Dies wäre allerdings besser sein. Und je weiter ich in das bekommen, desto mehr werde ich diese Kontexte und Farben benötigen.
Hier ist mein Code-Schnipsel.
def CreatePixmapFromLCDdata(lcdP, ch, widget):
width = lcdP.get_char_width()
height = lcdP.get_char_height()
# Create pixmap
pixmap = gtk.gdk.Pixmap(widget.window, width, height)
# Working graphics contexts, wrong color
black_gc = widget.get_style().black_gc
white_gc = widget.get_style().white_gc
char_gc = widget.window.new_gc()
colormap = char_gc.get_colormap()
bg_color = NewColor(text="#78a878", colormap=colormap)
print "Before", char_gc.foreground.red, char_gc.foreground.green, char_gc.foreground.blue
char_gc.set_foreground(bg_color)
print "AFter", char_gc.foreground.red, char_gc.foreground.green, char_gc.foreground.blue
fg_color = NewColor(text="#113311", colormap=colormap)
pixmap.draw_rectangle(char_gc, True, 0, 0, width, height)
char_gc.foreground = fg_color
for j in range(lcdP.dots['y']):
k = lcdP.pixels['y']*j
for i in range(lcdP.dots['x']):
if 1<<(lcdP.dots['x']-1-i) & ch[j] == 0: continue
m = i*lcdP.pixels['y']
for jj in range(k, k+lcdP.pixels['y']-1):
for ii in range(m+1, m+lcdP.pixels['x']):
pixmap.draw_point(char_gc, ii, jj)
return pixmap
Ich dachte, vielleicht war es die Art, wie ich die Farben wurde zuordnet. Wie Sie im Code-Schnipsel zu sehen, habe ich die Grafik Kontext eigene colormap verwendet. Ich habe verschiedene Farbtabellen versucht, dies die letzte sein. Ich habe sogar eine nicht zugeordneten Farbe ausprobiert. Beachten Sie die white_gc und black_gc Graphikkontexte. Wenn ich die benutze ich bin in der Lage auf einem weißen Hintergrund feinen schwarzen zu zeichnen. Im anderen Fall (mit einem erstellten Kontext) ist alles schwarz, fg und bg. Wenn ich weiß Vordergrundfarbe zu ändern, ist es immer schwarz kommt.
Hier ist der Ausgang. Beachten Sie die Farbe nicht sehr viel ändert. Ich würde sagen, es ist nicht zu ändern, oder zumindest nicht genug visuell Rolle zu spielen.
Before 6 174 60340
After 5 174 60340
Hier ist, wie ich die Farben zuordnen.
def NewColor(red=0, green=0, blue=0, text=None, colormap=None):
if text == None:
c = gtk.gdk.Color(red, green, blue)
else:
c = gtk.gdk.color_parse(text)
if colormap == None:
colormap = gtk.gdk.colormap_get_system()
colormap.alloc_color(c)
return c
Lösung
Ich habe einige Probleme mit Drawable und GC in der Vergangenheit. diese Antwort hat mich auf dem Weg zu einer Lösung gestartet. Hier ist ein kleines Beispiel, die eine benutzerdefinierte Farbe gc verwendet, um einige Quadrate zu ziehen:
import gtk
square_sz = 20
pixmap = None
colour = "#FF0000"
gc = None
def configure_event( widget, event):
global pixmap
x, y, width, height = widget.get_allocation()
pixmap = gtk.gdk.Pixmap(widget.window, width, height)
white_gc = widget.get_style().white_gc
pixmap.draw_rectangle(white_gc, True, 0, 0, width, height)
return True
def expose_event(widget, event):
global pixmap
if pixmap:
x , y, w, h = event.area
drawable_gc = widget.get_style().fg_gc[gtk.STATE_NORMAL]
widget.window.draw_drawable(drawable_gc, pixmap, x, y, x, y, w, h)
return False
def button_press_event(widget, event):
global pixmap, square_sz, gc, colour
if event.button == 1 and pixmap:
x = int(event.x / square_sz) * square_sz
y = int(event.y / square_sz) * square_sz
if not gc:
gc = widget.window.new_gc()
gc.set_rgb_fg_color(gtk.gdk.color_parse(colour))
pixmap.draw_rectangle(gc, True, x, y, square_sz, square_sz)
widget.queue_draw_area(x, y, square_sz, square_sz)
return True
if __name__ == "__main__":
da = gtk.DrawingArea()
da.set_size_request(square_sz*20, square_sz*20)
da.connect("expose_event", expose_event)
da.connect("configure_event", configure_event)
da.connect("button_press_event", button_press_event)
da.set_events(gtk.gdk.EXPOSURE_MASK | gtk.gdk.BUTTON_PRESS_MASK)
w = gtk.Window()
w.add(da)
w.show_all()
w.connect("destroy", lambda w: gtk.main_quit())
gtk.main()
Hoffe, es hilft.
Andere Tipps
Das Problem ist, dass die NewColor()
Funktion einer nicht zugeordneten Farb c
zurückkehrt. colormap.alloc_color()
gibt eine gtk.gdk.Color
, die die zugewiesene Farbe. Um die Dinge zu beheben die letzte Zeile in NewColor()
sollte sein:
return colormap.alloc_color(c)