[python] Tkinter a OOP

Pavel Kosina geon na post.cz
Čtvrtek Únor 8 20:15:00 CET 2007


Pavel Svobodník napsal(a):
> Dobrý den, tak opět jsem narazil na jeden problém který nevím jak 
> vyřešit a tak jsem se rozhodl poprosit o pomoc
> Mám program ve kterém mám různé funkce a do kterého importuju modul.py 
> ve kterém mám garfické rozhraní.
> Toto grafické rozhraní bych chtěl udržovat odděleně ve vlastním modulu 
> od ostatního kódu.
> Ale mám problém s tím jak donutit button OK k tomu aby zavolal funkci 
> test() v hlavním programu ne v importovaném modulu.
> Děkuju za radu
> Pavel Svobodník
>
> obsah modul.py
> # -*- coding: utf-8 -*-
> from Tkinter import *
>
> class rozhrani:
>     def __init__(self, master):
>         master.title("test")
>     def zpracuj(self, master):
>         prochazej=Button(master, text='OK', command=test)
>         prochazej.grid(row=0, column=0, sticky='w')
>     def test(self):
>        print "test gui"
> if __name__=="__main__":
>     root = Tk()
>     app = rozhrani(root)
>     app.zpracuj(root)
>     root.mainloop()
>
>   
Tak jednak máš v tomto programu chybu, která nedovolí jeho funkčnost. 
Bud musíš volat command=self.test, nebo def test vysunout ven z definice 
třídy (a odstranit self ze závorky). Pokud to uděláš, bude to fungovat, 
ale stále jinak než chceš.
> program do kterého modul importuju
> # -*- coding: utf-8 -*-
> from Tkinter import *
> import modul
>
> root = Tk()
> gui=modul.rozhrani(root)
> gui.zpracuj(root)
>
> def test():
>     print "test v hlavnim programu"
>
>   
Myslím, že budeš muset v tomto hlavním programu vytvořit novou třídu, 
která bude potomkem modul.rozhraní, a ve které přetypuješ funkci zpracuj 
(vlastně ji opíšeš). Když definici funkce test() dáš na začátek 
programu, mělo by ti fungovat, jako mně.

Pokud chceš ale důsledně oddělit grafiku od kodu, možná bys mohl místo 
command používat v hlavním modulu bind (+četné úpravy kodu).

Něco k tomu možná i na 
http://www.nabble.com/separation-gui-from-logic-t498927.html#a1354241 .


-- 
geon
Pavel Kosina



Další informace o konferenci Python