2010-06-19 28 views
3

考慮以下Python代碼裏面:接住一個點擊任何地方gtk.Window

import gtk 

class MainWindow(): 
    def __init__(self): 
     self.window = gtk.Window() 
     self.window.show() 

if __name__ == "__main__": 
    main = MainWindow() 
    gtk.main() 

我需要趕上點擊這個gtk.Window內的任何地方()。 我還沒有找到任何合適的事件(我也試過button-press-event,但它不起作用),我錯過了什麼?

謝謝!

回答

4

您可以將gtk.EventBox打包到窗口中。一般來說,無論遇到麻煩事件時,請檢查gtk.EventBox是否解決它們。

import gtk 

class MainWindow(): 
    def __init__(self): 
     self.window = gtk.Window() 
     self.box = gtk.EventBox() 
     self.window.add (self.box) 
     self.box.add (gtk.Label ('some text')) 
     self.window.show_all() 

     import sys 
     self.box.connect ('button-press-event', 
          lambda widget, event: 
           sys.stdout.write ('%s // %s\n' % (widget, event))) 

if __name__ == "__main__": 
    main = MainWindow() 
    gtk.main() 

但是,請注意,如果小部件本身處理事件,則小部件層次結構向上傳播的事件將停止。例如,gtk.Button的父母將不會收到來自其的點擊事件。

+1

謝謝doublep;你知道一些能夠捕捉到兒童小工具單獨處理的事件嗎? – 2010-06-21 14:14:51

+0

@David Paleino:您可以嘗試使用'gobject.add_emission_hook',並在您的回調中重新發出捕獲的信號在父窗口小部件上 - 或立即在頂層,如果這是您所需要的。不知道這是否會奏效,但這就是我想要的。 – doublep 2010-06-21 19:25:32

+0

謝謝,我會試試! :) – 2010-06-22 07:22:44

0

所以我有這個DrawingArea在窗口中。而就點擊我得到的回調

self.drawingarea = gtk.DrawingArea() 
    self.drawingarea.connect ('button-press-event',self.callback) 
    self.drawingarea.set_events(gtk.gdk.EXPOSURE_MASK 
          | gtk.gdk.LEAVE_NOTIFY_MASK 
          | gtk.gdk.BUTTON_PRESS_MASK 
          | gtk.gdk.POINTER_MOTION_MASK 
          | gtk.gdk.POINTER_MOTION_HINT_MASK) 
    self.window.add(self.drawingarea) 

過濾器的左邊或右邊按鈕:

def callback(self, widget, event): 
    print "clicking... left or right" 
    if event.button == 1: 
     print 'OK - clicked left ' 
     #os.system("""wmctrl -s 0""") 
    return True 
相關問題