我正在创建一个用于数据可视化的小工具。 GUI是使用Pygtk创建的,非常简单。在用户输入文件名后,他可以按“calc”按钮查看输出。输出由pycairo呈现,并以gtk.DrawingArea。
显示该应用程序的工作原理如下: 按下按钮时,文件将被处理,其内容将存储在特殊类中。这个类是一个自定义容器:它与gui一起实例化,无论是空的还是填充的。 DrawingArea的expose事件链接到一个绘图函数,该函数读取容器并绘制其内容。只要容器为空,DrawingArea就会为空,但在点击calc并加载文件之后,应该用我的视觉效果填充DrawingArea。
问题是: 除了更新DrawingArea之外,一切正常。我无法弄清楚如何手动调用曝光。按下calc之后,我必须调整窗口大小以查看结果。
更具体: 我从教程中复制了这段代码,并且不知道如何自己提供参数事件:
def do_expose_event(self,event):
# Create the cairo context
cr = self.window.cairo_create()
# Restrict Cairo to the exposed area; avoid extra work
cr.rectangle(event.area.x, event.area.y,
event.area.width, event.area.height)
cr.clip()
self.draw(cr, *self.window.get_size())
答案 0 :(得分:10)
为了让您的窗口小部件刷新,您需要告诉GTK +需要重新绘制它,通常使用gtk.Widget.queue_draw()
(称为self.queue_draw()
),这会使整个窗口小部件无效并安排重绘(通过发出公开事件)将在程序返回主循环后发生。
如果您需要对重新绘制的区域进行更多控制,则可以始终使用gtk.Widget.queue_draw_area()
指定要使其无效的区域,或者一直向下移动到gtk.gdk.Window.invalidate_rect()
。
答案 1 :(得分:0)
您已经编写了一个事件回调,您需要连接到expose
事件,如下所示:self.connect("do_expose_event", self.expose)
您对象的__init__
方法。
答案 2 :(得分:0)
从calc处理程序中调用self.draw()
,忘记将假事件结构传递给公开。
但是如果你坚持通过直接调用它来滥用do_expose_event()
,你就不需要创建一个完整的事件结构,只需要将它引用的一个元素(event.area)设置为窗口几何体来调用它所以什么都没有被剪掉。