Seite 1 von 1

Funktionsparameter teilweise übergeben

Verfasst: Montag 22. September 2008, 20:09
von thinkfree
Hallo,

ich habe ein kleines Problem, was den "eleganten" Umgang mit Events angeht. Und zwar habe ich folgenden Code, der so funktioniert, aber offensichtlich nicht im Sinne des Erfinders ist:

Code: Alles auswählen

self.CAN.bind("<Button-1>", self.frameclick1)
self.CAN.bind("<Button-3>", self.frameclick2)

def frameclick1(self, event):
    self.frameclick(event, 0)

def frameclick2(self, event):
    self.frameclick(event, 1)

def frameclick(self, event, i):
    ...
Ich denke man sieht, was das Problem ist: Ich möchte in nur einer Funktion auf Links- und Rechtsklick reagieren, muss aber die Maustaste dazu wissen.

Intuitiv möchte ich das:

Code: Alles auswählen

self.CAN.bind("<Button-1>", self.frameclick(i=0))
D.h. i=0 wird bereits festgelegt und event wird dann "dazu übergeben". Aber so geht es jedenfalls nicht (3 arguments expected, 2 given...)

Wie löst man das am elegantesten?

Verfasst: Montag 22. September 2008, 20:37
von yipyip
Du suchst höchstwahrscheinlich das hier:

Code: Alles auswählen

import Tkinter as tk

####

def func(event, i):

  print i

####
  
root = tk.Tk()

for i in range(1, 6):
  root.bind('<%s>' % i , lambda event, i=i: func(event, i))

root.mainloop()
:wink:
yipyip

Verfasst: Montag 22. September 2008, 20:56
von thinkfree
yupp super danke! genau das hab ich gesucht! :-)

Verfasst: Montag 22. September 2008, 20:56
von numerix
Die übergebenen event-Objekte haben ein Datenattribut num, in dem die Maustaste (nur die Nr. als int) gekapselt ist. Das braucht du nur abzurufen.

Verfasst: Dienstag 23. September 2008, 11:28
von EyDu
Im Modul "functools" gibt es außerdem noch die Funktion "partial".