[Python-de] Tkinter und bind

Jan Voges jan.voges at gmx.de
Sat May 4 21:20:36 EDT 2002


Hallo!

On 4 May 2002 at 13:14, Georg Mischler wrote:

> 
> Was heisst "funktioniert nicht" bei dir?

  item["command"] = lambda event,x=names[n] : prn(x)

... hat bei Druck auf Button zur Folge ...

  Exception in Tkinter callback
  Traceback (most recent call last):
    File "C:\Python21\lib\lib-tk\Tkinter.py", line 1285, in __call__
      return apply(self.func, args)
  TypeError: <lambda>() takes at least 1 argument (0 given)

... also genau die Fehlermeldung, die Du unten mit der
leeren Argumentenliste provoziert hast.

  item["command"] = lambda event=None,x=names[n] : prn(x)

... dagegen funktioniert, gibt also die Button-Beschriftung aus.

> Die Begruendung ist allerdings in jedem Fall falsch... ;)

Hmm, so in etwa hatte das verstanden, was dazu in meinem 
schlauen Buch [1] steht, bei zugegeben nicht so guten
Englischkenntnissen. Zumindest wird da auf die unterschiedliche
Verhaltensweise von Callback-Funktionen bei direkter (bind()) 
und indirekter Bindung abgehoben. 

> >>> 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

Ok, das funktioniert bei mir genauso und ist auch 
einsichtig.
 
> 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.

Ja eben, das scheint ja bei der indirekten Bindung zu 
passieren, dass also prn() ohne Parameter aufgerufen wird,
wenn event nicht initialisert ist.

Jan

[1] Python and Tkinter Programming, John E. Grayson








More information about the Python-de mailing list