Pygtk contextos gráficos y colores asignación
Pregunta
He buscado en esto, pero nada tiene lo que estoy buscando.
http://www.mail-archive.com/pygtk@daa.com.au/msg10529 .html - Nadie le respondió. Esto es exactamente lo que estoy experimentando. Cuando me puse el primer plano en un contexto gráfico, no parece cambiar en realidad.
He pasado por el tutorial y preguntas más frecuentes, pero tampoco decir mucho. O bien sólo tiene que utilizar los contextos en blanco y negro o te dan enlaces rotos. Me dejó pensando tal vez es un error. Pero el niño que me dice que solo me falta algo y sigo ignorando el hecho de que tengo una alternativa de trabajo. Esto sería mejor sin embargo. Y cuanto más me meto en esto, más me voy a necesitar estos contextos y colores.
Aquí está mi fragmento de código.
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
Me pareció que tal vez era la forma en que estaba asignando los colores. Como se puede ver en el fragmento, que he usado propio mapa de colores del contexto gráfico. He intentado diferentes mapas de colores, siendo esta la última. Incluso he intentado un color asignado. Note la white_gc y contextos gráficos black_gc. Cuando utilizo los que soy capaz de dibujar negro sobre un fondo blanco fino. De lo contrario (con un contexto creado) de todo lo negro, fg y bg. Cuando cambio de color de primer plano blanco, siempre sale negro.
Aquí está la salida. Observe el color no cambia mucho. Yo diría que no ha cambiado, o al menos no lo suficiente a la materia visual.
Before 6 174 60340
After 5 174 60340
Así es como asigno los colores.
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
Solución
He tenido algunos problemas con Disponibles y GC en el pasado. Esta respuesta me inició en el camino hacia una solución. Aquí está un ejemplo rápido que utiliza un GC color personalizado para dibujar algunas plazas:
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()
Espero que ayuda.
Otros consejos
El problema es que la función devuelve un NewColor()
c
el color asignado. colormap.alloc_color()
devuelve un gtk.gdk.Color
que es el color asignado. Para arreglar las cosas la última línea de NewColor()
debe ser:
return colormap.alloc_color(c)