سياقات الرسومات Pygtk وتخصيص الألوان
سؤال
لقد بحثت على هذا، ولكن لا يوجد شيء ما أبحث عنه.
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)