2012-01-05 63 views
2

我創建了數據可視化小工具暴露事件。 GUI是用Pygtk創建的,非常簡單。在用戶輸入文件名後,他可以按下「calc」按鈕查看輸出。輸出由pycairo渲染並呈現在gtk.DrawingArea中。「手動」調用上gtk.DrawingArea

該應用程序的工作原理如下: 當按鈕被按下時處理的文件,其內容被保存在一個特殊的類。這個類是一個自定義容器:它與gui一起被實例化,並且是空的或者被填充的。 DrawingArea的公開事件鏈接到讀取容器並繪製其內容的繪圖函數。只要容器是空的,DrawingArea仍然是空的,但是在Calc被點擊並加載文件之後,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()) 

回答

9

爲了讓你的widget刷新,你需要(通過發出公開事件),將告訴GTK +,它需要重新繪製,通常使用gtk.Widget.queue_draw()(稱爲self.queue_draw()),其中無效整個控件和時間表重繪在程序返回到主循環後發生。

如果您需要在該地區更多的控制權被重新繪製,你可以隨時使用gtk.Widget.queue_draw_area()指定的區域無效,或一路走下來gtk.gdk.Window.invalidate_rect()

0

你寫一個事件回調,您需要連接到expose事件,像這樣:在你的對象__init__方法self.connect("do_expose_event", self.expose)

+1

沒有幫助。這個揭露事件已經與這個函數連接了。加載數據後,我需要激發一個揭露事件。瞭解DrawingArea只有在程序認爲有必要時纔會刷新。要查看新數據,我必須調整窗口大小。 – lhk 2012-01-05 18:49:11

0

呼叫self.draw()從計算處理程序,而忘記了做一個假的事件結構傳遞給暴露。

但是,如果您堅持直接調用它來誤用do_expose_event(),則不需要創建整個事件結構,只需將它引用的一個元素(event.area)設置爲窗口幾何即可調用它,被剪裁。

+0

我已經決定「誤用」do_expose_event()並且只需要一種方法來獲取事件參數。我不明白event.area的含義 – lhk 2012-01-08 11:55:10