Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/361.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在gtk.窗口中的任意位置捕捉单击_Python_Events_Gtk_Click_Pygtk - Fatal编程技术网

Python 在gtk.窗口中的任意位置捕捉单击

Python 在gtk.窗口中的任意位置捕捉单击,python,events,gtk,click,pygtk,Python,Events,Gtk,Click,Pygtk,考虑以下python代码: import gtk class MainWindow(): def __init__(self): self.window = gtk.Window() self.window.show() if __name__ == "__main__": main = MainWindow() gtk.main() 我需要捕捉这个gtk.Window()中任何地方的点击。 我没有找到任何合适的事件(我也尝试了按钮按

考虑以下python代码:

import gtk

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

if __name__ == "__main__":
    main = MainWindow()
    gtk.main()
我需要捕捉这个gtk.Window()中任何地方的点击。 我没有找到任何合适的事件(我也尝试了
按钮按下事件
,但它不起作用),我缺少什么


谢谢大家!

您可以将
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
的父项不会从中接收单击事件。

所以我在窗口中有这个绘图区域。然后点击我得到了回调

  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

谢谢你,多普;你知道有什么东西能够捕捉到子部件单独处理的事件吗?@David Paleino:你可以尝试使用
gobject.add_emission\u hook
,然后在回调函数中,在父部件上重新发出捕捉到的信号,或者如果你需要的话,立即在顶层发出捕捉到的信号。不知道这是否有效,但我会试试。