Wenn GUI nicht benutzt wie anders Programm ausführen
Hey Leute,
ich habe ein Problem mit welchen ich mich schon länger beschäftige. Zu den Grundlagen:
Ich baue eine Coktail Maschine mit 6 Pumpen welche über Relais angesteurt werden. Die "Auswahl" erfolgt über ein 5" Touch Display mit einer simplen Tkinter GUI. Ich habe die Maschine auch bereits zum laufen gebracht. In dem Hauptprogramm in welchen die GUI läuft werden die Getränkedefinitionen importiert und auf Knopfdruck ausgelöst.
Ich will jetzt noch ein LED Kreis einbinden. Immer, wenn keine auswahl getroffen wird soll das Band ein Rainbow abspielen und sobald eine Auswahl getroffen wird ein leuchtring.
Mein Problem ist jetzt allerdings, dass natürlich das Tkinter programm nicht weiter ausgeführt wird, wenn ich soetwas einbinde. Ich bin relativ neu auf dem gebiet und mein Python nachschlage Werk hilft mir auch nicht weiter.
Hier mein Code von der GUI:
from tkinter import *
from getränke import *
import neopixel
import time
from rpi_ws281x import *
import argparse
root = Tk()
root.geometry("800x480")
b1 = Button(root, text="Vodka Orange", height = 3, width = 40, command=Mischung1)
b2 = Button(root, text="Vodka Kirsch-Banane",height = 3, width = 40, command=Mischung2)
b3 = Button(root, text="", height = 3, width = 40,)
b4 = Button(root, text="Rum", height = 3, width = 40, command=Mischung4)
b5 = Button(root, text="Cola", height = 3, width = 40,command=Mischung5)
b6 = Button(root, text="Spülen", height = 2, width = 20, command=Spülen)
b1.pack()
b2.pack()
b3.pack()
b4.pack()
b5.pack()
b6.pack()
root.mainloop()
Einige imports sind noch von den versuchen vorhanden es alleine zu schaffen. Wie und wo füge ich jetzt so einen befehl ein?
Dank für eure Hilfe.
ich habe ein Problem mit welchen ich mich schon länger beschäftige. Zu den Grundlagen:
Ich baue eine Coktail Maschine mit 6 Pumpen welche über Relais angesteurt werden. Die "Auswahl" erfolgt über ein 5" Touch Display mit einer simplen Tkinter GUI. Ich habe die Maschine auch bereits zum laufen gebracht. In dem Hauptprogramm in welchen die GUI läuft werden die Getränkedefinitionen importiert und auf Knopfdruck ausgelöst.
Ich will jetzt noch ein LED Kreis einbinden. Immer, wenn keine auswahl getroffen wird soll das Band ein Rainbow abspielen und sobald eine Auswahl getroffen wird ein leuchtring.
Mein Problem ist jetzt allerdings, dass natürlich das Tkinter programm nicht weiter ausgeführt wird, wenn ich soetwas einbinde. Ich bin relativ neu auf dem gebiet und mein Python nachschlage Werk hilft mir auch nicht weiter.
Hier mein Code von der GUI:
from tkinter import *
from getränke import *
import neopixel
import time
from rpi_ws281x import *
import argparse
root = Tk()
root.geometry("800x480")
b1 = Button(root, text="Vodka Orange", height = 3, width = 40, command=Mischung1)
b2 = Button(root, text="Vodka Kirsch-Banane",height = 3, width = 40, command=Mischung2)
b3 = Button(root, text="", height = 3, width = 40,)
b4 = Button(root, text="Rum", height = 3, width = 40, command=Mischung4)
b5 = Button(root, text="Cola", height = 3, width = 40,command=Mischung5)
b6 = Button(root, text="Spülen", height = 2, width = 20, command=Spülen)
b1.pack()
b2.pack()
b3.pack()
b4.pack()
b5.pack()
b6.pack()
root.mainloop()
Einige imports sind noch von den versuchen vorhanden es alleine zu schaffen. Wie und wo füge ich jetzt so einen befehl ein?
Dank für eure Hilfe.
-
- User
- Beiträge: 8
- Registriert: Montag 21. Dezember 2020, 14:15
@Alfi.1998 Welches Betriebssystem nutzt du denn?
Bei der GUI kann ich dir helfen, beim Rest jedoch nicht...
Der Befehl 'command = ' ruft eine Funktion auf... Die muss aber erst noch definiert werden. Ansonsten funktioniert das ganze gar nicht. Also:
und dann
Bei den anderen Buttons ist es genauso.
Wenn du ein Fenster 'Editieren' willst, kannst du den Befehl 'Canvas' Benutzen.
anstelle von
also
insgesamt müsste es am ende so aussehen:
Ich hoffe, ich konnte dir damit helfen 
PS: Solltest du einen Raspberry Pi nutzen, kann ich dir auch mit der Steuerung weiter helfen
Bei der GUI kann ich dir helfen, beim Rest jedoch nicht...
Code: Alles auswählen
b1 = Button(root, text="Vodka Orange", height = 3, width = 40, command=Mischung1)
Code: Alles auswählen
def Mischung1():
#Hier Code einfügen
Code: Alles auswählen
b1 = Button(root, text="Vodka Orange", height = 3, width = 40, command=Mischung1)
Wenn du ein Fenster 'Editieren' willst, kannst du den Befehl 'Canvas' Benutzen.
anstelle von
Code: Alles auswählen
root.geometry("800x480")
Code: Alles auswählen
c = Canvas(root, width = 400, height = 800)
Code: Alles auswählen
from tkinter import *
root = Tk()
c = Canvas(root, width = 400, height = 800)
c.pack()
def Mischung1():
#Hier Code einfügen
def Mischung2():
#Hier Code einfügen
def Mischung3():
#Hier Code einfügen
def Mischung4():
#Hier Code einfügen
def Mischung5():
#Hier Code einfügen
def Waschen():
#Hier Code einfügen
b1 = Button(root, text="Vodka Orange", height = 3, width = 40, command=Mischung1).pack()
b2 = Button(root, text="Vodka Kirsch-Banane",height = 3, width = 40, command=Mischung2).pack()
b3 = Button(root, text="???", height = 3, width = 40, command = Mischung3).pack()
b4 = Button(root, text="Rum", height = 3, width = 40, command=Mischung4).pack()
b5 = Button(root, text="Cola", height = 3, width = 40,command=Mischung5).pack()
b6 = Button(root, text="Spülen", height = 2, width = 20, command=Waschen).pack()
root.mainloop()

