Tkinter Button command= mit Parameter?

1 Antwort

Vom Fragesteller als hilfreich ausgezeichnet

Deine Lambdas beziehen sich auf eine Variable aus dem for-Scope. Da die mit jeder Iteration geändert wird, hast du später auch nicht mehr den Wert in ihr, den sie bei Kapselung im Lambda hatte.

Eine Lösung wäre die Wertübergabe in eine neue Variable, die im Lambda-Scope liegt.

Beispiel:

lambda fixed_value=value: print(fixed_value))

Wieso du im Übrigen keine einfache Liste zur Speicherung deiner Buttons verwendest und dir stattdessen irgendwelche globablen Variablen zusammenbaust, kann ich nicht nachvollziehen. Ebenso ist die Art, den Schleifenindex mitzuzählen, nicht der übliche Python-Weg.

Ich habe einmal ein kürzeres Skript angelegt, aus dem du Verbesserungsvorschläge ziehen kannst:

import tkinter

def say_hello(name):
    print("Hello", name)

with open("person_list.txt", "r") as file:
  persons = [line.rstrip() for line in file]

x = 20
y = 20

root = tkinter.Tk()
person_buttons = []

for index, person in enumerate(persons):
  print(index)

  button = tkinter.Button(root, text=person, command=lambda name=person: say_hello(name))
  button.place(x=x, y=y)

  person_buttons.append(person)

  y += 40

tkinter.mainloop()

Sollte deine Datei sehr viele Zeilen beinhalten, wäre es besser, sie in einer klassischen Schleife zeilenweise einzulesen:

persons = []

with open("person_list.txt", "r") as file:
  for line in file:
    persons.append(line.rstrip())