Kategória: Python

Zmenené: 20. august 2011

Ikona v Systray (4)

Pokračovanie vzorového kódu, pôvodne začatého ako prevod PHP.GTK do Pythonu, ktorý som však výrazne zjednodušil tak, aby zachytával iba podstatu. Príklad ukazuje ako ukončiť aplikáciu po kliknutí pravým tlačidlom na ikonu v SysTray.

Cieľ

Ikona v SysTray vytvorená v predošlej časti zobrazuje po kliknutí ľavým tlačidlom na ikonu v SysTray hlavné okno aplikácie a po kliknutí pravým tlačidlom jednoduchý dialóg na potvrdenie ukončenia aplikácie. V tejto časti ukážem ako ikone pridať vyskakovacie menu, aktivované kliknutím pravým tlačidlom. I tento príklad, hoci veľmi jednoduchý, je dôležitý, pretože po jeho pochopení nebudete mať problém navrhnúť plnohodnotnú aplikáciu s ikonou v oznamovacej oblasti pomocou PyGTK.

Riešenie

Po pochopení tajomstiev, vypísaných nižšie, dokážete navrhnúť aplikáciu s ikonou v SysTray takto jednoducho:

  • navrhnúť svoju aplikáciu ako normálne,
  • po otestovaní svojej aplikácie pridať ikony do systémovej oblasti pomocou gtk.StatusIcon,
  • skryť svoju hlavnú aplikáciu takže jediná viditeľná vec je ikona v SysTray,
  • spustiť hlavnú slučku,
  • zobraziť svoju hlavnú aplikáciu po kliknutí ľavým tlačidlom myši na ikonu v SysTray,
  • pridať vyskakovacie menu do obsluhy kliknutia pravým tlačidlom na ikonu v Systray.

Vzorový kód

import gtk, sys

# obsluha kliknutia ľavým tlačidlom
def on_activate(statusicon):
    global window, app_status
    if app_status:
        statusicon.set_tooltip('Kliknite ľavým na zobrazenie okna GTK')
        window.hide_all()
        app_status = 0
    else:
        statusicon.set_tooltip('Kliknite pravým na skrytie okna GTK')
        window.show_all()
        app_status = 1

# obsluha kliknutia pravým tlačidlom
def on_popup(statusicon, button, activate_time):
    menu = gtk.Menu()                                       # poznámka 1

    mabout = gtk.ImageMenuItem('O programe')                # poznámka 2
    image = gtk.image_new_from_stock(gtk.STOCK_ABOUT,
                                     gtk.ICON_SIZE_MENU)
    mabout.set_image(image)
    mabout.connect("activate", show_about_dialog)

    mquit = gtk.ImageMenuItem('Koniec')
    image = gtk.image_new_from_stock(gtk.STOCK_QUIT,
                                     gtk.ICON_SIZE_MENU)
    mquit.set_image(image)
    mquit.connect("activate", gtk.main_quit)

    menu.append(mabout)
    menu.append(mquit)
    menu.show_all()
    menu.popup(None, None,                                  # poznámka 3
               gtk.status_icon_position_menu,
               button,
               activate_time,
               statusicon)

def show_about_dialog(widget):                              # poznámka 4
    about_dialog = gtk.AboutDialog()

    about_dialog.set_destroy_with_parent(True)
    about_dialog.set_name('Príklad StatusIcon')
    about_dialog.set_version('1.0')
    about_dialog.set_authors(['Slavko'])

    about_dialog.run()
    about_dialog.destroy()

# nastavenie okna GTK
window = gtk.Window()
window.set_title(sys.argv[0])
window.set_size_request(300, 140)
window.set_position(gtk.WIN_POS_CENTER_ALWAYS)
window.connect('destroy', gtk.main_quit)
vbox = gtk.VBox()
window.add(vbox)
vbox.pack_start(gtk.Label("Klikli ste ľavým tlačidlom\
na ikonu v SysTray!"))
vbox.pack_start(gtk.Label("Kliknite ešte raz a skryjete toto okno."))

# nastavenie ikony SysTray
statusicon = gtk.StatusIcon()
statusicon.set_from_stock(gtk.STOCK_NETWORK)
statusicon.set_tooltip('Kliknite ľavým na zobrazenie okna GTK')
app_status = 0
statusicon.connect('activate', on_activate)
statusicon.connect('popup_menu', on_popup)

window.hide_all()
gtk.main()

Vysvetlenie

  1. Vytvorenie GTK menu pomocou gtk.Menu().
  2. Pridanie položiek menu pomocou gtk.ImageMenuItem(), nastavenie obrázku a pripojenie obslužnej funkcie.
  3. Zobrazenie vyskakovacieho menu.
  4. Funkcia na zobrazenie dialógu o programe pomocou gtk.AboutDialog().