2010-06-19 2 views
3

рассмотрит следующий код питона:Ловля щелчка в любом месте внутри 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; знаете ли вы о том, что можно поймать и события, обработанные исключительно детскими виджетами? –

+0

@David Paleino: вы можете попробовать использовать 'gobject.add_emission_hook' и в своем обратном вызове переименовать пойманный сигнал на родительском виджетах - или сразу же на верхнем уровне, если это все, что вам нужно. Не знаю, будет ли это работать, но вот что я попробую. – doublep

+0

Спасибо, я постараюсь! :) –

0

Итак, у меня есть рисунок рисования в окне. И по щелчку я получаю CallBack

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 
Смежные вопросы