Hallo,
ich grabe meinen Thread von vergangener Woche nochmal aus. Ich heute endlich mal wieder ein bisschen zum Programmieren gekommen und habe mit 3 Lichtern ein Programm geschrieben, das unter anderem eine Art Autoampel darstellen kann. Man kann auch einstellen, wie oft die Ampel durchlaufen soll (habe das nochnicht variabel gemacht, sondern als erstes Mal "3" als Anzahl Durchläufe angegeben.
Das Ganze funktioniert auch soweit, aber ich wollte meinen Code mal zeigen, ob der einigermaßen annehmbar ist. Da mein Wissen hauptsächlichnoch aus guten alten DOS-Tagen herkommt, bin ich sicher nicht ganz "up to date", insbesondere was GUI-Programmierung betrifft. Und ich möchte, wenn möglich, was dazulernen.
Besonders interessieren würde mich, ob man das Problem auch mit for oder while Schleifen lösen könnte (ich habs jedenfalls nicht hingekriegt). Vielmehr habe ich den Eindruck, dass in der GUI-Programmierung anstatt for und while diese after-Funktionen genutzt werden oder sehe ich das falsch?
Für eine Beantwortung meiner Fragen, schon der Neugierde wegen, würde ich mich sehr freuen.
Horand
Hier poste ich mal den Code:
import RPi.GPIO as GPIO
import tkinter
import tkinter.font as tkf
import time
class Hauptprogramm:
def __init__(self):
self.root = tkinter.Tk()
buttonweite = 50
buttonhoehe = 5
myfont = tkf.Font(family='DejaVuSans', size=20)
self.anzeige = tkinter.Label(self.root, width=50, height=buttonhoehe, borderwidth = 5, relief = "groove", font = myfont)
self.anzeige.grid(column=0, row=0, columnspan=2, padx=10, pady=15)
self.rotbutton= tkinter.Button(self.root, text = "Rot leuchtet", width=buttonweite, height= buttonhoehe, command = self.rot_anschalten).grid(column=0,row=1,sticky="W")
self.gelbbutton = tkinter.Button(self.root, text = "Gelb leuchtet",width=buttonweite, height = buttonhoehe, command = self.gelb_anschalten).grid(column=0,row=2, sticky="W")
self.gruenbutton = tkinter.Button(self.root, text = "Grün leuchtet",width = buttonweite, height = buttonhoehe, command = self.gruen_anschalten).grid(column=0,row=3, sticky="W")
self.endebutton = tkinter.Button(self.root, text = "Ende", width = buttonweite, height = buttonhoehe, command = self.ende).grid(column=1,row=4, sticky= "E")
self.buttonautoampel = tkinter.Button(self.root, text = "Autoampel", width=buttonweite, height=buttonhoehe,command=self.autoampel_vorbereiten).grid(column=1,row=1)
self.rot = 4
self.gelb = 17
self.gruen = 27
self.status()
self.alles_aus()
#self.check_durchlauf_beendet()
def rot_anschalten(self):
GPIO.output(self.gelb,0)
GPIO.output(self.gruen,0)
GPIO.output(self.rot,1)
def gelb_anschalten(self):
GPIO.output(self.rot,0)
GPIO.output(self.gruen,0)
GPIO.output(self.gelb,1)
def gruen_anschalten(self):
GPIO.output(self.rot,0)
GPIO.output(self.gelb,0)
GPIO.output(self.gruen,1)
def alles_aus(self):
GPIO.output(self.rot,0)
GPIO.output(self.gelb,0)
GPIO.output(self.gruen,0)
def ende(self):
GPIO.cleanup()
self.root.destroy()
def autoampel_vorbereiten(self):
self.anzahl_eingeben = tkinter.Entry(self.root, text="Wie oft?",)
self.anzahl_eingeben.grid(column=1,row=10)
self.autoampel(12)
self.check_durchlauf_beendet(3,0)
def check_durchlauf_beendet(self,anzahl,start):
if self.durchlauf_beendet == False:
print ("falsch")
if self.durchlauf_beendet == True and anzahl >= start:
start +=1
print ("richtig")
print ("Startwert= ",start)
self.autoampel(12)
if self.durchlauf_beendet == True and anzahl < start:
print ("Ende")
return
self.root.after(200, self.check_durchlauf_beendet,anzahl,start)
def autoampel(self,count):
#while self.anzahl_durchlaeufe != zaehlvariable:
print (count)
self.durchlauf_beendet = False
if count <= 12 and count>7:
self.rot_anschalten()
count -= 1
if count <= 7 and count>5:
self.gelb_anschalten()
count -=1
if count <=5:
self.gruen_anschalten()
count -=1
if count == 0:
GPIO.output(self.gruen,0)
if count <= -1 and count >=-5:
self.gruen_anschalten()
if count == -6 or count ==-7:
self.gelb_anschalten()
if count <-7 and count >-12:
self.rot_anschalten()
if count == -12:
self.alles_aus()
count == 12
self.durchlauf_beendet = True
#zaehlvariable +
return
#zaehlvariable +=1
self.root.after(1000,self.autoampel,count)
def status(self):
if GPIO.input(self.rot):
self.anzeige["text"] = "rot leuchtet"
self.anzeige["bg"] = "red"
elif GPIO.input(self.gelb):
self.anzeige["text"] = "gelb leuchtet"
self.anzeige["bg"] = "yellow"
elif GPIO.input(self.gruen):
self.anzeige["text"] = "grün leuchtet"
self.anzeige["bg"] = "green"
else:
self.anzeige["text"] = "nix leuchtet"
self.anzeige["bg"] = "white"
self.root.after(200,self.status)
def main():
try:
GPIO.setwarnings(False)
GPIO.setmode(GPIO.BCM)
GPIO.setup(4, GPIO.OUT)
GPIO.setup(17, GPIO.OUT)
GPIO.setup(27, GPIO.OUT)
hauptprogramm = Hauptprogramm()
hauptprogramm.root.mainloop()
finally:
GPIO.cleanup()
#Hauptprogramm
if __name__ == '__main__':
main()
Display More