Funktionsparameter teilweise übergeben

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
thinkfree
User
Beiträge: 3
Registriert: Montag 22. September 2008, 18:17

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?
yipyip
User
Beiträge: 418
Registriert: Samstag 12. Juli 2008, 01:18

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
thinkfree
User
Beiträge: 3
Registriert: Montag 22. September 2008, 18:17

yupp super danke! genau das hab ich gesucht! :-)
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

Die übergebenen event-Objekte haben ein Datenattribut num, in dem die Maustaste (nur die Nr. als int) gekapselt ist. Das braucht du nur abzurufen.
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Im Modul "functools" gibt es außerdem noch die Funktion "partial".
Antworten