Seite 1 von 1

Buttons dynamisch erstellen, mit lambda argument übergeben

Verfasst: Sonntag 27. Mai 2018, 12:36
von Blackshie
Ich möchte gerne Buttons dynamisch über eine For schleife erstellen lassen.
Jeder Button soll auf eine Funktion zugreifen mit jeweils einem anderen Wert als Argument.

Ich hab verschieden Dinge ausprobiert bin aber nicht auf eine Lösung gekommen.
Es wird immer nur der letzte Wert als Argument übergeben.

Ich habe zu meinem Problem einen einfachen Beispielcode geschrieben.

Code: Alles auswählen

import tkinter as tk


def print_number(n):
    print(n)
    

werte = ["Hallo", "Test", 12 , 65, 34, "Test3"]

main = tk.Tk()

# Buttons
buttons = {}
for i in range(6):
    buttons[i] = tk.Button(main, text=i, command=lambda:print_number(werte[i]), font="Arial 12")
    buttons[i].pack()

main.mainloop()

Re: Buttons dynamisch erstellen, mit lambda argument übergeben

Verfasst: Sonntag 27. Mai 2018, 13:07
von Sirius3
Das Problem ist hier im Forum schon mindestens 232mal aufgetreten. lambdas haben keinen eigenen Namensraum, so dass immer der aktuelle, also letzte Wert von `i` genommen wird. deshalb benutzt man partial statt lambda:

Code: Alles auswählen

from functools import partial
import tkinter as tk

def print_number(n):
    print(n)

werte = ["Hallo", "Test", 12 , 65, 34, "Test3"]

main = tk.Tk()

# Buttons
buttons = {}
for i, wert in enumerate(werte):
    buttons[i] = tk.Button(main, text=i, command=partial(print_number, wert), font="Arial 12")
    buttons[i].pack()

main.mainloop()

Re: Buttons dynamisch erstellen, mit lambda argument übergeben

Verfasst: Sonntag 27. Mai 2018, 13:31
von Blackshie
Okay danke funktioniert super,

partial war mir nicht bekannt.