# Pakete importieren import pygame import pygame_gui from sense_hat import SenseHat from gpiozero import Button # Buttons definieren button1 = Button("BOARD11") button2 = Button("BOARD13") button3 = Button("BOARD29") # Pygame und Sense Hat starten pygame.mixer.pre_init(44100, -16, 2, 2048) pygame.init() pygame.mixer.init() sense = SenseHat() # LED-Matrix in Normalzustand versetzen sense.clear() # Hintergrundmusik starten pygame.mixer.music.load('noodleSoup.mp3') pygame.mixer.music.play(-1) pygame.mixer.music.set_volume(0.3) # Fenstergröße bestimmen screenX = 800 screenY = 600 # Farben mit RGB-Werten bestimmen WE = (255, 255, 255) SCHW = (0, 0, 0) ROT = (255, 0, 0) GR = (0, 255, 0) BL = (0, 0, 255) # Liste für FarbeButton Farben = [ROT, GR, BL] aktuelleFarbe = SCHW # Zähler für Farben_Button counter = 0 # Bedingung für while-Schleife durchlaufen = True # Fenstergröße und Hintergrundfarbe bestimmen pygame.display.set_caption('AirDraw') screen = pygame.display.set_mode((screenX, screenY)) screen.fill(WE) pygame.display.update() # GUI-Bereich definieren manager = pygame_gui.UIManager((screenX, screenY)) # farbeButton erzeugen farbeButton = pygame_gui.elements.UIButton(relative_rect=pygame.Rect((25, 20), (75, 50)), text='FARBE', manager=manager) # loeschButton erzeugen loeschButton = pygame_gui.elements.UIButton(relative_rect=pygame.Rect((125, 20), (83, 50)), text='LÖSCHEN', manager=manager) # resetButton erzeugen resetButton = pygame_gui.elements.UIButton(relative_rect=pygame.Rect((225, 20), (75, 50)), text='RESET', manager=manager) # Uhr für Bildwiederholrate und Abfrage der Buttons clock = pygame.time.Clock() # boolean zur Bestimmung des Zustandes des Stiftes zeichnen = False # Endposition des Stiftzeigers lastPos = (0, 0) # Radius vom Kreis, also Stiftdicke am Anfang bestimmen radius = 10 # boolean, um Loeschzustand zu bestimmen radierer = 0 # Bildwiederholrate auf 60 FPS, um Leistung zu minimieren timeDelta = clock.tick(60) / 1000.0 # Definition eines eignen Pygame-Events, um in der Methode pygame.event.get() zu erscheinen Draw = pygame.USEREVENT + 0 pygame.time.set_timer(Draw, 100) # Positionen des Mauscursors, um Buttons zu erreichen (zur Veranschaulichung) def startPosition(): { pygame.mouse.set_pos([screenX / 2, screenY / 2]) } def position1(): { pygame.mouse.set_pos([screenX - 742, screenY - 555]) } def position2(): { pygame.mouse.set_pos([screenX - 637, screenY - 555]) } def position3(): { pygame.mouse.set_pos([screenX - 542, screenY - 555]) } # Definition eines Teilfensters, welches als später als Zeichunung.bmp gespeichert wird rect = pygame.Rect(0, 70, 800, 500) sub = screen.subsurface(rect) screenshot = pygame.Surface((screenX, 500)) # Soundeffekte initialisieren sound_1 = pygame.mixer.Sound('decidemp.mp3') sound_1.set_volume(0.4) sound_2 = pygame.mixer.Sound('ding.mp3') sound_2.set_volume(0.4) sound_3 = pygame.mixer.Sound('woosh.mp3') sound_3.set_volume(0.4) # Mauszeiger in der Mitte des Malfensters startPosition() # Programm wird gestartet try: while durchlaufen: # alle externe Button-Events if button1.is_pressed: sound_1.play() position1() if aktuelleFarbe == WE: aktuelleFarbe = SCHW # set_pixels() zeigt im SenseHat die LEDS an sense.set_pixels( [(0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), (255, 0, 0), (255, 0, 0), (0, 0, 0), (0, 0, 0), (0, 255, 0), (0, 255, 0), (0, 0, 0), (0, 0, 0), (255, 0, 0), (255, 0, 0), (0, 0, 0), (0, 0, 0), (0, 255, 0), (0, 255, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 255), (0, 0, 255), (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 255), (0, 0, 255), (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0)]) pygame.time.delay(2500) sense.clear() else: counter = counter + 1 if counter == 1: aktuelleFarbe = Farben[0] sense.set_pixels( [(255, 255, 255), (255, 255, 255), (255, 255, 255), (255, 255, 255), (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), (255, 255, 255), (255, 0, 0), (255, 0, 0), (255, 255, 255), (0, 0, 0), (0, 255, 0), (0, 255, 0), (0, 0, 0), (255, 255, 255), (255, 0, 0), (255, 0, 0), (255, 255, 255), (0, 0, 0), (0, 255, 0), (0, 255, 0), (0, 0, 0), (255, 255, 255), (255, 255, 255), (255, 255, 255), (255, 255, 255), (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 255), (0, 0, 255), (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 255), (0, 0, 255), (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0)]) pygame.time.delay(2500) sense.clear() if counter == 2: aktuelleFarbe = Farben[1] sense.set_pixels([(0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), (255, 255, 255), (255, 255, 255), (255, 255, 255), (255, 255, 255), (0, 0, 0), (255, 0, 0), (255, 0, 0), (0, 0, 0), (255, 255, 255), (0, 255, 0), (0, 255, 0), (255, 255, 255), (0, 0, 0), (255, 0, 0), (255, 0, 0), (0, 0, 0), (255, 255, 255), (0, 255, 0), (0, 255, 0), (255, 255, 255), (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), (255, 255, 255), (255, 255, 255), (255, 255, 255), (255, 255, 255), (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 255), (0, 0, 255), (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 255), (0, 0, 255), (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0)]) pygame.time.delay(2500) sense.clear() if counter == 3: aktuelleFarbe = Farben[2] sense.set_pixels( [(0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), (255, 0, 0), (255, 0, 0), (0, 0, 0), (0, 0, 0), (0, 255, 0), (0, 255, 0), (0, 0, 0), (0, 0, 0), (255, 0, 0), (255, 0, 0), (0, 0, 0), (0, 0, 0), (0, 255, 0), (0, 255, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), (255, 255, 255), (255, 255, 255), (255, 255, 255), (255, 255, 255), (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), (255, 255, 255), (0, 0, 255), (0, 0, 255), (255, 255, 255), (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), (255, 255, 255), (0, 0, 255), (0, 0, 255), (255, 255, 255), (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), (255, 255, 255), (255, 255, 255), (255, 255, 255), (255, 255, 255)]) pygame.time.delay(2500) sense.clear() if counter == 4: aktuelleFarbe = SCHW sense.set_pixels( [(0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), (255, 0, 0), (255, 0, 0), (0, 0, 0), (0, 0, 0), (0, 255, 0), (0, 255, 0), (0, 0, 0), (0, 0, 0), (255, 0, 0), (255, 0, 0), (0, 0, 0), (0, 0, 0), (0, 255, 0), (0, 255, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), (255, 255, 255), (255, 255, 255), (255, 255, 255), (255, 255, 255), (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), (255, 255, 255), (0, 0, 0), (0, 0, 0), (255, 255, 255), (0, 0, 0), (0, 0, 255), (0, 0, 255), (0, 0, 0), (255, 255, 255), (0, 0, 0), (0, 0, 0), (255, 255, 255), (0, 0, 0), (0, 0, 255), (0, 0, 255), (0, 0, 0), (255, 255, 255), (255, 255, 255), (255, 255, 255), (255, 255, 255), (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0)]) pygame.time.delay(2500) sense.clear() counter = 0 if button2.is_pressed: sound_2.play() position2() aktuelleFarbe = WE sense.set_pixels( [(0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), (255, 0, 255), (255, 0, 255), (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), (255, 0, 255), (255, 0, 255), (255, 0, 255), (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), (255, 0, 255), (255, 0, 255), (255, 0, 255), (255, 0, 255), (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), (255, 0, 255), (255, 0, 255), (255, 0, 255), (255, 0, 255), (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), (255, 0, 255), (255, 0, 255), (255, 0, 255), (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), (255, 0, 255), (255, 0, 255), (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0)]) pygame.time.delay(2500) sense.clear() if button3.is_pressed: sound_3.play() position3() screen.fill(WE) aktuelleFarbe = SCHW pygame.display.update() sense.set_pixels( [(0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), (255, 255, 255), (255, 255, 255), (255, 255, 255), (255, 255, 255), (255, 255, 255), (255, 255, 255), (0, 0, 0), (0, 0, 0), (255, 255, 255), (255, 255, 255), (255, 255, 255), (255, 255, 255), (255, 255, 255), (255, 255, 255), (0, 0, 0), (0, 0, 0), (255, 255, 255), (255, 255, 255), (255, 255, 255), (255, 255, 255), (255, 255, 255), (255, 255, 255), (0, 0, 0), (0, 0, 0), (255, 255, 255), (255, 255, 255), (255, 255, 255), (255, 255, 255), (255, 255, 255), (255, 255, 255), (0, 0, 0), (0, 0, 0), (255, 255, 255), (255, 255, 255), (255, 255, 255), (255, 255, 255), (255, 255, 255), (255, 255, 255), (0, 0, 0), (0, 0, 0), (255, 255, 255), (255, 255, 255), (255, 255, 255), (255, 255, 255), (255, 255, 255), (255, 255, 255), (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0)]) pygame.time.delay(2500) sense.clear() # Joystick-Events for event in sense.stick.get_events(): if event.action == 'pressed' and event.direction == 'middle': zeichnen = True elif event.action == 'pressed' and event.direction == 'down': zeichnen = False # allgemeine Events for event in pygame.event.get(): raw = sense.get_compass_raw() # Button für das Zeichnen wird gedrückt if event.type == Draw and zeichnen is True: # Formatierung und Berechnung der Position des Stiftes xsense = "{x}".format(**raw) ysense = "{y}".format(**raw) xsense = float(xsense) ysense = float(ysense) xsense = round(xsense) ysense = round(ysense) # Multiplikation mit negativer Zahl, weil der SenseHat in Normalposition negative Zahlen anzeigt lastPos = ((ysense * -10) + 350, (xsense * -10) - 200) pygame.draw.circle(screen, aktuelleFarbe, lastPos, radius) pygame.display.update() pygame.time.delay(100) # Bedingung wird erfüllt, wenn Malfenster geschlossen wird if event.type == pygame.QUIT: raise StopIteration # führt die Events aus manager.process_events(event) # aktualisiert den Zustand der Buttons manager.update(timeDelta) # die Änderungen im Fenster werden in Pygame verarbeitet screen.blit(screen, (0, 0)) manager.draw_ui(screen) clock.tick(60) pygame.display.update() except StopIteration: pass sense.clear() screenshot.blit(sub, (0, 0)) # Ordner "Zeichnungen" wurde vorher für die Ablage erstellt pygame.image.save(screenshot, "/home/raspberry/Dokumente/Zeichnungen/Zeichnung.bmp") print("Die Zeichnung wurde erfolgreich gespeichert.") # Programm wird beendet pygame.mixer.music.stop() pygame.quit()