PS: Solltest du einen Raspberry Pi nutzen, kann ich dir auch mit der Steuerung weiter helfen
Zuletzt geändert von Boruto_2200 am Montag 21. Dezember 2020, 19:10, insgesamt 1-mal geändert.
-
- User
- Beiträge: 8
- Registriert: Montag 21. Dezember 2020, 14:15
Achja, wenn du die GUI mit Tkinter noch mal besser lernen willst, empfehle ich dir diese Website:
https://pythonbuch.com/gui.html
https://pythonbuch.com/gui.html
Hallo,
bitte nicht mit '*' importieren. Damit holst du dir alle Namen die das Modul tkinter zu bieten hat in deinen Code. Das führt zu Fehler die nicht unbedingt gleich erkannt werden und zu dem sind sie unnötige Zeitverschwendung. Importiere bei der Verwendung von mehreren tkinter Funktionen das Modul und benenne es um:
Aus
wird dann
das gilt dann auch für die übrigen tkinter-Funktionen.
Dann nutze keine Variablennamen wie 'b1', das macht den Code schwer lesbar und nachvollziehbar. Es kostet dich gar nichts, wenn du ein paar Buchstaben mehr verwendest. Grundsätzlich sind aussagekräftige Namen zu wählen.
Wenn Funktionen erstellt werden, die zum testen aber noch keinen Inhalt haben, dann kann man den Inhalt durch 'pass' ersetzen. Dadurch gibt es keine Fehlermeldung bei Versuchen.
Zum Schluss Funktionen schreibt man klein und bei mehreren Wörtern mit '_'. Konstanten ganz GROß und Klassen in CamelCase.
Grüße
Dennis
bitte nicht mit '*' importieren. Damit holst du dir alle Namen die das Modul tkinter zu bieten hat in deinen Code. Das führt zu Fehler die nicht unbedingt gleich erkannt werden und zu dem sind sie unnötige Zeitverschwendung. Importiere bei der Verwendung von mehreren tkinter Funktionen das Modul und benenne es um:
Code: Alles auswählen
import tkinter as tk
Code: Alles auswählen
root = Tk()
Code: Alles auswählen
root = tk.Tk()
Dann nutze keine Variablennamen wie 'b1', das macht den Code schwer lesbar und nachvollziehbar. Es kostet dich gar nichts, wenn du ein paar Buchstaben mehr verwendest. Grundsätzlich sind aussagekräftige Namen zu wählen.
Wenn Funktionen erstellt werden, die zum testen aber noch keinen Inhalt haben, dann kann man den Inhalt durch 'pass' ersetzen. Dadurch gibt es keine Fehlermeldung bei Versuchen.
Code: Alles auswählen
def clear():
pass
Grüße
Dennis
"When I got the music, I got a place to go" [Rancid, 1993]
@Dennis89: das *-Importverbot hat weniger etwas mit Geschwindigkeit zu tun; das Modul wird ja trotzdem komplett geladen.
@Boruto_2200: die vielen Mischungsfunktionen kommen wahrscheinlich aus irgendeinem der *-Importe, wenn man raten müßte aus getränke. Da das aber überhaupt nicht klar wird, sollte man erst gar keine *-Importe benutzen, so führt das nur zu Verwirrung, wie Du selbst gerade gemerkt hast.
@Alfi.1998: neopixel, time, argparse und wahrscheinlich alles aus rpi_ws281x werden zwar importiert, aber nicht benutzt.
Wie hast Du denn das Einfrieren beim Mischen der Getränke gelöst? Genauso kannst Du es bei Deinen Blinklichtern auch lösen.
Statt vieler Funktionen Mischen die einfach nur durchnummeriert werden, solltest Du die Getränke durch eine passende Datenstruktur definieren. Genauso werden dann die Knöpfe nicht durch Copy-Paste in den Code eingefügt, sondern mit Hilfe dieser Datenstruktur und einer Schleife erzeugt.
So ist es viel einfacher, neue Rezepturen einzufügen.
@Boruto_2200: die vielen Mischungsfunktionen kommen wahrscheinlich aus irgendeinem der *-Importe, wenn man raten müßte aus getränke. Da das aber überhaupt nicht klar wird, sollte man erst gar keine *-Importe benutzen, so führt das nur zu Verwirrung, wie Du selbst gerade gemerkt hast.
@Alfi.1998: neopixel, time, argparse und wahrscheinlich alles aus rpi_ws281x werden zwar importiert, aber nicht benutzt.
Wie hast Du denn das Einfrieren beim Mischen der Getränke gelöst? Genauso kannst Du es bei Deinen Blinklichtern auch lösen.
Statt vieler Funktionen Mischen die einfach nur durchnummeriert werden, solltest Du die Getränke durch eine passende Datenstruktur definieren. Genauso werden dann die Knöpfe nicht durch Copy-Paste in den Code eingefügt, sondern mit Hilfe dieser Datenstruktur und einer Schleife erzeugt.
So ist es viel einfacher, neue Rezepturen einzufügen.
Code: Alles auswählen
import tkinter as tk
from functools import partial
GETRAENKE = {
"Vodka Orange": (hier die passende Datenstruktur),
"Vodka Kirsch-Banane": (hier die passende Datenstruktur),
"xxx": (hier die passende Datenstruktur),
"Rum": (hier die passende Datenstruktur),
"Cola": (hier die passende Datenstruktur),
}
def mischen(rezept):
# da passiert was
pass
def spuelen():
pass
def main():
root = tk.Tk()
root.geometry("800x480")
for name, rezept in GETRAENKE.items():
Button(root, text=name, height=3, width=40, command=partial(mischen, rezept)).pack()
Button(root, text="Spülen", height=2, width=20, command=spuelen).pack()
root.mainloop()
if __name__ == '__main__':
main()
Vielen Dank für eure Anworten! 
Zur allgemeinen Info: Ich benutze Python auf einem Raspberry Pi mit Linux.
@Boruto_2200 Diese def habe ich importiert. Des hat aber nur den Grund, da ich den Import üben bzw ausprobieren wollte!
Danke @Dennis89 werde ich in Zukunft beachten.
@Sirius3 Das Einfrieren vom Bildschirm beim ausführen der Mischung konnte ich bisher nicht lösen! Zurzeit versuche ich anhand von dem Python Buch das richtige nachzuschlagen.
Die Getränke (Pumpen) werden alle nach dem betätigen der Buttons aktiviert und ausgeführt. Wenn ich bei dem Rezept nach dem def die LEDs ansteuere funktioniert dies auch ohne Probleme.
Ich will allerdings, dass Sobald die GUI also die Auswahl der Getränke auf den Bildschirm erscheint die Pixels einen Regenbogen Effekt erzeugen. Dies soll so lange ausgeführt werden bis eine Getränke Auswahl getroffen wird und sobald diese abgeschlossen ist.
Der Effekt ist auch schon fertig und Funktioniert alleine. Ich versuche aber schon länger diesen in der Hauptschleife von der GUI einzubauen.
Es treten immer zwei Probleme auf:
1. Der Effekt wird nach den öffnen der Datei ausgeführt aber die GUI nicht geöffnet.
2. Die GUI öffnet sich und ist ohne Probleme ausführbar allerdings ohne LED Effekt.
Bei Google habe ich bisher nur gefunden, dass dies nicht geht, da die Hauptschleife nicht weiter fortgeführt wird solange der Effekt ausgeführt wird. Aus diesem Grund öffnet sich die GUI nicht. Eine Lösung zu diesem Problem bzw einen Vorschlag zur Ausführung habe ich nicht gefunden.
Grüße und schöne Weinachten sowie einen guten Rutsch!

