@PythonDonald: Die Importe könnte man mal aufräumen. `os`, `PyQt5.QtWidgets`, `QtGui`, `QIcon`, `subprocess`, `time`, und `threading` werden importiert, aber nicht verwendet. Dazu Unmengen an Namen aus `PyQt5.QtWidgets` über den Sternchenimport. Allerdings ist da dann `QThread` nicht dabei, was aber im Code steht, und damit ein Indiz ist, dass Du das gar nicht hast laufen lassen bevor Du nachgefragt hast.
Du hast ``as`` beim Import falsch verstanden. Das ist zum umbenennen. Wenn man aber gar nicht umbenennt, dann ist das der falsche Weg, denn weder `GPIO` noch `uic` gibst Du damit einen anderen Namen. Dafür ist ``from … import …`` vorgesehen.
`BeleuchtungA()`, `BeleuchtungE`, und `BeleuchtungAu()` sind besch… Namen. Da muss der Leser jetzt raten was die kryptischen Anhängsel `A`, `E`, und `Au` bedeuten sollen. Zudem beschreibt nichts davon eine Tätigkeit, was bei Funktionen und Methoden aber der Fall sein sollte.
Fenster sollten sich nicht selbst anzeigen. Der `show()`-Aufruf gehört ins Hauptprogramm, welches in einer Funktion stehen sollte.
In der `__init__()` sollten alle Attribute eingeführt werden. Also auch `thread`. Dann kann man auch einfach prüfen ob bereits ein Thread-Objekt existiert, denn sonst hat man ein Problem wenn der Benutzer mehr als einmal auf die Schaltfläche klickt.
Den Board-Modus von GPIO sollte man im Hauptprogramm setzen und nicht irgendwo im Programm verstecken. Ausserdem muss man dafür sorgen das am Programmende die `cleanup()`-Funktion aufgerufen wird.
Die Pin-Nummer für das Licht sollte man als Konstante definieren.
``self.True1 = True`` – WTF‽ Der Name ist Superkacke und die Verwendung danach ist unsinnig. Entweder gleich literal `True` als Bedingung in die ``while``-Schleife schreiben, oder falls der Thread abbrechbar sein soll, die entsprechenden Mittel von `QThread` verwenden.
Den `check`-Rückgabewert von `cv2.VideoCapture.read()` sollte man auch auswerten und nicht einfach blind davon ausgehen, das alles in Ordnung ist.
Die beiden ``if``\s testen genau die entgegengesetzten Fälle, also ist das eigentlich ein ``if``/``else``. Aber selbst das braucht man nicht, denn das Ergebnis der ersten Bedingung kann man direkt als Wert für den Pin verwenden.
Code: Alles auswählen
#!/usr/bin/env python3
import sys
from PyQt5 import uic
from PyQt5.QtCore import QThread
from PyQt5.QtWidgets import QApplication, QMainWindow
from RPi import GPIO
import cv2
import numpy
LIGHT_PIN = 25
class Hauptfenster(QMainWindow):
def __init__(self):
super().__init__()
uic.loadUi('/home/pi/Bildprogramm/Ui - Dateien/Bildprogramm.ui', self)
self.setWindowTitle('Serienbildaufnahme')
self.BeleuchtungAutomatisch.clicked.connect(
self.start_automatic_lighting
)
self.BeleuchtungEin.clicked.connect(self.switch_light_on)
self.BeleuchtungAus.clicked.connect(self.switch_light_off)
self.thread = None
def start_automatic_lighting(self):
if self.thread is None or self.thread.isFinished():
self.thread = AutomaticLightingControl()
self.thread.start()
class AutomaticLightingControl(QThread):
def run(self):
video = cv2.VideoCapture(0)
GPIO.setup(LIGHT_PIN, GPIO.OUT)
while not self.isInterruptionRequested():
is_ok, frame = video.read()
if not is_ok:
break
GPIO.output(
LIGHT_PIN,
numpy.mean(cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)) < 150
)
def main():
GPIO.setmode(GPIO.BCM)
try:
app = QApplication(sys.argv)
app.setStyle('Fusion')
window = Hauptfenster()
window.show()
sys.exit(app.exec())
finally:
GPIO.cleanup()
if __name__== '__main__':
main()