[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