Zur allgemeinen Info: Ich benutze Python auf einem Raspberry Pi mit Linux.
@Boruto_2200 Diese def habe ich importiert. Des hat aber nur den Grund, da ich den Import üben bzw ausprobieren wollte!

Danke @Dennis89 werde ich in Zukunft beachten.
@Sirius3 Das Einfrieren vom Bildschirm beim ausführen der Mischung konnte ich bisher nicht lösen! Zurzeit versuche ich anhand von dem Python Buch das richtige nachzuschlagen.
Die Getränke (Pumpen) werden alle nach dem betätigen der Buttons aktiviert und ausgeführt. Wenn ich bei dem Rezept nach dem def die LEDs ansteuere funktioniert dies auch ohne Probleme.
Ich will allerdings, dass Sobald die GUI also die Auswahl der Getränke auf den Bildschirm erscheint die Pixels einen Regenbogen Effekt erzeugen. Dies soll so lange ausgeführt werden bis eine Getränke Auswahl getroffen wird und sobald diese abgeschlossen ist.
Der Effekt ist auch schon fertig und Funktioniert alleine. Ich versuche aber schon länger diesen in der Hauptschleife von der GUI einzubauen.
Es treten immer zwei Probleme auf:
1. Der Effekt wird nach den öffnen der Datei ausgeführt aber die GUI nicht geöffnet.
2. Die GUI öffnet sich und ist ohne Probleme ausführbar allerdings ohne LED Effekt.
Bei Google habe ich bisher nur gefunden, dass dies nicht geht, da die Hauptschleife nicht weiter fortgeführt wird solange der Effekt ausgeführt wird. Aus diesem Grund öffnet sich die GUI nicht. Eine Lösung zu diesem Problem bzw einen Vorschlag zur Ausführung habe ich nicht gefunden.
Grüße und schöne Weinachten sowie einen guten Rutsch!

