@Goswin
Ob man 'lambda' oder 'partial' verwendet, haengt im allgemeinen nicht vom Problem ab, man muss die Sachen nur richtig anwenden.
Um das Ganze mal aufzudröseln, ein einfaches Beispiel mit lambda:
Code: Alles auswählen
import Tkinter as tk
class Gui(object):
def __init__(self):
self.root = tk.Tk()
self.buttons = [tk.Button(self.root, width=20, text='{0}'.format(i),
command=lambda j=i: self.do_command(j)) for i in xrange(9)]
for but in self.buttons:
but.pack()
for i, but in enumerate(self.buttons):
but.bind('<Button-1>', lambda event, j=i: self.do_binding(event, j))
def do_command(self, i):
print 'command {0}'.format(i)
def do_binding(self, event, i):
print 'binding {0} {1}'.format(i, event.widget)
def run(self):
self.root.mainloop()
if __name__ == '__main__':
Gui().run()
Und hier mit partial:
Code: Alles auswählen
import Tkinter as tk
from functools import partial
class Gui(object):
def __init__(self):
self.root = tk.Tk()
self.buttons = [tk.Button(self.root, width=20, text='{0}'.format(i),
command=partial(self.do_command, i)) for i in xrange(9)]
for but in self.buttons:
but.pack()
for i, but in enumerate(self.buttons):
but.bind('<Button-1>', partial(self.do_binding, i))
def do_command(self, i):
print 'command {0}'.format(i)
def do_binding(self, i, event):
print 'binding {0} {1}'.format(i, event.widget)
def run(self):
self.root.mainloop()
if __name__ == '__main__':
Gui().run()