Щракнете с десния бутон върху PyGTK Hbox в Expander

Имам обект gtk.Expander, съдържащ в етикета си gtk.HBox, който пакетира gtk.Image и gtk.Label. Искам да стартирам уеб браузър, когато върху HBox се щракне с десния бутон. Ето моят код:

def launchBrowser(widget, host, event):
    print event
    print host
    if event.type == gtk.gdk.BUTTON_PRESS:
        if event.button == 3:
            webbrowser.open(host, 1)
            print "right click"

def addServer(self, loginfo):
    main_expand = gtk.Expander()
    main_led = gtk.Image()
    if int(loginfo["main"]) == 0:
        main_led.set_from_stock(gtk.STOCK_STOP, gtk.ICON_SIZE_BUTTON)
    else:
        main_led.set_from_stock(gtk.STOCK_CLOSE, gtk.ICON_SIZE_BUTTON)

    main_srvname = gtk.Label(loginfo["srvname"])

    expand_title = gtk.HBox(False, 2)
    expand_title.pack_start(main_led, False, True, 0)
    expand_title.pack_start(main_srvname, True, True, 0)

    main_srvname.add_events(gtk.gdk.BUTTON_PRESS_MASK)
    main_srvname.connect_object('event', self.launchBrowser, loginfo["host"])
    main_srvname.emit('event', gtk.gdk.Event(gtk.gdk.BUTTON_PRESS_MASK))

    main_expand.set_property("label-widget", expand_title)

Проблемът е, че когато премина с курсора върху този HBox, правилно получих събитието. Но когато щракна нищо не се случи. Мисля, че е така, защото събитието за щракване се прихваща от Expander.

Всяка помощ е добре дошла =) Благодаря предварително!

РЕДАКТИРАНЕ: Опитах и ​​това:

    main_srvname = gtk.Label(loginfo["srvname"])
    eventbox = gtk.EventBox()
    eventbox.add(main_srvname)
    eventbox.connect_object('button-press-event', self.launchBrowser, loginfo["host"])

    # Titre de l'expand box 
    expand_title = gtk.HBox(False, 2)
    expand_title.pack_start(main_led, False, True, 0)
    expand_title.pack_start(eventbox, True, True, 0)

Нито работи...

РЕДАКТИРАНЕ 2: Както беше поискано от Джереми, ето самостоятелен код, просто го копирайте и поставете, мързеливко!

import pygtk
pygtk.require('2.0')
import gtk

class MainWindow(gtk.Window):
    def __init__(self):
        gtk.Window.__init__(self)
        self.set_default_size(300, 300)
        self.addServer()

    def launchBrowser(widget, host, event):
        print event
        if event.type == gtk.gdk.BUTTON_PRESS:
            if event.button == 3:
                print "click"

    def addServer(self):
        main_expand = gtk.Expander()
        main_led = gtk.Image()
        main_led.set_from_stock(gtk.STOCK_STOP, gtk.ICON_SIZE_BUTTON)

        main_srvname = gtk.Label("srvname")
        main_srvname.add_events(gtk.gdk.BUTTON_PRESS_MASK)
        main_srvname.connect_object('button-press-event', self.launchBrowser, "host")

        expand_title = gtk.HBox(False, 2)
        expand_title.pack_start(main_led, False, True, 0)
        expand_title.pack_start(main_srvname, True, True, 0)
        main_expand.set_property("label-widget", expand_title)

        self.add(main_expand)
        self.show_all()

def main():
    MainWindow()
    gtk.main()

if __name__ == '__main__':
    main()

person unpythonicguy    schedule 23.08.2011    source източник
comment
Ако публикувате самостоятелен пример за вашия проблем, ще получите отговори от хора, които са отегчени и искат да си поиграят с нещо. Ако не, тогава се ограничавате основно до хора, които вече знаят отговора ви на ум, което може да е малка популация.   -  person dumbmatter    schedule 23.08.2011
comment
Публикувайте сравнително кратък, самостоятелен скрипт, така че хората да могат лесно да го стартират и да видят проблема ви. Като цяло това винаги ще ви осигури повече и по-бързи отговори тук.   -  person dumbmatter    schedule 23.08.2011


Отговори (1)


Малка промяна във вашия код.

Добавете „бутон-натискане-събитие“ към приспособлението Expander вместо приспособлението Label

import pygtk
pygtk.require('2.0')
import gtk

class MainWindow(gtk.Window):
   def __init__(self):
     gtk.Window.__init__(self)
     self.set_default_size(300, 300)
     self.addServer()

   def launchBrowser(self, widget, event, host, *args):
      if event.type == gtk.gdk.BUTTON_PRESS:
        if event.button == 3:
            print "click"
     # Normal behaviour of Expander on single click
      expand = widget.get_expanded()
      if not expand: widget.set_expanded(True)
      else: widget.set_expanded(False)

  def addServer(self):
    main_expand = gtk.Expander()
    main_led = gtk.Image()
    main_led.set_from_stock(gtk.STOCK_STOP, gtk.ICON_SIZE_BUTTON)

    main_srvname = gtk.Label("srvname")
    main_expand.add_events(gtk.gdk.BUTTON_PRESS_MASK)
    main_expand.connect('button-press-event', self.launchBrowser, 'host')

    expand_title = gtk.HBox(False, 2)
    expand_title.pack_start(main_led, False, True, 0)
    expand_title.pack_start(main_srvname, True, True, 0)
    main_expand.set_property("label-widget", expand_title)

    self.add(main_expand)
    self.show_all()

def main():
 MainWindow()
 gtk.main()

if __name__ == '__main__':
 main()
person Yajushi    schedule 24.08.2011
comment
Опитах това, но проблемът е, че моят разширител съдържа други разширители и всички те са свързани с функцията launchBrowser. Благодаря все пак, но това не е, което искам. - person unpythonicguy; 24.08.2011