Auch wenn Du das in Deinem Code ganz vergessen hast, *-Importe benutzt man nicht, Tkinter wird üblicherweise per `import tkinter as tk` importiert und alle Namen über tk. angesprochen.
Du bedeckst Deine Funktion `test` mit der Liste `test`, so dass das command-Argument gar keine Funktion übergeben bekommt.
Die Liste `zahlen` wird gar nicht wirklich verwendet, könnte man mit range allerdings auch deutlich kürzer schreiben. `files` enthält Zahlen, der Variablenname ist also maximal verwirrend. Über einen Index iteriert man nicht, sondern direkt über die Elemente der Liste.
Kommentare sollte erklären, warum da was steht, und nicht wiederholen, was eh schon dasteht.
Dann sollte alles noch in Funktionen gepackt werden:
Code: Alles auswählen
import tkinter as tk
from functools import partial
def test(number):
print(number)
def main():
window = tk.Tk()
window.title('Darzähler')
numbers = range(21)
buttons = []
for row_index, number in enumerate(numbers):
button = tk.Button(window, text=number, command=partial(test, number))
button.grid(row=row_index, column=0)
buttons.append(button)
tk.mainloop()
if __name__ == "__main__":
main()
Für jede etwas komplexere GUI braucht man aber Klassendefinitionen, denn das übergeben von Variablen per partial wird relativ schnell sehr unübersichtlich.