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
War es hilfreich?

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)
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top