2009-06-02 10 views
2

私はこれを検索しましたが、探しているものはありません。Pygtkのグラフィックスコンテキストと色の割り当て

http://www.mail-archive.com/[email protected]/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 

答えて

2

私は過去にDrawableGCといくつかの問題を持っていました。 This answer私は解決策に向かい始めました。カスタム色の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() 

希望すると助かります。

+0

とする必要があります。set_rgb_fg_colorはうまく動作します。いずれのドキュメントでも、このメソッドを見たことはありませんでした。先端に感謝します。それは今働く。 – Scott

+0

神に感謝します。私はちょうどまったく同じ問題を抱えていた。なぜあなたはset_foregroundが動作しないのですか?しかし、文書化されていないset_rgb_fg_colorがあります。 – Claudiu

1

NewColor()関数が未割り当ての色cを返すという問題があります。 colormap.alloc_color()は、割り当てられた色であるgtk.gdk.Colorを返します。問題を修正するには、NewColor()の最後の行は、

return colormap.alloc_color(c) 
関連する問題