Edit detail for TkinterOddeleniGrafikyOdLogiky revision 2 of 1

2
Editor: geon
Time: 2011/10/12 20:25:49 GMT+2
Note: pridavani znacek 2x-3x

changed:
-
Oddělení grafiky od logiky v aplikacích Tkinter
=================================================
.. image:: py25.png
   :align: right


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




Oddělení grafiky od logiky v aplikacích Tkinter

py25.png

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