Seite 1 von 2

Wenn GUI nicht benutzt wie anders Programm ausführen

Verfasst: Montag 21. Dezember 2020, 18:16
von Alfi.1998
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.

Re: Wenn GUI nicht benutzt wie anders Programm ausführen

Verfasst: Montag 21. Dezember 2020, 19:05
von Boruto_2200
@Alfi.1998 Welches Betriebssystem nutzt du denn?
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)
Der Befehl 'command = ' ruft eine Funktion auf... Die muss aber erst noch definiert werden. Ansonsten funktioniert das ganze gar nicht. Also:

Code: Alles auswählen

def Mischung1():
    #Hier Code einfügen
und dann

Code: Alles auswählen

b1 = Button(root, text="Vodka Orange", height = 3, width = 40, command=Mischung1)
Bei den anderen Buttons ist es genauso.

Wenn du ein Fenster 'Editieren' willst, kannst du den Befehl 'Canvas' Benutzen.
anstelle von

Code: Alles auswählen

root.geometry("800x480")
also

Code: Alles auswählen

c = Canvas(root, width = 400, height = 800)
insgesamt müsste es am ende so aussehen:

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()
Ich hoffe, ich konnte dir damit helfen :D

PS: Solltest du einen Raspberry Pi nutzen, kann ich dir auch mit der Steuerung weiter helfen

Re: Wenn GUI nicht benutzt wie anders Programm ausführen

Verfasst: Montag 21. Dezember 2020, 19:07
von Boruto_2200
Achja, wenn du die GUI mit Tkinter noch mal besser lernen willst, empfehle ich dir diese Website:
https://pythonbuch.com/gui.html

Re: Wenn GUI nicht benutzt wie anders Programm ausführen

Verfasst: Montag 21. Dezember 2020, 21:09
von Dennis89
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:

Code: Alles auswählen

import tkinter as tk
Aus

Code: Alles auswählen

root = Tk()
wird dann

Code: Alles auswählen

root = tk.Tk()
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.

Code: Alles auswählen

def clear():
    pass
Zum Schluss Funktionen schreibt man klein und bei mehreren Wörtern mit '_'. Konstanten ganz GROß und Klassen in CamelCase.

Grüße
Dennis

Re: Wenn GUI nicht benutzt wie anders Programm ausführen

Verfasst: Dienstag 22. Dezember 2020, 08:27
von Sirius3
@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.

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()

Re: Wenn GUI nicht benutzt wie anders Programm ausführen

Verfasst: Dienstag 22. Dezember 2020, 09:52
von Dennis89
@Sirius3 mit Zeitverschwendung meinte ich die Zeit, die man benötigt wenn durch *-Importe Fehler im Programm auftauchen.

Grüße
Dennis

Re: Wenn GUI nicht benutzt wie anders Programm ausführen

Verfasst: Mittwoch 23. Dezember 2020, 14:17
von Alfi.1998
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! :)

Re: Wenn GUI nicht benutzt wie anders Programm ausführen

Verfasst: Mittwoch 23. Dezember 2020, 14:33
von __deets__
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.

Re: Wenn GUI nicht benutzt wie anders Programm ausführen

Verfasst: Mittwoch 23. Dezember 2020, 14:46
von Alfi.1998
@_deets_ Vielen Dank! Werde ich daheim sofort ausprobieren? Läuft dann der Effekt mit after flüssig (normal ändern sich die farben kontinuierlich) oder muss man dann "Abstriche" machen?

Re: Wenn GUI nicht benutzt wie anders Programm ausführen

Verfasst: Mittwoch 23. Dezember 2020, 15:05
von Sirius3
@Alfi.1998: um konkret helfen zu können, brauchen wir natürlich auch den kompletten Code. Außer zu sagen, das man after verwenden soll, können wir mit dem momentanen Informationsstand nicht.

Re: Wenn GUI nicht benutzt wie anders Programm ausführen

Verfasst: Mittwoch 23. Dezember 2020, 21:18
von Alfi.1998
@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.

Re: Wenn GUI nicht benutzt wie anders Programm ausführen

Verfasst: Mittwoch 23. Dezember 2020, 21:19
von Alfi.1998
Noch eine Frage, wie kann ich das als Code im Beitrag markieren?

Re: Wenn GUI nicht benutzt wie anders Programm ausführen

Verfasst: Mittwoch 23. Dezember 2020, 21:51
von Dennis89
Drücke den Button </> und füge dann den Code zwischen die erschienenen Klammerausdrücke ein.

Grüße
Dennis

Re: Wenn GUI nicht benutzt wie anders Programm ausführen

Verfasst: Mittwoch 23. Dezember 2020, 22:52
von Alfi.1998
@Alle
@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)
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.

Re: Wenn GUI nicht benutzt wie anders Programm ausführen

Verfasst: Donnerstag 24. Dezember 2020, 12:45
von Sirius3
Die Einrückungen sind bei Deinem Code kaputt, so dass man ihn nicht lesen kann.
Die Aufrufe kann man wunderbar in kleine Häppchen unterteilen und statt des time.sleep in after-Aufrufe umschreiben.

Re: Wenn GUI nicht benutzt wie anders Programm ausführen

Verfasst: Donnerstag 24. Dezember 2020, 23:12
von Alfi.1998
Gut, werde es mit after probieren und jedes time.sleep() durch after ersetzen! :)

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)

Re: Wenn GUI nicht benutzt wie anders Programm ausführen

Verfasst: Freitag 25. Dezember 2020, 00:46
von Alfi.1998
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?

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()
Vielen Dank euch allen ihr helft mir extrem!

Re: Wenn GUI nicht benutzt wie anders Programm ausführen

Verfasst: Freitag 25. Dezember 2020, 02:58
von __blackjack__
@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.

Re: Wenn GUI nicht benutzt wie anders Programm ausführen

Verfasst: Samstag 2. Januar 2021, 19:38
von Alfi.1998
@_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.

Re: Wenn GUI nicht benutzt wie anders Programm ausführen

Verfasst: Samstag 2. Januar 2021, 20:03
von __deets__
Statt

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)
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.