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()
Python Schleife
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.
- __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
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.
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()