Erst einmal zum ersten Code. Das Hauptprogramm sollte in einer Funktion verschwinden.
`T1` sollte einen besseren Namen bekommen, an dem der Leser erkennen kann was der Wert bedeutet.
Um die Bedingung bei ``while`` gehören keine unnötigen Klammern. Man vergleicht auch nicht mit literalen ``True`` und ``False`` Werten. Da kommt ja eh nur wieder ``True`` oder ``False`` bei heraus, das heisst entweder der Wert, den man sowieso schon hatte, oder das Gegenteil davon — dafür gibt es dann ``not``. Also stannt ``while (start == False):`` schreibt man ``while not start:``.
Dann gibt `Button.is_pressed` einen Wahrheitswert zurück. Es ist also unnötig umständlich das als Bedingung in einem ``if``/``else`` zu nehmen um dann in den beiden Zweigen einem Namen ``True`` oder ``False`` zuzuweisen wenn `is_pressed` doch bereits der Wert ist, den man zuweisen möchte:
Code: Alles auswählen
start = False
while not start:
if button.is_pressed:
start = True
else:
start = False
# ->
start = False
while not start:
start = button.is_pressed
Aber auch das ist noch nicht gut, denn man sollte den Prozessor nicht 100% damit beschäftigen dauernd den Zustand von dem Button zu testen. Das Objekt hat dafür entsprechende `wait_*()`-Methoden die das intern effizienter lösen können:
Das `start`-Flag braucht man auch bei der zweiten Schleife nicht aus der man einfach eine ”Endlosschleife” machen kann, die bei Eintreten der Endbedingung per ``break`` verlassen wird. Der Name `start` ist ein etwas komisch für ein Flag das für's *beenden* zuständig ist.
Statt selbst eine Zufallszahl mit ”magischen” literalen Grenzwerten zu erzeugen, sollte man sich den Indexzugriff sparen und einfach mit `random.choice()` eine LED auswählen.
Ungetestet:
Code: Alles auswählen
#!/usr/bin/env python3
import random
import time
import gpiozero
def main():
leds = gpiozero.LEDBoard(17, 18, 27, 22, 23, 24, 25, 4, 12)
button = gpiozero.Button(16)
button.wait_for_release()
sekunden = int(input("Dauer der Zufallswiedergabe: "))
start_time = time.monotonic()
while True:
led = random.choice(leds)
led.on()
time.sleep(0.1)
led.off()
if (time.monotonic() - start_time) >= sekunden:
break
leds.off()
if __name__ == "__main__":
main()
Ich verstehe jetzt nicht wo Dein konkretes Problem ist? Du beschreibst was Du erreichen willst, und zeigst dann Code der für `RPi.GPIO` geschrieben ist, aber nicht das macht was Du erreichen willst. Ansonsten ist das eigentlich recht einfach. Du musst Dir halt klar machen was der vorhandene Code in welcher Reihenfolge macht, und wenn Du das ändern willst, eben entsprechend abändern. Wenn die zuletzt ausgewählte Zufalls-LED zum Beispiel an bleiben soll, dann darf sie halt vor dem verlassen der Schleife nicht ausgeschaltet werden. Das ist doch eigentlich logisch‽
Und das da keine Frage kommen soll nach dem Knopfdruck und eine feste Anzahl Wiederholungen statt einer bestimmten Zeit, ist doch auch trivial. Das hast Du anscheinend mit `RPi.GPIO` schon gemacht, und das betrifft ja den Programmablauf und nicht die API mit der die LEDs angesteuert werden. Das ist also unabhängig davon ob Du `RPi.GPIO` oder `gpiozero` dafür verwendest.