GUI Freezed trotz zweiten Thread
Verfasst: Donnerstag 26. November 2020, 22:42
Hallo,
ich sitze in letzter Zeit an einem Programm mit welchem ich von meinem PC aus meinen LED streifen steuern kann. Das Projekt dient für mich zur Übung
.
Ich bin IT Student und möchte dementsprechend lernen wenn ich etwas falsch mache also falls euch Fehler an meinem Code auffallen könnt ihr mir gerne bescheid sagen (ok der Code ist wahrscheinlich voll davon
)
Nun aber zu meinem Problem. Ich habe mit QT eine GUI gebaut und das Programm schickt die ausgewählte Farbe an einen Raspberry Pi der den LED streifen ansteuert. Ich habe mehrere Modi eingebaut. In einem Modus soll das Licht immer wieder heller und dunkler werden. (wave_mode) Das habe ich über eine while schleife organisiert, da ich schon wusste das die GUI durch die (mehr oder weniger unendliche while schleife ) freezed, habe ich die Funktion in einen extra Thread verlagert. Nun freezed die GUI trotzdem.
Da ich auf dem Gebiet Threading noch keine Erfahrung habe denke ich das dort mein Fehler liegt.
Ich freue mich über jede Hilfe
MFG space
(Achso, ich wusste nicht wo ich das Thema einordnen sollte, bitte verschiebt es einfach in den richtigen Bereich)
Hier noch mein Code:
Das ist die Main.py
und das sind die GUI Funktionen
ich sitze in letzter Zeit an einem Programm mit welchem ich von meinem PC aus meinen LED streifen steuern kann. Das Projekt dient für mich zur Übung

