PyGObject — меню, вызываемое левой кнопкой мыши на значке состояния

Я начинаю писать небольшой апплет панели для Gnome, и я хотел бы, чтобы пользователь мог щелкнуть левой кнопкой мыши значок состояния, чтобы просмотреть некоторые параметры и информацию, например. похож на значок звука в Gnome 3, где вы можете установить громкость, щелкнув левой кнопкой мыши, а установить настройки, щелкнув правой кнопкой мыши. Код правой кнопки мыши таков:

statusicon.connect("popup-menu", right_button_click)

где right_button_click — это имя функции, которая вызывается при щелчке правой кнопкой мыши. Важной частью является "popup-menu". Что было бы альтернативой для настройки события щелчка левой кнопкой мыши?


person Rainbow    schedule 21.07.2011    source источник


Ответы (3)


Прежде всего, нужно изучить код gnome для регулятора громкости, и это это Во-вторых, вам следует изучить документацию API для GtkStatusIcon, и она находится здесь Этого должно быть достаточно.

person erick2red    schedule 22.07.2011
comment
Мне нужно сделать это на питоне с помощью PyGObject (преемник PyGtk). - person Rainbow; 22.07.2011
comment
@Rainbow Это почти то же самое, поскольку PyGObject являются привязками для библиотеки Gtk+ c. - person erick2red; 28.07.2011

Это крошечный пример, показывающий, как это работает.

#!/usr/bin/python3

import gi
gi.require_version('Gtk', '3.0')

from gi.repository import Gtk

class TrayIcon(Gtk.StatusIcon):
    def __init__(self):
        Gtk.StatusIcon.__init__(self)
        self.set_from_icon_name('help-about')
        self.set_has_tooltip(True)
        self.set_visible(True)
        self.connect("popup_menu", self.on_secondary_click)


    def on_secondary_click(self, widget, button, time):
        menu = Gtk.Menu()

        menu_item1 = Gtk.MenuItem("First Entry")
        menu.append(menu_item1)

        menu_item2 = Gtk.MenuItem("Quit")
        menu.append(menu_item2)
        menu_item2.connect("activate", Gtk.main_quit)

        menu.show_all()
        menu.popup(None, None, None, self, 3, time)

if __name__ == '__main__':
    tray = TrayIcon()

    Gtk.main()
person rho    schedule 21.06.2016

Это поздний ответ, но я просто публикую это на случай, если кто-то еще когда-нибудь будет искать элемент управления левой кнопкой мыши над gtkstatusicon.

Прямая альтернатива это

statusicon.connect("activate", left_button_click)

Это пример всплывающего меню значка панели задач, работающего с помощью щелчка левой кнопкой мыши вместо (обычного) щелчка правой кнопкой мыши.

#!/usr/bin/env python
import pygtk
pygtk.require('2.0')
import gtk

class TrayIcon(gtk.StatusIcon):
    def __init__(self):
        gtk.StatusIcon.__init__(self)
        self.set_from_icon_name('help-about')
        self.set_has_tooltip(True)
        self.set_visible(True)
        self.connect("activate", self.on_click)

    def greetme(self,data=None):  
        msg=gtk.MessageDialog(None, gtk.DIALOG_MODAL,gtk.MESSAGE_INFO, gtk.BUTTONS_OK, "Greetings")
        msg.run()
        msg.destroy()

    def on_click(self,data): 
        event=gtk.get_current_event()
        btn=event.button #this gets the button value of gtk event.
        time=gtk.get_current_event_time() # required by menu popup. 

        menu = gtk.Menu()
        menu_item1 = gtk.MenuItem("First Entry")
        menu.append(menu_item1)
        menu_item1.connect("activate", self.greetme)

        menu_item2 = gtk.MenuItem("Quit")
        menu.append(menu_item2)
        menu_item2.connect("activate", gtk.main_quit)

        menu.show_all()
        menu.popup(None, None, None, btn, time) 
        #button can be hardcoded (i.e 1) but time must be correct.

if __name__ == '__main__':
    tray = TrayIcon()
    gtk.main()

Кроме того, есть такая альтернатива:

statusicon.connect("button-press-event", button_click)

Приведенный ниже пример кода вызывает одно и то же всплывающее меню в gtktrayicon при ОБОИХ щелчках правой и левой кнопкой мыши.

#!/usr/bin/env python
import pygtk
pygtk.require('2.0')
import gtk

class TrayIcon(gtk.StatusIcon):
    def __init__(self):
        gtk.StatusIcon.__init__(self)
        self.set_from_icon_name('help-about')
        self.set_has_tooltip(True)
        self.set_visible(True)
        self.connect("button-press-event", self.on_click)

    def greetme(self,data=None):  
        msg=gtk.MessageDialog(None, gtk.DIALOG_MODAL,gtk.MESSAGE_INFO, gtk.BUTTONS_OK, "Greetings")
        msg.run()
        msg.destroy()

    def on_click(self,data,event):
    #event in this case is sent by the status icon connect. 
        btn=event.button 
        #By controlling this event.button value (1-2-3 for left-middle-right click) you can call other functions.
        time=gtk.get_current_event_time() # required by the popup. 

        menu = gtk.Menu()
        menu_item1 = gtk.MenuItem("First Entry")
        menu.append(menu_item1)
        menu_item1.connect("activate", self.greetme) 

        menu_item2 = gtk.MenuItem("Quit")
        menu.append(menu_item2)
        menu_item2.connect("activate", gtk.main_quit)

        menu.show_all()
        menu.popup(None, None, None, btn, time) 

if __name__ == '__main__':
    tray = TrayIcon()
    gtk.main()

Надеюсь, приведенный выше код поможет. Джордж В.

person George Vasiliou    schedule 13.10.2016