Python


Dogodki

Čas je, da se poglobimo v filozofijo programiranja grafičnih uporabniških vmesnikov.Pri čistem tekstovno usmerjenem programiranju bo prišlo do interakcije z uporabnikom, ko povemo programu, da naj čaka na vnos  s strani uporabnika. (tako smo na primer klicali funkcijo "raw_input()". V svetu GUI pa le naredimo vmesnik, ki nato čaka na akcije uporabnika. In tu pridejo do izraza dogodki.

Tvorba programov tipa GUI poteka v dveh korakih. Najprej naredimo grafični uporabniški vmesnik (Graphical User Interface, krajše GUI) z uporabo najbolj primernih widgetov. Nato povemo programu (v primeru Pythona je to Tk), da naj vstopi v dogodkovno zanko, ki čaka nastope dogodkov, te pa nato primerno obdela oziroma izvede ustrezno akcijo. Dogodki nastopajo, ko uporabnik kaj naredi, na primer klikne na gumb miške ali tipko tipkovnice. Da bi lahko prišlo do odziva na dogodek, moramo povezati akcijo z dogodkom.

Tkinter nudi učinkovit mehanizem za delo z dogodki. Za vsak widget lahko povežemo (bind) Pythonove funkcije oziroma metode z dogodki na naslednji način:

    widget.bind(dogodek, funkcija)

Če se dejanski dogodek ujema z dogodkom, navedenim v povezavi, kliče program  funkcijo, kot argument funkcije pa podamo dogodek (ki je v bistvu poseben objekt z določenimi lastnostmi oziroma člani).

Tu je primer, ko "lovimo" klike na okno:

# File: bind1.py

from Tkinter import *

koren = Tk() # koren (root) grafične aplikacije

def narediNekaj(dogodek):
print "Kliknil si na", dogodek.x, dogodek.y

okno = Frame(koren, width=100, height=100)
okno.bind("<Button-1>", narediNekaj)
frame.pack()

koren.mainloop()

V tem primeru smo uporabili okensko metodo "bind" za navezavo na odzivno (callback) funkcijo "narediNekaj" na dogodek  tipa <Button-1>.


Poženi program in ga preskusi.. Pojavi se okno. Kadarkoli klikneš z levim mišjim gumbom na okno, se v konzolnem oknu izpiše nekaj takega:
Kliknil si na 45  65


Program se nahaja v "bind1.pyw"
.

Dogodki so tudi sami po sebi objekti.  Namesto, da bi tratili čas z opisom sintakse, si oglejmo, katere dogodke imamo na voljo oziroma kako jih imenujemo ter kaj pomenijo:

Možnost Opis
<Button-1>

Na widget smo kliknili z mišjim gumbom. . "Button-1" je levi mišji gumb, "Button -2" je srednji gumb, "Button -3" je desni mišji gumb. Ko kliknemo z mišjim gumbom znotraj widgeta, Tk avtomatsko "zajame" kurzor miške in pošlje odzivni funkciji widgeta  mišji dogodek. V članih x in y dogodkovnega objekta  imamo na voljo trenutno pozicijo kurzorja miške. 

Namesto Button  lahko uporabljamo  ButtonPress, lahko pa to besedico povsem opustimo: <Button-1>, <ButtonPress-1> in <1> so sinonimi. Morda je zaradi jasnosti sintaksa <Button-1> najbolj primerna.

<B1-Motion>

Premaknili smo miš in pri tem držali gumb 1 (za srednji gumb uporabimo B2, za desni pa  B3). V članih x in y dogodkovnega objekta  imamo na voljo trenutno pozicijo kurzorja miške. 

<ButtonRelease-1>

Sprostili smo levi gumb (Button 1). V članih x in y dogodkovnega objekta  imamo na voljo trenutno pozicijo kurzorja miške. .

<Double-Button-1>

Dvokliknili smo na gumb 1. Uporabimo lahko predponi Double ali Triple. Če povežemo (bind) tako enojni klik (<Button-1>) kot dvoklik, bosta klicani obe povezavi.

<Enter>

Kurzor miške je vstopil v widget (ta dogodek ne pomeni, da smo kliknili na tipko Enter!).

<Leave>

Kurzor miške je zapustil widget.

<Return>

Na tipkovnici smo kliknili na tipko Enter. Povežemo lahko praktično vse tipke tipkovnice. Pri klasični tipkovnici s  102 tipkama imamo posebne tipke Cancel (tipka Break), BackSpace, Tab, Return (oziroma Enter), Shift_L (katerakoli tipka s tipko Shift), Control_L (katerakoli tipka skupaj s tipko Control), Alt_L (katerakoli tipka s tipko Alt), Pause, Caps_Lock, Escape, Prior (Page Up), Next (Page Down), End, Home, Left, Up, Right, Down, Print, Insert, Delete, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, Num_Lock in  Scroll_Lock.

<Key>

Kliknili smo na katerokoli tipko tipkovnice. Pomen tipke dobimo v članu char dogodkovnega objekta, posredovanega odzivni funkciji ( v primeru posebnih tipk je to prazen niz).

a

Vtipkali smo "a". Tako lahko uporabljamo večino izpisnih znakov. Izjeme so presledek (<space*>)  ter less than (<less*>). Opozorilo:  1 je povezava tipke,  <1> pa je povezava mišjega gumba.

<Shift-Up>

Kliknili smo na puščico navzgor (Up), medtem ko smo držali tipko Shift. Uporabljamo lahko predpone Alt, Shift in Control.

<Configure>

widget je spremenil svojo velikost size (ali, na nekaterih platformah lokacijo). Odzivna funkcija dobi novo velikost v atributih  width in height dogodkovnega objekta.