Simulation

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
Pineapple.x16
User
Beiträge: 38
Registriert: Donnerstag 4. Juni 2020, 20:55

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()
Sirius3
User
Beiträge: 18265
Registriert: Sonntag 21. Oktober 2012, 17:20

*-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.
Pineapple.x16
User
Beiträge: 38
Registriert: Donnerstag 4. Juni 2020, 20:55

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?
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Das macht das Gekichers wie deines. Nur kompakter und besser zu verstehen dadurch. Womit deine Aufgabe, das zu erweitern, leichter wird.
Sirius3
User
Beiträge: 18265
Registriert: Sonntag 21. Oktober 2012, 17:20

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()
Pineapple.x16
User
Beiträge: 38
Registriert: Donnerstag 4. Juni 2020, 20:55

aber eine fussgaenger ampel hat doch nur zwei farben oder nicht?
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Und da steht doch ein Beispiel, was man dann macht. Heisser Tipp: waehrend der Gelbphase der "grossen" Ampel hat die Fussgaengerampel welche Farbe?
Pineapple.x16
User
Beiträge: 38
Registriert: Donnerstag 4. Juni 2020, 20:55

__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?
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Und welche von denen? Oder ist das egal?
Pineapple.x16
User
Beiträge: 38
Registriert: Donnerstag 4. Juni 2020, 20:55

__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
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

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.
Pineapple.x16
User
Beiträge: 38
Registriert: Donnerstag 4. Juni 2020, 20:55

__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....
Benutzeravatar
kbr
User
Beiträge: 1507
Registriert: Mittwoch 15. Oktober 2008, 09:27

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 :)
Pineapple.x16
User
Beiträge: 38
Registriert: Donnerstag 4. Juni 2020, 20:55

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)
Pineapple.x16
User
Beiträge: 38
Registriert: Donnerstag 4. Juni 2020, 20:55

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...
Benutzeravatar
__blackjack__
User
Beiträge: 14030
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@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.
„A life is like a garden. Perfect moments can be had, but not preserved, except in memory. LLAP” — Leonard Nimoy's last tweet.
Pineapple.x16
User
Beiträge: 38
Registriert: Donnerstag 4. Juni 2020, 20:55

__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?
Benutzeravatar
__blackjack__
User
Beiträge: 14030
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Pineapple.x16: Dazu musst Du die Verschiebung verstehen die es bereits gibt. Was verstehst Du an der nicht?
„A life is like a garden. Perfect moments can be had, but not preserved, except in memory. LLAP” — Leonard Nimoy's last tweet.
Antworten