Pygtk グラフィックス コンテキストと色の割り当て
質問
これについて検索しましたが、探しているものはありません。
http://www.mail-archive.com/pygtk@daa.com.au/msg10529.html -- 誰も彼に答えなかった。これはまさに私が経験していることです。グラフィックス コンテキストで前景を設定しても、実際には変化していないように見えます。
チュートリアルと FAQ を一通り読みましたが、どちらもあまり詳しくありません。これらは単に白黒のコンテキストを使用するか、壊れたリンクを提供します。もしかしたらバグかもしれないと思ってしまいます。しかし、私の中の子供は、私には何かが欠けているだけだと言い、私には有効な代替手段があるという事実を無視し続けます。こっちのほうがいいんだけどね。そして、これをさらに進めれば進めるほど、これらのコンテキストと色がさらに必要になります。
これが私のコードスニペットです。
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)