@toper: Du machst das genau so wie `Button`: Wer auch immer Deine Klasse benutzt muss eine Rückruffunktion übergeben die Deine Klasse dann immer aufruft wenn ein Button gedrückt wurde.
Wobei die Klasse die Du da zeigst keine Klasse ist. Da stimmt so einiges nicht, angefangen bei der Schreibweise des Namens der Klasse selbst, bis zu dem Umstand das die keine Methoden hat.
Namen werden in Python klein_mit_unterstrichen geschrieben. Ausnahmen sind Konstanten (KOMPLETT_GROSS) und Klassen (MixedCase). Die Klasse müsste also `Menu` heissen. Nur das es wie gesagt keine Klasse ist, sondern einfach nur zwei Funktionen die ohne Not in eine Klasse gestopft wurden. Das kann man einfach sein lassen, ohne das sich etwas ändert ausser dem Zugriff auf die Funktion.
Der Name `Button` ist zudem irreführend weil das ja offenbar mehr als ein Button ist, also `buttons` heissen sollte. Und `text` sollte `texts` heissen. Denn man braucht den Namen `text` dann ja für einen einzelnen Text wenn man das ``for i in range(…):`` „anti pattern“ beseitigt. Man verwendet in Python nur selten einen Laufindex um damit dann auf Sequenzen zuzugreifen. Man kann in Python direkt über die Elemente von Sequenzen iterieren. Will man ”parallel” über mehr als eine Sequenz iterieren gibt es die `zip()`-Funktion, und falls man zusätzlich eine laufende Zahl braucht, die `enumerate()`-Funktion.
Den ``lambda``-Hack mit dem Defaultwert für das Argument macht man nicht mehr seit dem es `functools.partial()` gibt.
Der `place()`-Aufruf macht mich ein bisschen sprachlos‽ Dementsprechend bin ich mir bei dem Funktionsnamen auch nicht wirklich sicher, denn ich weiss nicht so recht was der Sinn dieser Funktion ist.
Was übrig bleibt:
Code: Alles auswählen
#!/usr/bin/env python3
from functools import partial
def menu_start(buttons):
texts = ["1", "2", "3", "4"]
for i, (button, text) in enumerate(zip(buttons, texts)):
button.config(text=text, command=partial(print, i))
#
# WTF‽
#
button.place(x=0, y=0, width=100, height=50)