Ich bin IT Student und möchte dementsprechend lernen wenn ich etwas falsch mache also falls euch Fehler an meinem Code auffallen könnt ihr mir gerne bescheid sagen (ok der Code ist wahrscheinlich voll davon

Nun aber zu meinem Problem. Ich habe mit QT eine GUI gebaut und das Programm schickt die ausgewählte Farbe an einen Raspberry Pi der den LED streifen ansteuert. Ich habe mehrere Modi eingebaut. In einem Modus soll das Licht immer wieder heller und dunkler werden. (wave_mode) Das habe ich über eine while schleife organisiert, da ich schon wusste das die GUI durch die (mehr oder weniger unendliche while schleife ) freezed, habe ich die Funktion in einen extra Thread verlagert. Nun freezed die GUI trotzdem.
Da ich auf dem Gebiet Threading noch keine Erfahrung habe denke ich das dort mein Fehler liegt.
Ich freue mich über jede Hilfe
MFG space
(Achso, ich wusste nicht wo ich das Thema einordnen sollte, bitte verschiebt es einfach in den richtigen Bereich)
Hier noch mein Code:
Das ist die Main.py
Code: Alles auswählen
import os
import re
import time
import sys, time
from PySide2 import QtCore, QtGui, QtWidgets
from PySide2.QtCore import (QCoreApplication, QPropertyAnimation, QDate, QDateTime, QMetaObject, QPoint, QRect, QSize, QTime, QUrl, Qt, QEvent)
from PySide2.QtGui import (QBrush, QColor, QConicalGradient, QCursor, QFont, QFontDatabase, QIcon, QKeySequence, QLinearGradient, QPalette, QPainter, QPixmap, QRadialGradient)
from PySide2.QtWidgets import *
from PySide2.QtCharts import QtCharts
from PySide2.QtWidgets import QMessageBox
from PySide2.QtWidgets import QFileDialog
import socket
import cv2
import PIL
import pyautogui
import threading
import time
from ui_main import Ui_MainWindow
from UI_Functions import *
class MainWindow(QMainWindow):
def __init__(self):
QMainWindow.__init__(self)
self.ui = Ui_MainWindow()
self.ui.setupUi(self)
UIFunctions.uiDefinitions(self)
self.show()
if __name__ == '__main__':
app = QApplication(sys.argv)
window = MainWindow()
sys.exit(app.exec_())
Code: Alles auswählen
from main import *
class UIFunctions(MainWindow):
def __init__(self):
pass
def uiDefinitions(self):
self.LM_Mode = 'static'
self.t1 = Wave_Mode_Thread()
self.client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.server_addr = ("192.168.178.38", 5050)
self.client_socket.connect(self.server_addr)
#CONFIGUREATE HORIZONTAL SLIDERS
self.ui.Blue_Horizontalslider.setMinimum(1)
self.ui.Blue_Horizontalslider.setMaximum(255)
self.ui.Red_horizontalslider.setMinimum(1)
self.ui.Red_horizontalslider.setMaximum(255)
self.ui.Green_Horizontaslider.setMinimum(1)
self.ui.Green_Horizontaslider.setMaximum(255)
# DEFINE RADIOBUTTONS FUNKTION
self.ui.Static_Mode_Radiobutton.clicked.connect(lambda: UIFunctions.launche_static_mode(self))
self.ui.Wave_Mode_RadioButton.clicked.connect(lambda: UIFunctions.launche_wave_mode(self))
self.ui.Audio_Mode_RadioButton.clicked.connect(lambda: UIFunctions.launche_wave_mode(self))
self.ui.Desktop_Mode_RadioButton.clicked.connect(lambda: UIFunctions.launche_desktop_mode(self))
#HORIZONTAL DEF
self.ui.Green_Horizontaslider.valueChanged.connect(lambda: UIFunctions.color_slider_update(self))
self.ui.Red_horizontalslider.valueChanged.connect(lambda: UIFunctions.color_slider_update(self))
self.ui.Blue_Horizontalslider.valueChanged.connect(lambda: UIFunctions.color_slider_update(self))
#BUTTON DEF
self.ui.pushButton.clicked.connect(lambda: UIFunctions.brightness_up(self))
self.ui.pushButton_2.clicked.connect(lambda: UIFunctions.brightness_down(self))
#DEFINE SOCKET SENDING FUNKTION
def send(self, r, g, b, mode):
input_list = str(int(r)) + ", " + str(int(g)) + ", " + str(int(b))+ ', ' + str(mode)
self.client_socket.send(bytes(input_list, 'utf-8'))
#LAUNCHE MODE
def launche_static_mode(self):
if self.LM_Mode != 'static':
self.LM_Mode = 'static'
self.t1.status = False
self.ui.MutliColor_RadioButton.setEnabled(True)
self.ui.OneColor_RadioButton.setEnabled(True)
r = self.ui.Red_horizontalslider.value()
g = self.ui.Green_Horizontaslider.value()
b = self.ui.Blue_Horizontalslider.value()
print(r, g, b)
UIFunctions.send(self, r, g, b, self.LM_Mode)
def launche_wave_mode(self):
if self.LM_Mode != 'wave':
self.LM_Mode = 'wave'
self.ui.MutliColor_RadioButton.setDisabled(True)
self.ui.OneColor_RadioButton.setDisabled(True)
g = self.ui.Green_Horizontaslider.value()
b = self.ui.Blue_Horizontalslider.value()
r = self.ui.Red_horizontalslider.value()
first_list = [r, g, b]
self.t1.status = True
self.t1.run(first_list, self)
def launche_desktop_mode(self):
self.t1.status = False
self.working_picture = r"E:\PycharmProjects\Screenshot_Farbmittelwert\1.png"
self.LM_Mode = 'desktop'
self.ui.MutliColor_RadioButton.setDisabled(True)
self.ui.OneColor_RadioButton.setDisabled(True)
while self.LM_Mode == 'desktop':
screenshot = pyautogui.screenshot()
screenshot.save(self.working_picture)
pic = cv2.imread(self.working_picture)
blue = 0
green = 0
red = 0
for x in range(0, 1080, 10):
for y in range(0, 2560, 10):
blue = blue + pic[x][y][0]
blue = blue / (2560 * 10.8)
for x in range(0, 1080, 10):
for y in range(0, 2560, 10):
green = green + pic[x][y][1]
green = green / (2560 * 10.8)
for x in range(0, 1080, 10):
for y in range(0, 2560, 10):
red = red + pic[x][y][2]
red = red / (2560 * 10.8)
if blue < green:
if green < red:
green = green * 0.8
blue = blue * 0.8
red = red * 0.8
blue = blue * 0.8
green = green * 0.8
red = red * 0.8
UIFunctions.send(self, red, green, blue, self.LM_Mode)
def brightness_up(self):
g = self.ui.Green_Horizontaslider.value()
b = self.ui.Blue_Horizontalslider.value()
r = self.ui.Red_horizontalslider.value()
if g < 246 and r < 246 and b < 246:
if g > 10:
self.ui.Green_Horizontaslider.setValue(g + 10)
if b > 10:
self.ui.Blue_Horizontalslider.setValue(b + 10)
if r > 10:
self.ui.Red_horizontalslider.setValue(r + 10)
if g < 10 and r < 10 and b < 10:
self.ui.Green_Horizontaslider.setValue(g + 10)
self.ui.Blue_Horizontalslider.setValue(b + 10)
self.ui.Red_horizontalslider.setValue(r + 10)
def brightness_down(self):
g = self.ui.Green_Horizontaslider.value()
b = self.ui.Blue_Horizontalslider.value()
r = self.ui.Red_horizontalslider.value()
if g > 10:
self.ui.Green_Horizontaslider.setValue(g - 10)
if b > 10:
self.ui.Blue_Horizontalslider.setValue(b - 10)
if r > 10:
self.ui.Red_horizontalslider.setValue(r - 10)
def color_slider_update(self):
if self.LM_Mode == 'static':
UIFunctions.launche_static_mode(self)
elif self.LM_Mode == 'wave':
UIFunctions.launche_wave_mode(self)
class Wave_Mode_Thread(threading.Thread):
def __init__(self):
threading.Thread.__init__(self)
self.status = False
def run(self, list, trans_self):
intensity = 60
r = list[0]
g = list[1]
b = list[2]
for i in list:
if i > (255 - intensity):
dif = i -(255 - intensity)
for sub in list:
sub = sub - dif
while self.status == True:
for x in range(0, intensity):
UIFunctions.send(trans_self, r + x, g + x, b + x, 'wave')
time.sleep(0.025)
for x in range(0, intensity):
UIFunctions.send(trans_self, r + (intensity - x), g + (intensity -x), b + (intensity-x), 'wave')
time.sleep(0.025)