Python 重新粉刷开罗的窗户?

Python 重新粉刷开罗的窗户?,python,pygtk,cairo,Python,Pygtk,Cairo,我遇到了一个问题,我怀疑这是因为在开罗画元素 我在pygtk中有一个无边界窗口,但我用cairo绘制了两个矩形。一个黑色矩形,里面一个灰色矩形。调整窗口大小时,内部矩形的某些部分似乎没有绘制/绘制。我已经包括了3个屏幕截图来显示这个问题 正如您在第二张和第三张图片中所看到的,窗户的某些部分没有被漆成灰色。解决这个问题的一种方法是调用pygtk的window的present()方法。但是这会使我的程序非常慢,因为几乎每次击键都会改变窗口的高度。所以我想知道我有什么办法来解决这个问题 下面是我使

我遇到了一个问题,我怀疑这是因为在开罗画元素

我在pygtk中有一个无边界窗口,但我用cairo绘制了两个矩形。一个黑色矩形,里面一个灰色矩形。调整窗口大小时,内部矩形的某些部分似乎没有绘制/绘制。我已经包括了3个屏幕截图来显示这个问题

正如您在第二张和第三张图片中所看到的,窗户的某些部分没有被漆成灰色。解决这个问题的一种方法是调用pygtk的window的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)

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

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

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

我相信这基本上是一个GTK+错误。调整窗口大小时,GTK+并不总是将整个窗口排队重新绘制。作为一种解决方法,您可以在调整窗口大小的位置调用window.queue_draw()。有趣的概念我没想到。然而,这并没有解决问题。