Python Schleife

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
brauni
User
Beiträge: 2
Registriert: Samstag 4. April 2020, 17:51

Hallo, bin vor 14 Tagen in Python eingestiegen und habe nach langem Kampf einen Code geschrieben.
Jetzt versuche ich die zwei Kreise nach dem drücken des Button´s automatisch laufen zu lassen.Ist das mit einer while Schleife zu machen oder bin ich da total verkehrt unterwegs.
Bin seit Tagen damit beschäftigt bekomme es einfach nicht hin.Bitte helft mir!!!!
hier mein Code:
from tkinter import*

tkFenster = Tk()
tkFenster.title('Ampel')
tkFenster.geometry('170x240')


def buttonWeiterClick():


if canvas.itemcget(id_rot, 'fill') == "black" and \
canvas.itemcget(id_gelb, 'fill') == 'black':

canvas.itemconfigure(id_gelb, fill='yellow')



elif canvas.itemcget(id_rot, 'fill') == "black" and \
canvas.itemcget(id_gelb, 'fill') == 'yellow':

canvas.itemconfigure(id_rot, fill='red')
canvas.itemconfigure(id_gelb, fill='black')


elif canvas.itemcget(id_rot, 'fill') == "red" and \
canvas.itemcget(id_gelb, 'fill') == 'black':

canvas.itemconfigure(id_rot, fill='black')
canvas.itemconfigure(id_gelb, fill='yellow')



canvas = Canvas(master=tkFenster, background="black")
canvas.place(x=5, y=5, width=590, height=350)


id_rot = canvas.create_oval(70, 20, 90, 40, fill='black')
id_gelb = canvas.create_oval(70, 50, 90, 70, fill='black')



# Button zum Weiterschalten
buttonWeiterClick = Button(master=tkFenster, text='weiter', command=buttonWeiterClick)
buttonWeiterClick.place(x=5, y=210, width=160, height=20)

tkFenster.mainloop()
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Du bist total falsch unterwegs, der Weg um Animationen und anderen wiederkehrende Dinge zu tun ist mit der after-Methode. Wird hier oft und ausfuehrlich diskutiert, bitte im tkinter Unterforum mal ein bisschen stoebern.
brauni
User
Beiträge: 2
Registriert: Samstag 4. April 2020, 17:51

o.k.danke , sonst hätte ich wohl noch Monate probiert.
Benutzeravatar
__blackjack__
User
Beiträge: 14052
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@brauni: Man würde auch eher nicht den Ampelzustand über die Farben lösen die GUI-Elemente haben sondern unabhängig davon modellieren. Eine GUI ist zur dazu da mit dem Benutzer zu kommunizieren, nicht um Daten und Zustände zu speichern.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
Sirius3
User
Beiträge: 18272
Registriert: Sonntag 21. Oktober 2012, 17:20

Benutze keine *-Importe, keine globalen Variablen und auf oberster Ebene sollten nur Konstanten und Definitionen stehen.
Eingerückt wird immer mit 4 Leerzeichen pro Ebene, nicht mal 1 und mal 7.
Backslash sollte man nicht benutzen, sondern statt dessen intelligent Klammern.
Statt langer if-elif-Kaskaden benutzt man am besten eine passende Datenstruktur.
Der Button buttonWeiterClick überdeckt die Funktion buttonWeiterClick, das sollte nicht sein.
Alles was eine Funktion braucht, sollte sie über ihre Argumente bekommen.
`place` sollte man nicht benutzen. Bei mir sieht das Canvas ganz schief aus.

Code: Alles auswählen

import tkinter as tk
from functools import partial

NEXT_STATE = {
    ("black", "black"): ("black", "yellow"),
    ("black", "yellow"): ("red", "black"),
    ("red", "black"): ("black", "yellow"),
}

def button_weiter_click(canvas, id_rot, id_gelb):         
    color_rot, color_gelb = NEXT_STATE[
        canvas.itemcget(id_rot, 'fill'),
        canvas.itemcget(id_gelb, 'fill')
    ]
    canvas.itemconfigure(id_rot, fill=color_rot)
    canvas.itemconfigure(id_gelb, fill=color_gelb)

def main():
    fenster = tk.Tk()
    fenster.title('Ampel')
    canvas = tk.Canvas(fenster, background="black", width=190, height=350)
    canvas.pack()
    id_rot = canvas.create_oval(70, 20, 90, 40, fill='black')
    id_gelb = canvas.create_oval(70, 50, 90, 70, fill='black')

    # Button zum Weiterschalten
    tk.Button(fenster, text='weiter', command=partial(
        button_weiter_click, canvas, id_rot, id_gelb)).pack()
    fenster.mainloop()

if __name__ == '__main__':
    main()
Antworten