Buttons dynamisch erstellen, mit lambda argument übergeben

Fragen zu Tkinter.
Antworten
Benutzeravatar
Blackshie
User
Beiträge: 13
Registriert: Mittwoch 17. Januar 2018, 15:45

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()
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

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()
Benutzeravatar
Blackshie
User
Beiträge: 13
Registriert: Mittwoch 17. Januar 2018, 15:45

Okay danke funktioniert super,

partial war mir nicht bekannt.
Antworten