[Python-de] Tkinter und bind

Georg Mischler schorsch at schorsch.com
Sat May 4 14:14:55 EDT 2002


Jan Voges wrote:

>
> Hallo!
>
> On 4 May 2002 at 12:22, Georg Mischler wrote:
>
> > Damit sollte dein Lambda folgendermassen aussehen:
> >
> >   item["command"] = lambda event,x=names[n] : prn(x)
>
> Das funktioniert bei mir erst (PythonWin 2.1.1), wenn ich
> event initialisiere, wohl weil da kein bind() im Spiel ist,
> das die Initialisierung vornimmt (Begründung richtig?).
>
>    item["command"] = lambda event=4711,x=names[n] : prn(x)
>
>    item.bind("<Button-3>", lambda e,x=names[n] : prn(x))



Was heisst "funktioniert nicht" bei dir?
Die Begruendung ist allerdings in jedem Fall falsch... ;)


>>> def prn(x): print x
...
>>> item = {}
>>> names = ['n0', 'n1', 'n2', 'n3']
>>> n = 0
>>> item["command"] = lambda event,x=names[n] : prn(x)
>>> item
{'command': <function <lambda> at 0x81b45f4>}
>>> item['command']() # falscher Aufruf (kein Argument)
Traceback (most recent call last):
  File "<stdin>", line 1, in ?
  TypeError: <lambda>() takes at least 1 argument (0 given)
>>> item['command']('blah') # korrekter Aufruf
n0


Wenn du natuerlich sicher stellen willst, dass das Lambda
auch beim Aufruf ohne Argument "funktioniert" (was bei der
vorgesehenen Verwendung per bind() nicht vorkommt), dann
solltest du tatsaechlich auch dem "event"-Parameter einen
Vorgabewert geben, typischerweise None.


-schorsch

-- 
Georg Mischler  --  simulations developer  --  schorsch at schorsch.com
+schorsch.com+  --  lighting design tools  --  http://www.schorsch.com/




More information about the Python-de mailing list