Fuer das ausfuehren von Code waehrend die mainloop der GUI laeuft gibt es die after-Methode in tkinter. Damit kannst du sowohl deine Regenbogen-Effekte als auch deine Mischerei machen. Du instruierst damit tkinter zu einem bestimmten Zeitpunkt Code auszufuehren. Der macht dann KURZ etwas, zb die naechste Farbe darzustellen, oder ein Ventil zu oeffnen/schliessen. Und dann wird wieder das naechste Kommando per after angewiesen.
@Alle
@Sirius
Der Code, welcher nach ausführen der py datei und somit sofort ausgeführt werden soll wenn die GUI sichtbar ist lautet:
import time
from rpi_ws281x import *
import argparse
LED_COUNT = 24
LED_PIN = 18
#LED_PIN = 10
LED_FREQ_HZ = 800000
LED_DMA = 10
LED_BRIGHTNESS = 255
LED_INVERT = False
LED_CHANNEL = 0
def colorWipe(strip, color, wait_ms=50):
"""Wipe color across display a pixel at a time."""
for i in range(strip.numPixels()):
strip.setPixelColor(i, color)
strip.show()
time.sleep(wait_ms/1000.0)
def theaterChase(strip, color, wait_ms=50, iterations=10):
"""Movie theater light style chaser animation."""
for j in range(iterations):
for q in range(3):
for i in range(0, strip.numPixels(), 3):
strip.setPixelColor(i+q, color)
strip.show()
time.sleep(wait_ms/1000.0)
for i in range(0, strip.numPixels(), 3):
strip.setPixelColor(i+q, 0)
def wheel(pos):
"""Generate rainbow colors across 0-255 positions."""
if pos < 85:
return Color(pos * 3, 255 - pos * 3, 0)
elif pos < 170:
pos -= 85
return Color(255 - pos * 3, 0, pos * 3)
else:
pos -= 170
return Color(0, pos * 3, 255 - pos * 3)
def rainbow(strip, wait_ms=20, iterations=1):
"""Draw rainbow that fades across all pixels at once."""
for j in range(256*iterations):
for i in range(strip.numPixels()):
strip.setPixelColor(i, wheel((i+j) & 255))
strip.show()
time.sleep(wait_ms/1000.0)
def rainbowCycle(strip, wait_ms=20, iterations=5):
"""Draw rainbow that uniformly distributes itself across all pixels."""
for j in range(256*iterations):
for i in range(strip.numPixels()):
strip.setPixelColor(i, wheel((int(i * 256 / strip.numPixels()) + j) & 255))
strip.show()
time.sleep(wait_ms/1000.0)
def theaterChaseRainbow(strip, wait_ms=50):
"""Rainbow movie theater light style chaser animation."""
for j in range(256):
for q in range(3):
for i in range(0, strip.numPixels(), 3):
strip.setPixelColor(i+q, wheel((i+j) % 255))
strip.show()
time.sleep(wait_ms/1000.0)
for i in range(0, strip.numPixels(), 3):
strip.setPixelColor(i+q, 0)
strip = Adafruit_NeoPixel(LED_COUNT, LED_PIN, LED_FREQ_HZ, LED_DMA, LED_INVERT, LED_BRIGHTNESS, LED_CHANNEL)
strip.begin()
#.. Test ausführung
rainbow(strip)
rainbowCycle(strip)
theaterChaseRainbow(strip)
Dieser Code erstellt halt schöne Effekte und ich hab unten nur die Aktiviert, die etwas mit Rainbow zutun haben. Optimal währe es natürlich, dass der Effekt stoppt sobald ein getränk erstellt wird. Aber das kann ich ja selber rausfinden!
Nur bei dem oben genannen problem komme ich nicht weiter, dass diser Effekt neben der GUI läuft.
@Sirius
Der Code, welcher nach ausführen der py datei und somit sofort ausgeführt werden soll wenn die GUI sichtbar ist lautet:
import time
from rpi_ws281x import *
import argparse
LED_COUNT = 24
LED_PIN = 18
#LED_PIN = 10
LED_FREQ_HZ = 800000
LED_DMA = 10
LED_BRIGHTNESS = 255
LED_INVERT = False
LED_CHANNEL = 0
def colorWipe(strip, color, wait_ms=50):
"""Wipe color across display a pixel at a time."""
for i in range(strip.numPixels()):
strip.setPixelColor(i, color)
strip.show()
time.sleep(wait_ms/1000.0)
def theaterChase(strip, color, wait_ms=50, iterations=10):
"""Movie theater light style chaser animation."""
for j in range(iterations):
for q in range(3):
for i in range(0, strip.numPixels(), 3):
strip.setPixelColor(i+q, color)
strip.show()
time.sleep(wait_ms/1000.0)
for i in range(0, strip.numPixels(), 3):
strip.setPixelColor(i+q, 0)
def wheel(pos):
"""Generate rainbow colors across 0-255 positions."""
if pos < 85:
return Color(pos * 3, 255 - pos * 3, 0)
elif pos < 170:
pos -= 85
return Color(255 - pos * 3, 0, pos * 3)
else:
pos -= 170
return Color(0, pos * 3, 255 - pos * 3)
def rainbow(strip, wait_ms=20, iterations=1):
"""Draw rainbow that fades across all pixels at once."""
for j in range(256*iterations):
for i in range(strip.numPixels()):
strip.setPixelColor(i, wheel((i+j) & 255))
strip.show()
time.sleep(wait_ms/1000.0)
def rainbowCycle(strip, wait_ms=20, iterations=5):
"""Draw rainbow that uniformly distributes itself across all pixels."""
for j in range(256*iterations):
for i in range(strip.numPixels()):
strip.setPixelColor(i, wheel((int(i * 256 / strip.numPixels()) + j) & 255))
strip.show()
time.sleep(wait_ms/1000.0)
def theaterChaseRainbow(strip, wait_ms=50):
"""Rainbow movie theater light style chaser animation."""
for j in range(256):
for q in range(3):
for i in range(0, strip.numPixels(), 3):
strip.setPixelColor(i+q, wheel((i+j) % 255))
strip.show()
time.sleep(wait_ms/1000.0)
for i in range(0, strip.numPixels(), 3):
strip.setPixelColor(i+q, 0)
strip = Adafruit_NeoPixel(LED_COUNT, LED_PIN, LED_FREQ_HZ, LED_DMA, LED_INVERT, LED_BRIGHTNESS, LED_CHANNEL)
strip.begin()
#.. Test ausführung
rainbow(strip)
rainbowCycle(strip)
theaterChaseRainbow(strip)
Dieser Code erstellt halt schöne Effekte und ich hab unten nur die Aktiviert, die etwas mit Rainbow zutun haben. Optimal währe es natürlich, dass der Effekt stoppt sobald ein getränk erstellt wird. Aber das kann ich ja selber rausfinden!

