سؤال

لقد بحثت على هذا، ولكن لا يوجد شيء ما أبحث عنه.

http://www.mail-archive.com/pygtk@da.com.au/msg10529.html - لا أحد أجابه. هذا هو بالضبط ما أعاني منه. عندما أقوم بتعيين المقدمة على سياق رسومات، لا يبدو أنه يتغير فعليا.

لقد كنت من خلال البرنامج التعليمي والأسئلة الشائعة، ولكن لا يقول الكثير. إما فقط استخدام السياقات بالأبيض والأسود أو أنها تعطيك الروابط المكسورة. أنا تركت التفكير ربما يكون خطأ. لكن الطفل في وجهي يقول أنا فقط أفتقد شيئا وأظل متجاهلا حقيقة أن لدي بديل عمل. سيكون هذا أفضل رغم ذلك. وأكثر من ذلك، كلما كنت سأحتاج إلى هذه السياقات والألوان.

هنا مقتطف التعليمات البرمجية.

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

فكرت ربما كانت الطريقة التي كنت أتخصص فيها الألوان. كما ترى في المقتطف، استخدمت كولورق سياق الرسوم. لقد جربت مشوكا مختلفا، هذا هو الأحدث. لقد جربت بلون غير مخصص. لاحظ سياقات الرسومات White_GC و Black_GC. عندما أستخدم أولئك الذين يمكنني رسمهم أسود على خلفية بيضاء بخير. خلاف ذلك (مع سياق تم إنشاؤه) كل شيء أسود، FG و BG. عندما أقوم بتغيير اللون الأمامي الأبيض، فهو دائما يخرج الأسود.

ها هو الإخراج. لاحظ اللون لا يتغير كثيرا. أود أن أقول أنه لم يتغير، أو على الأقل لا يكفي بصريا.

Before 6 174 60340
After 5 174 60340

إليك كيفية تخصيص الألوان.

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
هل كانت مفيدة؟

المحلول

لقد كان لدي بعض المتاعب مع جميل و gc. في الماضي. هذه الإجابة حصلت لي بدأت في الطريق إلى حل. إليك مثال سريع يستخدم GC لون مخصص لرسم بعض المربعات:

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()

آمل أن يساعد.

نصائح أخرى

المشكلة هي أن NewColor() الوظيفة هي إرجاع لون غير مخصص c. colormap.alloc_color() إرجاع أ gtk.gdk.Color وهو اللون المخصص. لإصلاح الأشياء الخط الأخير في NewColor() يجب ان يكون:

return colormap.alloc_color(c)
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top