2012-03-11 4 views
3

Я столкнулся с проблемой, которую я подозреваю в рисовании элементов в каире.Перекрашивание окон из каира?

У меня есть окно без полей в pygtk, но я рисую два прямоугольника с cairo.a черным прямоугольником и серым прямоугольником внутри. Когда размер окна изменяется, кажется, что части внутреннего прямоугольника не рисуются/окрашиваются. Я включил 3 скриншота, чтобы показать эту проблему.

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

Как вы можете видеть, во втором и третьем снимке, некоторые части окна не получают окрашен в серый цвет. Один из способов исправить это - это вызвать метод now() метода pygtk's window.but, но это делает мою программу довольно медленной, так как высота окна изменяется с почти каждым нажатием клавиши. Поэтому мне было интересно, какие альтернативы мне нужно исправить.

ниже соответствующий код каир я использую

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