Seite 1 von 1
Simulation
Verfasst: Donnerstag 4. März 2021, 11:57
von Pineapple.x16
was muss ich dabei verändern, dass das eine fussgaengerampel wird?:
Code: Alles auswählen
from tkinter import *
# Ereignisbehandlung
def buttonWeiterClick():
if canvas.itemcget(id_rot, 'fill') == 'red' and \
canvas.itemcget(id_gelb, 'fill') == 'gray' and \
canvas.itemcget(id_gruen, 'fill') == 'gray':
# aktueller Zustand: rot
# naechster Zustand: rotgelb
canvas.itemconfigure(id_gelb, fill='yellow')
elif canvas.itemcget(id_rot, 'fill') == 'red' and \
canvas.itemcget(id_gelb, 'fill') == 'yellow' and \
canvas.itemcget(id_gruen, 'fill') == 'gray':
# aktueller Zustand: rotgelb
# naechster Zustand: grün
canvas.itemconfigure(id_rot, fill='gray')
canvas.itemconfigure(id_gelb, fill='gray')
canvas.itemconfigure(id_gruen, fill='green')
elif canvas.itemcget(id_rot, 'fill') == 'gray' and \
canvas.itemcget(id_gelb, 'fill') == 'gray' and \
canvas.itemcget(id_gruen, 'fill') == 'green':
# aktueller Zustand: grün
# naechster Zustand: gelb
canvas.itemconfigure(id_rot, fill='gray')
canvas.itemconfigure(id_gelb, fill='yellow')
canvas.itemconfigure(id_gruen, fill='gray')
elif canvas.itemcget(id_rot, 'fill') == 'gray' and \
canvas.itemcget(id_gelb, 'fill') == 'yellow' and \
canvas.itemcget(id_gruen, 'fill') == 'gray':
# aktueller Zustand: gelb
# naechster Zustand: rot
canvas.itemconfigure(id_rot, fill='red')
canvas.itemconfigure(id_gelb, fill='gray')
canvas.itemconfigure(id_gruen, fill='gray')
# Erzeugung des Fensters
tkFenster = Tk()
tkFenster.title('Ampel')
tkFenster.geometry('170x240')
# Zeichenfläche
canvas = Canvas(master=tkFenster, bg='blue')
canvas.place(x=5, y=5, width=160, height=190)
# Ampelkasten
canvas.create_rectangle(65, 10, 95, 110, fill='black')
# Stange
canvas.create_rectangle(78, 110, 82, 180, fill='black')
# Rot-Licht
id_rot = canvas.create_oval(70, 20, 90, 40, fill='red')
# Gelb-Licht
id_gelb = canvas.create_oval(70, 50, 90, 70, fill='gray')
# Grün-Licht
id_gruen = canvas.create_oval(70, 80, 90, 100, fill='gray')
# Button zum Weiterschalten
buttonWeiter = Button(master=tkFenster, text='weiter', command=buttonWeiterClick)
buttonWeiter.place(x=5, y=210, width=160, height=20)
# Ereignisschleife starten
tkFenster.mainloop()
Re: Simulation
Verfasst: Donnerstag 4. März 2021, 12:21
von Sirius3
*-Importe sind schlecht, weil man damit unkontrolliert hunderte Namen in den eigenen Namensraum schaufelt. Tkinter wird üblicherweise via `import tkinter as tk` importiert.
Variablennamen und Funktionen werden nach Konvention komplett klein geschrieben. Typen haben in Namen nichts verloren, also images statt imageListe.
Man benutzt kein place, sondern plaziert Widgets mit pack oder grid, je nach dem, was man erreichen will.
Wurde Dir alles schon gesagt, geändert hast Du davon aber nichts. Warum?
Dann muß eine Funktion alles, was sie braucht per Argumente bekommen. Hier hilft functools.partial.
Statt alles explizit als Code auszuprogrammieren und dabei viel Code zu kopieren, benutzt man passende Datenstrukturen.
Alles in allem kommt man auf soetwas:
Code: Alles auswählen
import tkinter as tk
from functools import partial
AMPEL_STATES = {
('red', 'gray', 'gray'): ('red', 'yellow', 'gray'),
('red', 'yellow', 'gray'): ('gray', 'gray', 'green'),
('gray', 'gray', 'green'): ('gray', 'yellow', 'gray'),
('gray', 'yellow', 'gray'): ('red', 'gray', 'gray'),
}
def button_weiter_click(canvas, ids):
state = tuple(canvas.itemcget(id, 'fill') for id in ids)
new_state = AMPEL_STATES[state]
for id, color in zip(ids, new_state):
canvas.itemconfigure(id, fill=color)
def main():
fenster = tk.Tk()
fenster.title('Ampel')
fenster.geometry('170x240')
canvas = tk.Canvas(master=fenster, bg='blue', width=160, height=190)
canvas.pack()
# Ampelkasten
canvas.create_rectangle(65, 10, 95, 110, fill='black')
canvas.create_rectangle(78, 110, 82, 180, fill='black')
id_rot = canvas.create_oval(70, 20, 90, 40, fill='red')
id_gelb = canvas.create_oval(70, 50, 90, 70, fill='gray')
id_gruen = canvas.create_oval(70, 80, 90, 100, fill='gray')
button_weiter = tk.Button(master=fenster, text='weiter', command=partial(button_weiter_click, canvas, [id_rot, id_gelb, id_gruen]))
button_weiter.pack()
fenster.mainloop()
if __name__ == "__main__":
main()
Wie unterscheidet sich eine Fußgängerampel von einer solchen Ampel? Und wo schaffst Du es nicht, die Anpassungen anzubringen? Du hast es ja anscheinend auch geschafft, eine normale Ampel zu programmieren.
Re: Simulation
Verfasst: Donnerstag 4. März 2021, 16:26
von Pineapple.x16
hmmm.. bin ich irgendwie blind, oder funktioniert mein programm genauso wie deins? Oder wo liegt da der unterschied, außer, dass das anders programmiert worden ist?
Re: Simulation
Verfasst: Donnerstag 4. März 2021, 16:50
von __deets__
Das macht das Gekichers wie deines. Nur kompakter und besser zu verstehen dadurch. Womit deine Aufgabe, das zu erweitern, leichter wird.
Re: Simulation
Verfasst: Donnerstag 4. März 2021, 17:03
von Sirius3
Das Programm kann man natürlich noch mehr verallgemeinern, dass Anpassungen noch einfacher werden:
Code: Alles auswählen
import tkinter as tk
from functools import partial
AMPEL_STATES = [
('gray', 'gray', 'red'),
('gray', 'yellow', 'red'),
('green', 'gray', 'gray'),
('gray', 'yellow', 'gray')
]
def button_weiter_click(canvas, ids):
state = tuple(canvas.itemcget(id, 'fill') for id in ids)
new_index = (AMPEL_STATES.index(state) + 1) % len(AMPEL_STATES)
for id, color in zip(ids, AMPEL_STATES[new_index]):
canvas.itemconfigure(id, fill=color)
def main():
fenster = tk.Tk()
fenster.title('Ampel')
fenster.geometry('170x240')
canvas = tk.Canvas(master=fenster, bg='blue', width=160, height=190)
canvas.pack()
# Ampelkasten
count = len(AMPEL_STATES[0])
canvas.create_rectangle(65, 100-30*count, 95, 110, fill='black')
canvas.create_rectangle(78, 110, 82, 180, fill='black')
ids = [
canvas.create_oval(70, 80 - 30*i, 90, 100 - 30*i, fill=color)
for i, color in enumerate(AMPEL_STATES[0])
]
button_weiter = tk.Button(master=fenster, text='weiter', command=partial(button_weiter_click, canvas, ids))
button_weiter.pack()
fenster.mainloop()
if __name__ == "__main__":
main()
Re: Simulation
Verfasst: Freitag 5. März 2021, 18:31
von Pineapple.x16
aber eine fussgaenger ampel hat doch nur zwei farben oder nicht?
Re: Simulation
Verfasst: Freitag 5. März 2021, 18:35
von __deets__
Und da steht doch ein Beispiel, was man dann macht. Heisser Tipp: waehrend der Gelbphase der "grossen" Ampel hat die Fussgaengerampel welche Farbe?
Re: Simulation
Verfasst: Freitag 5. März 2021, 19:17
von Pineapple.x16
__deets__ hat geschrieben: Freitag 5. März 2021, 18:35
Und da steht doch ein Beispiel, was man dann macht. Heisser Tipp: waehrend der Gelbphase der "grossen" Ampel hat die Fussgaengerampel welche Farbe?
entweder grün oder rot, stimmts?
Re: Simulation
Verfasst: Freitag 5. März 2021, 19:19
von __deets__
Und welche von denen? Oder ist das egal?
Re: Simulation
Verfasst: Freitag 5. März 2021, 19:30
von Pineapple.x16
__deets__ hat geschrieben: Freitag 5. März 2021, 19:19
Und welche von denen? Oder ist das egal?
je nach dem würd ich sagen
Re: Simulation
Verfasst: Freitag 5. März 2021, 19:49
von __deets__
Na dann, wenn die Mutti bei deiner Ampelschaltung den Kinderwagen schon auf die Straße schiebt, obwohl die Autofahrer noch gelb haben, ist das auch ein bisschen je nach dem.
Re: Simulation
Verfasst: Freitag 5. März 2021, 19:59
von Pineapple.x16
__deets__ hat geschrieben: Freitag 5. März 2021, 19:49
Na dann, wenn die Mutti bei deiner Ampelschaltung den Kinderwagen schon auf die Straße schiebt, obwohl die Autofahrer noch gelb haben, ist das auch ein bisschen je nach dem.
ja dann rot. aber dann hätte man doch nur zwei farben, oder?
ich habe das jetzt so gemacht:
Code: Alles auswählen
from tkinter import *
# Ereignisbehandlung
def buttonWeiterClick():
if canvas.itemcget(id_rot, 'fill') == 'red' and \
canvas.itemcget(id_gruen, 'fill') == 'gray':
# aktueller Zustand: rot
# naechster Zustand: rotgruen
canvas.itemconfigure(id_gruen, fill='green')
elif canvas.itemcget(id_rot, 'fill') == 'red' and \
canvas.itemcget(id_gruen, 'fill') == 'gray':
# aktueller Zustand: rotgruen
# naechster Zustand: grün
canvas.itemconfigure(id_rot, fill='gray')
canvas.itemconfigure(id_gruen, fill='green')
elif canvas.itemcget(id_rot, 'fill') == 'gray' and \
canvas.itemcget(id_gruen, 'fill') == 'green':
# aktueller Zustand: grün
# naechster Zustand: rot
canvas.itemconfigure(id_rot, fill='gray')
canvas.itemconfigure(id_gruen, fill='gray')
elif canvas.itemcget(id_rot, 'fill') == 'gray' and \
canvas.itemcget(id_gruen, 'fill') == 'gray':
# aktueller Zustand: grün
# naechster Zustand: rot
canvas.itemconfigure(id_rot, fill='red')
canvas.itemconfigure(id_gruen, fill='gray')
# Erzeugung des Fensters
tkFenster = Tk()
tkFenster.title('Ampel')
tkFenster.geometry('170x240')
# Zeichenfläche
canvas = Canvas(master=tkFenster, bg='blue')
canvas.place(x=5, y=5, width=160, height=190)
# Ampelkasten
canvas.create_rectangle(65, 10, 95, 110, fill='black')
# Stange
canvas.create_rectangle(78, 110, 82, 180, fill='black')
# Rot-Licht
id_rot = canvas.create_oval(70, 20, 90, 40, fill='red')
# Grün-Licht
id_gruen = canvas.create_oval(70, 80, 90, 100, fill='gray')
# Button zum Weiterschalten
buttonWeiter = Button(master=tkFenster, text='weiter', command=buttonWeiterClick)
buttonWeiter.place(x=5, y=210, width=160, height=20)
# Ereignisschleife starten
tkFenster.mainloop()
aber das funktioniert nicht wirklich....
Re: Simulation
Verfasst: Freitag 5. März 2021, 21:34
von kbr
Pineapple.x16 hat geschrieben: Freitag 5. März 2021, 19:17
entweder grün oder rot, stimmts?
Falls es Dir für die Argumentation in der Schule hilft: es gibt eine Stadt in Deutschland, die Gelbphasen für Fußgängerampeln hat

