[python] Tkinter a OOP

Pavel Svobodník pavel na svobodnik.cz
Čtvrtek Únor 8 21:16:33 CET 2007


Pavel Kosina napsal(a):
> 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). 
toto jsem opravil
> 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ě.
>
>   
hlavní část programu jsem upravil takto, ale nerozumím tomu co bych si 
pomohl když musím znova vytvořit funkci
zpracuj. to přece bude v modul.py zbytečně? nebo jsem to blbě pochopil 
protože s OOP teprve začínám?

# -*- coding: utf-8 -*-
from Tkinter import *
import modul

def test():
    print "test"
   
class x(modul.rozhrani):
    def zpracuj(self, master):
        prochazej=Button(master, text='OK', command=test)
        prochazej.grid(row=0, column=0, sticky='w')

root = Tk()
gui=x(root)
gui.zpracuj(root)

> 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).
>   
tak toto budu muset ještě dostudovat
> Něco k tomu možná i na 
> http://www.nabble.com/separation-gui-from-logic-t498927.html#a1354241 .
>   
a toto taky

Pavel Svobodník


Další informace o konferenci Python