重新绘制cairo窗口?

3

我遇到了一个问题,我怀疑与cairo绘制元素有关。我在pygtk中有一个无边框的窗口,但是我用cairo画了两个矩形,一个黑色矩形和一个内部灰色矩形。当调整窗口大小时,似乎有部分内部矩形没有被绘制/涂色。我包括了3张截图以显示这个问题。

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

正如您在第二和第三张图片中所看到的那样,窗口的某些部分没有被绘制成灰色。解决此问题的一种方法是调用pygtk窗口的present()方法,但这会使我的程序非常缓慢,因为窗口的高度几乎每次按键都会更改。所以我想知道有哪些替代方案可以解决这个问题。

下面是我使用的相关cairo代码:

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

我认为这基本上是GTK+的一个bug。当窗口被调整大小时,GTK+并不总是将整个窗口排队重绘。作为解决方法,您可以在导致窗口调整大小的位置调用window.queue_draw()。


1

在创建cairo小部件后,请尝试使用以下内容:

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

这将确保您始终拥有一个干净的画布。


啊,有趣的概念,我没有想到过。 然而,它并没有解决问题。 - sqram

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接