Kategória: Python

Zmenené: 20. august 2011

Ikona v Systray (3)

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. V tejto časti ukážem ako prepojiť ikonu s kliknutím pravým tlačidlom, pričom po kliknutí pravým tlačidlom bude zobrazené dialógové okno na potvrdenie ukončenia aplikácie. 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,
  • ukončiť aplikáciu po kliknutí pravým tlačidlom myši na ikonu v Systray,
  • pridanie vyskakovacieho menu do obsluhy kliknutia pravým tlačidlom bude v ďalšom článku (do vyskakovacieho menu, aktivovaného pravým tlačidlom myši, možno pridať niektoré najčastejšie používané funkcie).

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):
    dialog = gtk.MessageDialog(                             # poznámka 2
        parent         = None,
        flags          = gtk.DIALOG_DESTROY_WITH_PARENT,
        type           = gtk.MESSAGE_INFO,
        buttons        = gtk.BUTTONS_OK_CANCEL,
        message_format = "Chcete ukončiť túto aplikáciu?"
        )
    dialog.set_title('Vyskakovacie okno')
    response = dialog.run()
    dialog.destroy()
    if response == gtk.RESPONSE_YES:                         # poznámka 3
        gtk.main_quit()

# 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)                  # poznámka 1
window.hide_all()
gtk.main()

Vysvetlenie

  1. Nastavenie obsluhy udalosti kliknutia pravým tlačidlom myši.
  2. Nastavenie potvrdzovacieho dialógu pomocou gtk.MessageDialog.
  3. Testovanie odpovede na dialóg a prípadné ukončenie aplikácie.