重新粉刷开罗的窗户?
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()
这将确保您始终拥有干净的画布。
【讨论】:
啊。我没有想到的有趣概念。然而它并没有解决问题。以上是关于重新粉刷开罗的窗户?的主要内容,如果未能解决你的问题,请参考以下文章