Ich bin neu im Programmieren von Pygame. Ich habe auch vorher nie mit Python gearbeitet.
Für meine Firma habe ich jetzt eine Zeitmessung für unsere Wasserrutschen programmiert.
Gerne würde ich von euch wissen was Ihr von meinem Script haltet?
Er Funktioniert genau so wie ich es möchte. Ich habe aber das Gefühl das er sehr Kompliziert geschrieben wurde und das ich einiges wegglasen könnte.
Vielen Dank wen sich jemand die Zeit nimmt und meinen Script einmal durchliest.
Ich bin für alle Bemerkungen offen.
Wie erwähnt: Lasst Gnade mit mir walten. Ich bin neu im Programmieren.
Ich möchte einfach einmal ein ehrliches Feedback von Leuten die das Programmieren besser beherrschen als ich.
Vielen Dank für eure Hilfe.
Code: Alles auswählen
#!/usr/bin/python
#Import aller Funktionen
import RPi.GPIO as GPIO
import pygame, sys
import time
import logging
import os
from datetime import datetime
import pygame.font
from pygame.colordict import THECOLORS
from pygame.locals import *
from random import randint
#GPIO Setup und Definition
GPIO.setmode(GPIO.BCM)
GPIO.setwarnings(False)
switch = 8 # pin 24
switch1 = 7 # pin 26
GPIO.setup(switch,GPIO.IN, pull_up_down=GPIO.PUD_UP)
GPIO.setup(switch1,GPIO.IN, pull_up_down=GPIO.PUD_UP)
#Prüfen ob benötigte Ordner existieren, wenn nicht erstellen
if not os.path.exists('/home/pi/Rutschenstatistik'):
os.makedirs('/home/pi/Rutschenstatistik')
if not os.path.exists('/home/pi/Rutschenstatistik/Rekorde'):
os.makedirs('/home/pi/Rutschenstatistik/Rekorde')
if not os.path.exists('/home/pi/Rutschenstatistik/Jahresrekord'):
os.makedirs('/home/pi/Rutschenstatistik/Jahresrekord')
#Definition der Dateinamen und Ordner
file = datetime.now().strftime('Rutschenstatistik %Y_%m_%d')
file2 = datetime.now().strftime('/home/pi/Rutschenstatistik/Rutschenstatistik %Y_%m_%d.log')
file3 = datetime.now().strftime('Rekorde %Y_%m_%d')
file4 = datetime.now().strftime('/home/pi/Rutschenstatistik/Rekorde/Rekorde %Y_%m_%d.log')
file5 = datetime.now().strftime('/home/pi/Rutschenstatistik/Jahresrekord/Jahresrekord %Y.log')
file6 = datetime.now().strftime('Jahresrekord %Y')
#Definition der Logdateien
logger = logging.getLogger(file)
logger1 = logging.getLogger(file3)
logger2 = logging.getLogger(file6)
hdlr = logging.FileHandler(file2)
hdlr1 = logging.FileHandler(file4)
hdlr2 = logging.FileHandler(file5)
formatter = logging.Formatter('%(asctime)s %(levelname)s %(message)s')
hdlr.setFormatter(formatter)
hdlr1.setFormatter(formatter)
hdlr2.setFormatter(formatter)
logger.addHandler(hdlr)
logger1.addHandler(hdlr1)
logger2.addHandler(hdlr2)
logger.setLevel(logging.INFO)
logger1.setLevel(logging.INFO)
logger2.setLevel(logging.INFO)
#Einlesen des Jahresrekord aus Logdatei, wenn keine Datei vorhanden Rekord auf 59s setzen
try:
logfile = open(file5)
file_lines = logfile.readlines()[-1]
x = file_lines
x.split(" ")
a,b,c,d,e = x.split(" ")
e = e[:-2]
msg10 = e
logfile.close()
except (IOError, IndexError):
e = "59.000"
#Definition der Farben, Bildschirmgrösse, Schrift und Surface Objekten
redColor = pygame.Color(255,0,0)
greenColor = pygame.Color(255,255,0)
blueColor = pygame.Color(0,255,255)
yellowColor = pygame.Color(255,255,0)
greyColor = pygame.Color(0,0,0)
pygame.init()
width = 1920
height = 1080
windowSurfaceObj = pygame.display.set_mode((width,height))
windowSurfaceObj1 = pygame.display.set_mode((width,height))
windowSurfaceObj2 = pygame.display.set_mode((width,height))
windowSurfaceObj3 = pygame.display.set_mode((width,height))
pygame.display.set_caption('Black Hole')
font_path = '/usr/share/fonts/truetype/lato/Lato-Bold.ttf'
fontObj1 = pygame.font.Font(font_path,545)
fontObj2 = pygame.font.Font(font_path,219)
fontObj3 = pygame.font.Font(font_path,202)
fontObj = pygame.font.Font(font_path,202)
fullscreen = True
video_flags = fullscreen and FULLSCREEN
resolution = pygame.display.list_modes()[0]
surface = pygame.display.set_mode(resolution, video_flags)
pygame.mouse.set_visible(0)
#Bild laden für Bildschirmschoner
BA = pygame.image.load('BA3.png')
BA2 = pygame.image.load('BA3.png')
BA2 = pygame.transform.scale(BA2, (742, 514))
#Verzögerung des Bildschirmschoners
timesc = 90
#Festlegen der Länge der Rutsche
distanz = 100 #in Meter
factor = 3.6 #Rechnungsfaktor
#Laden des Grundbildes
msg6 = "s"
msg9 = "s "
#Aktuelle Zeit
msg = "00.000"
msgSurfaceObj = fontObj1.render(msg+msg6, 1,redColor)
msgRectobj = msgSurfaceObj.get_rect()
msgRectobj.center =(960,200)
windowSurfaceObj.blit(msgSurfaceObj, msgRectobj)
#Gestoppte Zeit und Geschwindikeit
msg1 = "00.000"
msg3 = "00.00"
msg5 = "km/h"
msg1SurfaceObj = fontObj2.render(msg1+msg9+msg3+msg5, 1,blueColor)
msg1Rectobj = msg1SurfaceObj.get_rect()
msg1Rectobj.center =(960,550)
windowSurfaceObj1.blit(msg1SurfaceObj, msg1Rectobj)
#Tagesrekord
msg2 = "59.000"
msg4 = "Tagesrekord "
msg2SurfaceObj = fontObj.render(msg4+msg2+msg6, 1,greenColor)
msg2Rectobj = msg2SurfaceObj.get_rect()
msg2Rectobj.center = (960,760)
windowSurfaceObj2.blit(msg2SurfaceObj, msg2Rectobj)
#Jahresrekord
msg10 = e
msg11 = "Jahresrekord "
msg3SurfaceObj = fontObj3.render(msg11+msg10+msg6, 1,greenColor)
msg3Rectobj = msg3SurfaceObj.get_rect()
msg3Rectobj.midbottom = (960,1080)
windowSurfaceObj3.blit(msg3SurfaceObj, msg3Rectobj)
pygame.display.update()
logger.info('Stopwatch gestartet')
#Grundwerte einstellen
save = 0
scsaver = 1
down = 1
reset = 1
go = 0
s = 59
now2 = 0
start = 0
start2 = time.time()
while True:
event = pygame.event.poll()
if GPIO.input(switch1)==0 and s>10 and go==1:
go = 0
save = 1
if GPIO.input(switch)==0 and s>=10:
down = 0
go = 1
if go==1:
scsaver = 0
if down == 0:
start = time.time()
now = time.time() - start
speed = time.time() - start
m,s = divmod(now,60)
h,m = divmod(m,60)
msg= "%02d" % (s)
psec = str(now-int(now))
pstr = psec[1:5]
msg = msg + str(pstr)
pygame.draw.rect(windowSurfaceObj,greyColor,Rect(0,0,width,height))
msgSurfaceObj = fontObj1.render(msg+msg6, 1,redColor)
msgRectobj = msgSurfaceObj.get_rect()
msgRectobj.center =(960,200)
windowSurfaceObj.blit(msgSurfaceObj, msgRectobj)
msg1SurfaceObj = fontObj2.render(msg1+msg9+msg3+msg5, 1,blueColor)
msg1Rectobj = msg1SurfaceObj.get_rect()
msg1Rectobj.center =(960,550)
windowSurfaceObj1.blit(msg1SurfaceObj, msg1Rectobj)
msg2SurfaceObj = fontObj.render(msg4+msg2+msg6, 1,greenColor)
msg2Rectobj = msg2SurfaceObj.get_rect()
msg2Rectobj.center =(960,760)
windowSurfaceObj2.blit(msg2SurfaceObj, msg2Rectobj)
msg3SurfaceObj = fontObj3.render(msg11+msg10+msg6, 1,greenColor)
msg3Rectobj = msg3SurfaceObj.get_rect()
msg3Rectobj.midbottom = (960,1080)
windowSurfaceObj3.blit(msg3SurfaceObj, msg3Rectobj)
pygame.display.update()
down = 1
if s>=59:
go = 0
scsaver = 1
start2 = time.time()
x = randint(630,2000)
y = randint(460,1100)
s = 50
if save==1:
time.sleep(0.5)
msg1 = msg
msg8 = ((distanz)/(speed)*(factor))
msg7 = round(msg8, 2)
msg3= str(msg7)
if msg2 >= msg1:
msg2 = msg1
logger1.info(msg4+msg2+msg6)
if msg10 >= msg2:
msg10 = msg2
logger2.info(msg11+msg10+msg6)
pygame.draw.rect(windowSurfaceObj1,greyColor,Rect(0,0,width,height))
msg1SurfaceObj = fontObj2.render(msg1+msg9+msg3+msg5, 1,blueColor)
msg1Rectobj = msg1SurfaceObj.get_rect()
msg1Rectobj.center =(960,550)
windowSurfaceObj1.blit(msg1SurfaceObj, msg1Rectobj)
msgSurfaceObj = fontObj1.render(msg+msg6, 1,redColor)
msgRectobj = msgSurfaceObj.get_rect()
msgRectobj.center =(960,200)
windowSurfaceObj.blit(msgSurfaceObj, msgRectobj)
msg2SurfaceObj = fontObj.render(msg4+msg2+msg6, 1,greenColor)
msg2Rectobj = msg2SurfaceObj.get_rect()
msg2Rectobj.center =(960,760)
windowSurfaceObj2.blit(msg2SurfaceObj, msg2Rectobj)
msg3SurfaceObj = fontObj3.render(msg11+msg10+msg6, 1,greenColor)
msg3Rectobj = msg3SurfaceObj.get_rect()
msg3Rectobj.midbottom = (960,1080)
windowSurfaceObj3.blit(msg3SurfaceObj, msg3Rectobj)
logger.info(msg1+msg9+msg3+msg5)
scsaver = 1
start2 = time.time()
x = randint(630,2000)
y = randint(460,1100)
pygame.display.update()
save = 0
reset = 0
if scsaver==1:
now2 = time.time() - start2
if now2>=timesc and now2<=timesc + 30:
#Logo anzeigen
surface.fill((greyColor))
msgRectobjBA = BA.get_rect()
msgRectobjBA.center =(960,540)
windowSurfaceObj.blit(BA, msgRectobjBA)
pygame.display.update()
if now2>=timesc + 30 and now2<=timesc + 60:
#Logo anzeigen
surface.fill((greyColor))
sgRectobjBA = BA2.get_rect()
msgRectobjBA.center =(x,y)
windowSurfaceObj.blit(BA2, msgRectobjBA)
pygame.display.update()
if now2>=timesc + 60:
start2 = time.time()
start2 = start2 - 90
x = randint(630,2000)
y = randint(480,1100)
pygame.display.update()
if event.type == pygame.KEYDOWN: #Tastatureingabe
if event.key == pygame.K_ESCAPE: #ESC um das Programm zu schliessen
sys.exit()
if event.key == pygame.K_f: #Taste F um den Vollbildmodus zu aktivieren
fullscreen = True
video_flags = fullscreen and FULLSCREEN
resolution = pygame.display.list_modes()[0]
surface = pygame.display.set_mode(resolution, video_flags)
pygame.mouse.set_visible(0)
if event.key == pygame.K_q: #Taste Q um den Vollbildmodus zu beenden
fullscreen = False
video_flags = fullscreen and FULLSCREEN
resolution = pygame.display.list_modes()[0]
surface = pygame.display.set_mode(resolution, video_flags)
pygame.mouse.set_visible(1)
if event.key == pygame.K_s: #Taste S um den Startimpuls zu simulieren
down = 0
go = 1
if event.key == pygame.K_z: #Taste Z um den Stopimpuls (Ziel) zu Simulieren
go = 0
save = 1