@Alle
@Sirius
Der Code, welcher nach ausführen der py datei und somit sofort ausgeführt werden soll wenn die GUI sichtbar ist lautet:
Dieser Code erstellt halt schöne Effekte und ich hab unten nur die Aktiviert, die etwas mit Rainbow zutun haben. Optimal währe es natürlich, dass der Effekt stoppt sobald ein getränk erstellt wird. Aber das kann ich ja selber rausfinden!
Nur bei dem oben genannen problem komme ich nicht weiter, dass diser Effekt neben der GUI läuft.
@Sirius
Der Code, welcher nach ausführen der py datei und somit sofort ausgeführt werden soll wenn die GUI sichtbar ist lautet:
Code: Alles auswählen
import time
from rpi_ws281x import *
import argparse
LED_COUNT = 24
LED_PIN = 18
#LED_PIN = 10
LED_FREQ_HZ = 800000
LED_DMA = 10
LED_BRIGHTNESS = 255
LED_INVERT = False
LED_CHANNEL = 0
def colorWipe(strip, color, wait_ms=50):
"""Wipe color across display a pixel at a time."""
for i in range(strip.numPixels()):
strip.setPixelColor(i, color)
strip.show()
time.sleep(wait_ms/1000.0)
def theaterChase(strip, color, wait_ms=50, iterations=10):
"""Movie theater light style chaser animation."""
for j in range(iterations):
for q in range(3):
for i in range(0, strip.numPixels(), 3):
strip.setPixelColor(i+q, color)
strip.show()
time.sleep(wait_ms/1000.0)
for i in range(0, strip.numPixels(), 3):
strip.setPixelColor(i+q, 0)
def wheel(pos):
"""Generate rainbow colors across 0-255 positions."""
if pos < 85:
return Color(pos * 3, 255 - pos * 3, 0)
elif pos < 170:
pos -= 85
return Color(255 - pos * 3, 0, pos * 3)
else:
pos -= 170
return Color(0, pos * 3, 255 - pos * 3)
def rainbow(strip, wait_ms=20, iterations=1):
"""Draw rainbow that fades across all pixels at once."""
for j in range(256*iterations):
for i in range(strip.numPixels()):
strip.setPixelColor(i, wheel((i+j) & 255))
strip.show()
time.sleep(wait_ms/1000.0)
def rainbowCycle(strip, wait_ms=20, iterations=5):
"""Draw rainbow that uniformly distributes itself across all pixels."""
for j in range(256*iterations):
for i in range(strip.numPixels()):
strip.setPixelColor(i, wheel((int(i * 256 / strip.numPixels()) + j) & 255))
strip.show()
time.sleep(wait_ms/1000.0)
def theaterChaseRainbow(strip, wait_ms=50):
"""Rainbow movie theater light style chaser animation."""
for j in range(256):
for q in range(3):
for i in range(0, strip.numPixels(), 3):
strip.setPixelColor(i+q, wheel((i+j) % 255))
strip.show()
time.sleep(wait_ms/1000.0)
for i in range(0, strip.numPixels(), 3):
strip.setPixelColor(i+q, 0)
strip = Adafruit_NeoPixel(LED_COUNT, LED_PIN, LED_FREQ_HZ, LED_DMA, LED_INVERT, LED_BRIGHTNESS, LED_CHANNEL)
strip.begin()
#.. Test ausführung
rainbow(strip)
rainbowCycle(strip)
theaterChaseRainbow(strip)

