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: 14540
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: 13110
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.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Sirius3
User
Beiträge: 17750
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