ich experimentiere gerade mit Python und versuche eine Textbox (QTGui) durch einen anderen Thread befüllen zu lassen. Das Problem jedoch ist wenn ich die 2 Threads anhalte, Python nicht beendet wird. Ich habe das Gefühl das irgendein Thread weiterläuft. Ebenfalls ist mir bewusst das man mein Beispiel wahrscheinlich über Signal und Slots besser verarbeiten kann. Jedoch wollte ich irgendwie anfangen und so eine richtiges Tutorial über das selbsterstellen von Signals und Slots hab ich noch nicht gefunden. Für Beispiele und Tutorials die mir dies erklären oder eine Erläuterung was ich in meinem konkreten Beispiel falsch gemacht habe wäre ich dankbar.

Code: Alles auswählen
import sys
import random
#asyncio test
import asyncio
import threading
#hier hole ich mir die Schnittstelle
from qtpy import QtWidgets
from qtpy import QtGui
#hier wird die GUI selbst geladen
from ui.textbox import Ui_MainWindow
import time
#hiermit wird die Applikation erzeugt ist grundvorraussetzung
app = QtWidgets.QApplication(sys.argv)
#Grundlegende Initalisierung der GUI
class textbox_thread_test(QtWidgets.QMainWindow):
def __init__(self, parent=None):
super().__init__(parent)
self.ui = Ui_MainWindow()
self.lauf = True
self.ui.setupUi(self)
self.show()
#Beginn eigener Funktionen
def text_anhängen(self, text):
self.ui.textEdit.append(text)
async def _schreib_test_b(self,text):
while self.lauf:
print("test aus der qtapp beginnt")
self.text_anhängen("test vor dem schlafen gehen")
await asyncio.sleep(2)
self.text_anhängen("text nacht dem schlafen")
print("fertig")
if self.lauf == False:
break
print("schreibtest ende")
async def process_events(self):
while self.lauf:
app.processEvents()
await asyncio.sleep(0.02)
if self.lauf == False:
break
print("process_events_ende")
def async_task_start(self):
ioloop = asyncio.get_event_loop()
#""" gatherer methode
task1 = asyncio.gather(*[self._schreib_test_b("Testmessage aus asynchronen Thread")])
task2 = asyncio.gather(*[self.process_events()])
print("vor dem start des Tasks")
all_tasks = asyncio.gather(task1, task2)
#"""
#ensure_feature test
#task1= asyncio.ensure_future(self._schreib_test_b("Testmessage"))
#task_2 =asyncio.ensure_future(self.process_events())
"""
tasks = [ioloop.create_task(self._schreib_test_b("Testmessage"))]
tasks_2 = [ioloop.create_task(self.process_events())]
all_tasks = asyncio.wait(tasks, tasks_2)"""
ioloop.run_until_complete(all_tasks)
#ioloop.run_forever()
print("nach dem Start des Task")
ioloop.close()
print("loop wurde beendet")
def closeEvent(self, a0: QtGui.QCloseEvent):
self.lauf = False
print("wurde geschlossen")
a0.accept()
self.close()
#Erzeugen des Fensters
test_fenster = textbox_thread_test()
#start des Codes
test_fenster.ui.textEdit.append("test")
test_fenster.text_anhängen("test2 \n")
test_fenster.async_task_start()
#Programm sauber beenden
print("vor dem sys.exit")
sys.exit(app.exec_())
sys.exit()