--------- Mensaje reenviado -------- > De: Michael Lange <klappn...@web.de> > Para: tkinter-discuss@python.org > Asunto: Re: [Tkinter-discuss] lambda function to simplify > Fecha: Fri, 17 Dec 2010 22:30:44 +0100 > > Hi, > > Thus spoketh craf <p...@vtr.net> > unto us on Fri, 17 Dec 2010 15:16:22 -0300: > > (...) > > I have access to the function (greeting) from the button and the window > > close button. > > > > It works fine, but wanted to know whether the use of lambda (lambda), > > can be expressed in another way more elegant and less confusing. > > > > If I understand you correctly, your problem is that the event callback > receives the event instance as argument but the wm_protocol() doesn't? > You can circumvent this by defining a default value for the event > parameter, as in: > > class App: > def __init__(self, master): > self.root = master > self.b1 = Tkinter.Button(master) > self.b1.pack() > self.b1.bind('<Button-1>', self.foo) > self.root.protocol('WM_DELETE_WINDOW', self.foo) > > def foo(self, event=None): > greeting(self) > > In most cases it is probably even better (and less confusing) to avoid > calling externally defined functions whereever possible and define prefer > class methods instead, as in: > > class App: > def __init__(self, master): > self.root = master > self.b1 = Tkinter.Button(master) > self.b1.pack() > self.b1.bind('<Button-1>', self.foo) > self.root.protocol('WM_DELETE_WINDOW', self.foo) > > def foo(self, event=None): > self.root.destroy() > > BTW, I am not sure if you are aware of this, root.destroy() is already > defined as default callback for WM_DELETE_WINDOW in Tkinter.py, so it's > kind of redundant here; although it won't make much difference in most > situations, some people say the canonical way ending a Tkinter app is to > end the mainloop with root.quit() instead and destroy() the window > after the mainloop ended, as in: > > root = Tk() > root.protocol('WM_DELETE_WINDOW', root.quit) > (...)# a lot of code here > root.mainloop() > root.destroy() > > That's what they do in IDLE, for example. > > Regards > > Michael > > > > .-.. .. ...- . .-.. --- -. --. .- -. -.. .--. .-. --- ... .--. . .-. > > Without facts, the decision cannot be made logically. You must rely on > your human intuition. > -- Spock, "Assignment: Earth", stardate unknown > _______________________________________________ > Tkinter-discuss mailing list > Tkinter-discuss@python.org > http://mail.python.org/mailman/listinfo/tkinter-discuss
Hi Michael. Sorry, I do not explain well what I wanted ;=) My guess is that if the instruction... self.root.protocol('WM_DELETE_WINDOW', lambda:((lambda e,widget=self:greeting(widget))(self.root))) can be shortened to occupy the same line? It's for a better understanding of the code. Regards Cristian AbarzĂșa _______________________________________________ Tkinter-discuss mailing list Tkinter-discuss@python.org http://mail.python.org/mailman/listinfo/tkinter-discuss