Re: Simulation
Verfasst: Freitag 5. März 2021, 21:37
von Pineapple.x16
kbr hat geschrieben: Freitag 5. März 2021, 21:34
Pineapple.x16 hat geschrieben: Freitag 5. März 2021, 19:17
entweder grün oder rot, stimmts?
Falls es Dir für die Argumentation in der Schule hilft: es gibt eine Stadt in Deutschland, die Gelbphasen für Fußgängerampeln hat
naja hab bisher nur eine mit gelb, rot gesehen (für fußgänger)
Re: Simulation
Verfasst: Freitag 5. März 2021, 21:40
von Pineapple.x16
und selbst wenn das gelb haben sollte- die programme laufen alle doch irgendwie gleich ab, ob von mir oder von den zwei anderen, oder habe ich mich da versehen? ..... ich möchte doch einfach nur wissen, wie man das als Fußgängerampel machen kann... bitte helft mir doch... ich bin echt sehr verzweifelt...
Re: Simulation
Verfasst: Freitag 5. März 2021, 22:01
von __blackjack__
@Pineapple.x16: Vorgegeben ist Dir ja die Autofahrerampel. Wenn Du die verstanden hast, dann kannst Du die auch relativ einfach in eine Fussgängerampel umbauen. Falls Du die nicht verstehst, dann musst Du sie verstehen lernen. Das kann Dir keiner abnehmen, das musst *Du* lernen. Es wird Dir hier eher niemand eine Lösung liefern die so aussieht als hätte sie ein Anfänger aus der vorgegebenen Ampel gebastelt.
Du kannst gerne konkrete Fragen stellen wo Du etwas nicht verstehst. Aber eben nicht eine Frage die im Grunde nach einer Komplettlösung fragt.
Re: Simulation
Verfasst: Freitag 5. März 2021, 22:13
von Pineapple.x16
__blackjack__ hat geschrieben: Freitag 5. März 2021, 22:01
@Pineapple.x16: Vorgegeben ist Dir ja die Autofahrerampel. Wenn Du die verstanden hast, dann kannst Du die auch relativ einfach in eine Fussgängerampel umbauen. Falls Du die nicht verstehst, dann musst Du sie verstehen lernen. Das kann Dir keiner abnehmen, das musst *Du* lernen. Es wird Dir hier eher niemand eine Lösung liefern die so aussieht als hätte sie ein Anfänger aus der vorgegebenen Ampel gebastelt.
Du kannst gerne konkrete Fragen stellen wo Du etwas nicht verstehst. Aber eben nicht eine Frage die im Grunde nach einer Komplettlösung fragt.
ja was sind denn die vier anderen anweisungen, die das nach rechts undso verschieben?
Re: Simulation
Verfasst: Freitag 5. März 2021, 23:24
von __blackjack__
@Pineapple.x16: Dazu musst Du die Verschiebung verstehen die es bereits gibt. Was verstehst Du an der nicht?