vielleicht könnt ihr mir helfen?! Seit Tagen sitze ich an diesem simplen Problem und kriege es nicht gebacken...Das Problem ist simpel: Drücke ich auf den "Create Alarms" Button in der GUI, wird eine zuvor erstellte *.csv geladen, die ich dann in einer for-Schleife durchlaufe. Nach jedem Durchlauf soll die Zeile im QTextBrowser angezeigt werden.
Mache ich da keinen extra Thread, freezt die GUI ein. Das ist mir soweit bewusst. Wie kriege ich das hin?
Ich hab es schon mit QRunnable Klassen versucht, mit QtCore.QMetaObject.invokeMethod()...aber nix löst mein simples Problem. Für jeden Hinweis, wie ich das Problem gelöst bekomme und weshalb diese Fehlermeldung auftaucht, wäre ich sehr dankbar. Die run(self) Funktion der AlarmLog(QThread) Klasse wird nicht mal ausgeführt.
Das habe ich bei einer von QRunnable abgeleiteten KLasse immerhin geschafft, aber dann kam beim Versuch, in der GUI die Information anzuzeigen, der Fehler, dass dieser Thread nicht auf Objekte des PyQT Threads zugreifen könnte.
Also zusammengefasst: Ich möchte nur über meine csv Datei iterieren und jede Zeile in die GUI mittels extra Thread anzeigen lassen.
Code: Alles auswählen
class AlarmLog(QThread):
""" raise Alarmingtime into AlarmLog in GUI as a new Thread to avoid freezing gui """
def __init__(self, GUI):
super(AlarmLog, self).__init__()
self.GUI = GUI
self.alarmSplitted = []
AlarmLogChange = pyqtSignal(str)
def run(self):
print("inside run")
# QtCore.QMetaObject.invokeMethod(self.GUI.alarmLog, QtCore.Qt.QueuedConnection, QtCore.Q_ARG(str, text))
# *********** SPEAK ENGINE **********************
print("inside run")
engine = pyttsx3.init()
engine.setProperty('rate', 120)
voices = engine.getProperty('voices')
engine.setProperty('voice', voices[1].id)
with open("ALARMTIME_PTS_DISCOVERY_SORTED.txt") as fileobject:
for row in fileobject:
self.alarmSplitted.append(row)
for alarmtime_pts in self.alarmSplitted:
speak = alarmtime_pts[20:35].replace("_", "")
channel = alarmtime_pts[41:47]
if channel == "DMAXHD":
channel = "deemax"
elif channel == "TLCHD":
channel = "Teelcee"
elif channel == "HGTVHD":
channel = "HGTVee"
if speak == "Cornerbug in":
speak = "Kornerbaak in"
if speak == "Commercial promo":
speak = "commercial proomoooo"
# ****** Dateobject (without dT Alias not working!) ******
self.timestamp_CEST = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
self.timestamp_CEST = dt.datetime(int(self.timestamp_CEST[0:4]), int(self.timestamp_CEST[5:7]), int(self.timestamp_CEST[8:10]) , int(self.timestamp_CEST[11:13]) ,int(self.timestamp_CEST[14:16]) ,int(self.timestamp_CEST[17:19]))
self.timestamp_PTS = dt.datetime(int(alarmtime_pts[0:4]), int(alarmtime_pts[5:7]), int(alarmtime_pts[8:10]) , int(alarmtime_pts[11:13]) ,int(alarmtime_pts[14:16]) ,int(alarmtime_pts[17:19]))
self.timestamp_SLEEP = self.timestamp_PTS - self.timestamp_CEST
self.timestamp_SLEEP = self.timestamp_SLEEP.total_seconds() # Converting in Seconds for sleep()
self.Alarmtext = f"{alarmtime_pts:>20}{'(':>2}{self.timestamp_SLEEP:>6}{' seconds )':>1}"
self.AlarmLogChange.emit(self.Alarmtext)
class GUI(QtWidgets.QDialog):
def __init__(self, parent=None):
super().__init__(parent)
self.ui = uic.loadUi(r"C:\Users\Marc\SINGLECHANNEL_ALARMING_TOOL\VERS_02_DISCOVERY\SINGECHANNEL_ALARMING_TOOL_DISCOVERY.ui", self)
self.ui.setWindowTitle('DISCOVERY ALARMING TOOL')
self.ui.createAlarms.clicked.connect(self.initAlarmingtool)
self.threadpool = QThreadPool()
def initAlarmingtool(self):
GUI = self
call_class_alarmingtool(GUI)
AlarmlogThread = AlarmLog(GUI)
# QTREAD *********************
AlarmlogThread.AlarmLogChange.connect(self.ChangeLog)
AlarmlogThread.start()
def ChangeLog(self, Alarmtext):
self.ui.alarmLog.setText(Alarmtext)