Перекрашивать каирские окна? - PullRequest
3 голосов
/ 11 марта 2012

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

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

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

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

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

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 ]

2 голосов
/ 17 марта 2012

Я считаю, что это в основном ошибка GTK +.Когда размер окна изменяется, GTK + не всегда ставит все окно в очередь для перерисовки.В качестве обходного пути вы можете вызвать window.queue_draw () в том месте, где вы изменяете размер окна.

1 голос
/ 15 марта 2012

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

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

Это гарантирует, что у вас всегда будет чистый холст.

...