重新粉刷开罗的窗户?

Posted

技术标签:

【中文标题】重新粉刷开罗的窗户?【英文标题】:Repainting cairo windows? 【发布时间】:2012-03-11 01:50:19 【问题描述】:

我遇到了一个问题,我怀疑必须在 cairo 进行绘画/绘图元素。

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

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

【问题讨论】:

【参考方案1】:

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

【讨论】:

【参考方案2】:

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

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

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

【讨论】:

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

以上是关于重新粉刷开罗的窗户?的主要内容,如果未能解决你的问题,请参考以下文章

数据结构与算法之深入解析“粉刷房子”的求解思路与算法示例

如何摆脱 grub 并恢复我的窗户?

AcWing 1866. 围栏刷漆(简单思维)

如何从node.js中的mysql获取最近添加的重新编码ID

开罗游戏,为何如此魔性?

开罗的笔画对齐