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()