Gut, werde es mit after probieren und jedes time.sleep() durch after ersetzen! 
Hier der Code im richtigen Layout.

Hier der Code im richtigen Layout.
Code: Alles auswählen
import time
from rpi_ws281x import *
import argparse
LED_COUNT = 24
LED_PIN = 18
#LED_PIN = 10
LED_FREQ_HZ = 800000
LED_DMA = 10
LED_BRIGHTNESS = 255
LED_INVERT = False
LED_CHANNEL = 0
def colorWipe(strip, color, wait_ms=50):
"""Wipe color across display a pixel at a time."""
for i in range(strip.numPixels()):
strip.setPixelColor(i, color)
strip.show()
time.sleep(wait_ms/1000.0)
def theaterChase(strip, color, wait_ms=50, iterations=10):
"""Movie theater light style chaser animation."""
for j in range(iterations):
for q in range(3):
for i in range(0, strip.numPixels(), 3):
strip.setPixelColor(i+q, color)
strip.show()
time.sleep(wait_ms/1000.0)
for i in range(0, strip.numPixels(), 3):
strip.setPixelColor(i+q, 0)
def wheel(pos):
"""Generate rainbow colors across 0-255 positions."""
if pos < 85:
return Color(pos * 3, 255 - pos * 3, 0)
elif pos < 170:
pos -= 85
return Color(255 - pos * 3, 0, pos * 3)
else:
pos -= 170
return Color(0, pos * 3, 255 - pos * 3)
def rainbow(strip, wait_ms=20, iterations=1):
"""Draw rainbow that fades across all pixels at once."""
for j in range(256*iterations):
for i in range(strip.numPixels()):
strip.setPixelColor(i, wheel((i+j) & 255))
strip.show()
time.sleep(wait_ms/1000.0)
def rainbowCycle(strip, wait_ms=20, iterations=5):
"""Draw rainbow that uniformly distributes itself across all pixels."""
for j in range(256*iterations):
for i in range(strip.numPixels()):
strip.setPixelColor(i, wheel((int(i * 256 / strip.numPixels()) + j) & 255))
strip.show()
time.sleep(wait_ms/1000.0)
def theaterChaseRainbow(strip, wait_ms=50):
"""Rainbow movie theater light style chaser animation."""
for j in range(256):
for q in range(3):
for i in range(0, strip.numPixels(), 3):
strip.setPixelColor(i+q, wheel((i+j) % 255))
strip.show()
time.sleep(wait_ms/1000.0)
for i in range(0, strip.numPixels(), 3):
strip.setPixelColor(i+q, 0)
strip = Adafruit_NeoPixel(LED_COUNT, LED_PIN, LED_FREQ_HZ, LED_DMA, LED_INVERT, LED_BRIGHTNESS, LED_CHANNEL)
strip.begin()
#.. Test ausführung
rainbow(strip)
rainbowCycle(strip)
theaterChaseRainbow(strip)
Danke !
Ich habe es jetzt mal mit after probiert und einen kleinen Erfolg. (Ich habe leider noch keine Zeit gehabt, dass ganze Skript auf den obigen vorschlag umzubauen)
Wenn ich die GUI starte wird jetzt der Effekt generiert und der LED Kreis zeigt eine Animation.
Das fenster der GUI geht allerdings erst auf, wenn die Animation einmal durchlaufen ist. Kann man dies ändern?
Vielen Dank euch allen ihr helft mir extrem!

