Schleifen Problem

Fragen zu Tkinter.
Antworten
202
User
Beiträge: 1
Registriert: Dienstag 27. Dezember 2022, 22:06

Hallo an alle, ich habe ein Problem mit meinem Programm:

Code: Alles auswählen

def test():
    pass


# gui
window = Tk()
window.title('Darz\xc3\xa4hler')

# variablen


zahlen = [
    0,
    1,
    2,
    3,
    4,
    5,
    6,
    7,
    8,
    9,
    10,
    11,
    12,
    13,
    14,
    15,
    16,
    17,
    18,
    19,
    20,
]

test=[ ]

files = [ ] 

for i in range(len(zahlen)): 
    files.append(i)
for i in range(len(files)):
    
    test.append(Button(window, text=files[i], command=test))
   
    test[i].grid(row=i, column=0)


# mainloop

mainloop()
Ich will mit einer for-Schleife Buttons erschaffen, die auch eine funktion haben(funktion noch nicht implementiert),allerdings sehe ich keine möglichkeit, wie ich die buttons abfragen kann nachdem sie von der for-Schleife erstellt wurden.Wenn ich will das z.B. wenn ich einen Button drücke mit der beschriftung 10, dass von einer beliebigen zahl die 10 abgezogen werden. Das gleiche gilt auch für andere buttons z.B bei dem button 20 werden immer 20 abgezogen usw.
Ich hoffe ihr verstehet was ich meine...
Vielen Dank im voraus!
Benutzeravatar
sparrow
User
Beiträge: 4195
Registriert: Freitag 17. April 2009, 10:28

Warum schreibst du denn die Zahlen von 0 bis 20 in eine Liste? Das schreit doch sehr danach mit einer for-Schleife oder einer List Comprehension gemacht zu werden.

In diesem Fall aber beides unnötig. Die Buttons sollten in der for-Schleife erstellt werden, die mit range() über die Werte iteriert.

Du suchst eine Möglichkeit "test" Parameter zu übergeben. Dafür brauchst du partial. Ist hier schon sehr oft besprochen worden.
Sirius3
User
Beiträge: 17754
Registriert: Sonntag 21. Oktober 2012, 17:20

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.
Antworten