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
¿Fue útil?

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)
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top