Wenn ich die GUI starte wird jetzt der Effekt generiert und der LED Kreis zeigt eine Animation.
Das fenster der GUI geht allerdings erst auf, wenn die Animation einmal durchlaufen ist. Kann man dies ändern?
Code: Alles auswählen
#...GUI mit Button
from tkinter import *
from getränke import *
import neopixel
import time
from rpi_ws281x import *
import argparse
# LED strip configuration:
LED_COUNT = 24 # Number of LED pixels.
LED_PIN = 18 # GPIO pin connected to the pixels (18 uses PWM!).
#LED_PIN = 10 # GPIO pin connected to the pixels (10 uses SPI /dev/spidev0.0).
LED_FREQ_HZ = 800000 # LED signal frequency in hertz (usually 800khz)
LED_DMA = 10 # DMA channel to use for generating signal (try 10)
LED_BRIGHTNESS = 255 # Set to 0 for darkest and 255 for brightest
LED_INVERT = False # True to invert the signal (when using NPN transistor level shift)
LED_CHANNEL = 0 # set to '1' for GPIOs 13, 19, 41, 45 or 53
strip = Adafruit_NeoPixel(LED_COUNT, LED_PIN, LED_FREQ_HZ, LED_DMA, LED_INVERT, LED_BRIGHTNESS, LED_CHANNEL)
strip.begin()
def wheel(pos):
"""Generate rainbow colors across 0-255 positions."""
if pos < 85:
return Color(pos * 3, 255 - pos * 3, 0)
elif pos < 170:
pos -= 85
return Color(255 - pos * 3, 0, pos * 3)
else:
pos -= 170
return Color(0, pos * 3, 255 - pos * 3)
def rainbowCycle(strip, iterations=5):
"""Draw rainbow that uniformly distributes itself across all pixels."""
for j in range(256*iterations):
for i in range(strip.numPixels()):
strip.setPixelColor(i, wheel((int(i * 256 / strip.numPixels()) + j) & 255))
strip.show()
root = Tk()
root.geometry("800x480")
b1 = Button(root, text="Vodka Orange", height = 3, width = 40, command=Mischung1)
b2 = Button(root, text="Vodka Kirsch-Banane",height = 3, width = 40, command=Mischung2)
b3 = Button(root, text="Vodka Multi", height = 3, width = 40, command=Mischung3)
b4 = Button(root, text="Rum Kirsch Banane", height = 3, width = 40, command=Mischung4)
b5 = Button(root, text="Kirschsaft", height = 3, width = 40,command=Mischung5)
b6 = Button(root, text="Spülen", height = 2, width = 20, command=Spülen)
b1.pack()
b2.pack()
b3.pack()
b4.pack()
b5.pack()
b6.pack()
root.after(0, rainbowCycle(strip))
root.mainloop()
- __blackjack__
- User
- Beiträge: 14053
- Registriert: Samstag 2. Juni 2018, 10:21
- Wohnort: 127.0.0.1
- Kontaktdaten:
@Alfi.1998: So funktioniert das nicht. Du musst Deinen Code umschreiben so das er in kleinen Schritten läuft und *jeder* dieser kleinen Schritte muss dann durch einen Rückruf über `after()` ausgeführt werden. Die einzelnen Aufrufe dürfen nur kurz etwas machen. Du hast da immer noch eine lang laufende Funktion, die die gesamte Farbanimation durchspielt bevor sie zu Aufrufer zurück kehrt.
Und der andere Fehler ist das `after()` etwas aufrufbares als zweites Argument erwartet. Du übergibst da aber den Rückgabewert von dem Aufruf von `rainbowCycle()`. Was `None` ist, weil die Funktion nichts explizit zurück gibt.
Und der andere Fehler ist das `after()` etwas aufrufbares als zweites Argument erwartet. Du übergibst da aber den Rückgabewert von dem Aufruf von `rainbowCycle()`. Was `None` ist, weil die Funktion nichts explizit zurück gibt.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
@_blackjack_
Ersteinmal frohes neues Jahr!
Vielen Dank! Aber kannst du es eventuell genauer Beschreiben? Ich verstehe nicht wie ich daraus kleinere Schritte mache. Besonders bei der GUI finde ich nur Beispiele mit der großen schleife.
Ersteinmal frohes neues Jahr!

Vielen Dank! Aber kannst du es eventuell genauer Beschreiben? Ich verstehe nicht wie ich daraus kleinere Schritte mache. Besonders bei der GUI finde ich nur Beispiele mit der großen schleife.
Statt
musst du eben
Das ist natuerlich jetzt nur pseudo-code, du musst deinen rainbow cycle darauf eben umschreiben. Jedes mal wenn der Timer triggert darf nur ein Schritt ausgefuehrt werden. Und man merkt sich eben, wo man steht.
Code: Alles auswählen
def rainbow():
for i in range(1000):
...
musst du eben
Code: Alles auswählen
def rainbow_timer_callback():
# .. mach was mit regenboegen
self.rainbow_i += 1
if self.rainbow_i < 100:
root.after(1000, rainbow_timer_callback)