2012-03-11 5 views
3

私はカイロで絵画/絵画要素をしなければならないと思われる問題に遭遇しました。窓を再塗装しますか?

私はpygtkにフチ無しのウィンドウを持っていますが、私はcairo.aの黒い四角形と内側に灰色の四角形で2つの長方形を描いています。ウィンドウのサイズを変更すると、内側の四角形の一部が描画/塗りつぶされないように見えます。私はこの問題を示すために3つのスクリーンショットを含めました。

enter image description here enter image description here enter image description here

2番目と3枚目の画像で見ることができるように、ウィンドウのいくつかの作品は、灰色の塗装されません。これを修正する1つの方法は、pygtkのウィンドウのpresent()メソッドを呼び出すことです。しかし、これによりウィンドウの高さがそれぞれのキーストロークでかなり変化するため、私のプログラムは非常に遅くなります。だから私はこれを解決しなければならない選択肢が何か不思議だった。以下

私は

def expose(self, widget, e): 
    cr = widget.window.cairo_create() 

    # Draw the background 
    cr.set_operator(cairo.OPERATOR_SOURCE) 

    # Create black rectangle with 60% opacity (serves as border) 
    (width, height) = widget.get_size() 
    cr.set_source_rgba(0, 0, 0, 0.6) 
    cr.rectangle(0, 0, width, height) 
    cr.fill() 

    # Inside the black rectangle, put a lighter one (will hold widgets) 
    (width, height) = widget.get_size() 
    cr.set_source_rgb(205/255, 205/255, 193/255) 
    cr.rectangle(10, 10, width-20, height-20) 
    cr.fill() 

    return False 

def screen_changed(self, widget, old_screen = None): 
    screen = widget.get_screen() 
    colormap = screen.get_rgba_colormap() 
    widget.set_colormap(colormap) 

答えて

2

基本的にはGTK +のバグだと私は信じています。ウィンドウのサイズを変更すると、GTK +は常にウィンドウ全体を再描画するようにキューに入れるわけではありません。この問題を回避するには、ウィンドウのサイズを変更する場所でwindow.queue_draw()を呼び出すことができます。

+0

これでした。ありがとう。 – sqram

1

を使用して、関連するカイロコードは、あなたのカイロウィジェットを作成した後、以下の権利を使用してみてくださいです:

cr.set_source_rgb(0,0,0) 
cr.paint() 

これは、あなたが常にクリーンなキャンバスを持っていることを確認します。

+0

ああ。私が考えなかった興味深いコンセプト。しかし、それは問題を解決しなかった。 – sqram

関連する問題