Oddělení grafiky od logiky v aplikacích Tkinter
Někdy můžete chtít, aby jste udržovali odděleně grafický návrh okna (tedy kod, kde se generuje vzhled okna) od vlastního kodu programu (tedy co se stane když ..., co má které tlačítko dělat). Jinými slovy tedy chcete mít v jednom souboru (modulu) kod na grafiku a v druhém tento modul importujete a přidáte logiku - funkce, které se volají při událostech.
Tato metoda není vhodná pro absolutní začátečníky, neboť vyžaduje jistou míru programátorských zkušeností. Také se nedá použít v případech, když ke tvorbě gui používáte TkinterGUIBuilders.
Řešení se nabízí několik.
Statické metody
# modul.py # -*- coding: utf-8 -*- from Tkinter import * class rozhrani: def __init__(self, master, callback): self.callback = callback self.master = master self.master.title("test") def zpracuj(self): prochazej = Button(self.master, text = 'OK', command = self.callback.test) prochazej.grid(row = 0, column = 0, sticky = 'w')
# mujProgram.py # -*- coding: utf-8 -*- from Tkinter import * import modul class Callback: @staticmethod def test(): print "test v hlavnim programu" root = Tk() gui = modul.rozhrani(root, Callback) gui.zpracuj() root.mainloop()
Děděním a přetížením
# grafika.py # -*- coding: utf-8 -*- from Tkinter import * class rozhrani: def __init__(self, master): master.title("test") self.prochazej=Button(master, text='OK', command=self.test) self.prochazej.grid(row=0, column=0, sticky='w') def test(self): pass
# mujProgram.py # -*- coding: utf-8 -*- from Tkinter import * import grafika class mojeRozhrani(grafika.rozhrani): def test(self): print "test v hlavnim programu" root = Tk() gui = mojeRozhrani(root) root.mainloop()
Použití command nebo bind až v hlavním programu
Grafika:
# grafika.py # -*- coding: utf-8 -*- from Tkinter import * class rozhrani: def __init__(self, master): master.title("test") self.prochazej=Button(master, text='OK') self.prochazej.grid(row=0, column=0, sticky='w')
command
# mujProgram.py # -*- coding: utf-8 -*- from Tkinter import * import grafika def test(): print "test v hlavnim programu" root = Tk() gui = grafika.rozhrani(root) gui.prochazej["command"] = test root.mainloop()
bind:
# mujProgram.py # -*- coding: utf-8 -*- from Tkinter import * import grafika def test(udalost): print "test v hlavnim programu" root = Tk() gui = grafika.rozhrani(root) gui.prochazej.bind("<1>", test) root.mainloop()