Funktion einer Klasse wird nicht aufgerufen, obwohl sie funzt

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
xXSkyWalkerXx1
User
Beiträge: 379
Registriert: Mittwoch 27. Juni 2018, 17:39

Naja, das Problem ist (hätte ich vllt im Vorraus erwähnen sollen), dass, sobald man auf "login" (Button) drückt, das Fenster solange nicht reagiert, bis es z.b. die WhatsApp-Nachricht gesendet hat.
Ich dachte eigentlich man mache das mit "Thread" oder "Process".

Wie kann man dann sowas machen? Etwa mit der "after" Methode, von der ich so viel lese...?^^
__deets__
User
Beiträge: 14494
Registriert: Mittwoch 14. Oktober 2015, 14:29

Wenn du von der liest, dann wohl eher nicht im Zusammenhang mit Qt. Da sind das QTimer.

Man KANN das dann mit einem Thread oder Prozess machen. Man kann auch asyncio oder ähnliches verwenden. Wobei ich das generell in frage stellen würde. Was soll der Benutzer denn tun, solange der Login Vorgang läuft?
xXSkyWalkerXx1
User
Beiträge: 379
Registriert: Mittwoch 27. Juni 2018, 17:39

Na tun soll er nichts, das Problem ist nur, dass wenn man dann auf's Fenster klickt (sollte der Vorgang wegen schlechten Internets länger dauern) es nicht reagiert...der Benutzer soll ja nicht denken, dass das Programm abgestürzt ist.

Das Gleiche bräuchte ich für meine Belegarbeit, die ich im Leistungskurs Mathe schreibe - da soll ich ein Programm schreiben, welches die lokalen & globale Minimas und Maximas berechnet - da soll ja auch nicht währenddessen kommen: "Fenster reagiert nicht" (oder so) , sollte man Mal aus Ungeduld auf's Fenster klicken, weil es vllt lange dauert.
Zuletzt geändert von xXSkyWalkerXx1 am Montag 13. Mai 2019, 19:32, insgesamt 1-mal geändert.
__deets__
User
Beiträge: 14494
Registriert: Mittwoch 14. Oktober 2015, 14:29

Das kann man mit Threads machen. Oder die Aufgaben in kleine Happen teilen und über QTimer triggern.
xXSkyWalkerXx1
User
Beiträge: 379
Registriert: Mittwoch 27. Juni 2018, 17:39

Okay, danke - schaue ich mir morgen Mal an.
xXSkyWalkerXx1
User
Beiträge: 379
Registriert: Mittwoch 27. Juni 2018, 17:39

Da ich nicht erneut ein Thread öffnen wollte, habe ich jetzt einfach Mal dieses ausgewählt.

Undzwar möchte ich zu einem Programmen eine dynamische Library hinzufügen, da ich aber kein Server habe ,denn 1) kein Geld ausgeben will & 2) zu faul bin mir erst ein einzurichten, habe ich es so gemacht, dass ich jedes Programm (Name+URL) auf eine Seite meiner Webseite schreibe, was z.b. so aussieht:

Code: Alles auswählen

Python-Forum | www.python-forum.de
Nun könnten allerdings tausende Programme (also Name+Url - jedes Programm durch neue Zeile trennbar) da stehen, dafür habe ich folgenden Code:

Code: Alles auswählen

for programs in online_libs: #'online_libs' wäre in diesem Bsp: [Python-Forum | www.python-forum.de]
            menu_item = QAction(QIcon("sgi_icon.png"),str(programs.split('|')[0]),self)
            menu_item.triggered.connect(lambda: webbrowser.open(str(programs.split('|')[1])))
            self.library.addAction(menu_item)
Die Menus werden erstellt, mit Name und Url, allerdings ist auf allen Items die Url des letzten Datensatzes.
Das Warum ist mir klar, denn 'triggered.connect()' greift letztendlich nur auf 1 Variable zu.

Aber mir fällt nichts ein wie ich die Variable in der for-Schleife nach jeden Ablauf unterschiedlich erzeugen lasse.
__deets__
User
Beiträge: 14494
Registriert: Mittwoch 14. Oktober 2015, 14:29

Und weil ich nicht moechte, das ein einzelner Thread zu einer thematisch inkongruenten Ansammlung von Nachrichten verkommt, werde ich die Frage hier nicht beantworten ;)
xXSkyWalkerXx1
User
Beiträge: 379
Registriert: Mittwoch 27. Juni 2018, 17:39

Da es hier ja um das Nicht-Erscheinen eines Fenster geht, poste ich hier erneut mein Anliegen.

Undzwar habe ich 2 Codes:

Code: Alles auswählen

def start_thread(self,username,password,trial_version,instance):         
        self.LoginThread = Thread(username,password,trial_version,instance)
        self.LoginThread.start()


class Thread(threading.Thread):
	def __init__(self,username,password,trial_version,instance):
        	"""
        	initilialize Thread
        	"""
       	 	threading.Thread.__init__(self)
        	self.username = username
        	self.password = password
        	self.trial_version = trial_version
        	self.login_window = instance
	
	def run(self):
		self.login_window.close()
                self.ui = Interface().main(
                                         self.script,self.prog_version,self.script_version,
                                         self.script_path,self.lic,self.library_list,
                                         self.username,self.trial_version
                                                     )

Code: Alles auswählen

def start_thread(self,username,password,trial_version,instance):         
        self.LoginThread = Thread(username,password,trial_version,instance)
        self.LoginThread.run()


class Thread():
	def __init__(self,username,password,trial_version,instance):
        	self.username = username
        	self.password = password
        	self.trial_version = trial_version
        	self.login_window = instance
	
	def run(self):
		self.login_window.close()
                self.ui = Interface().main(
                                         self.script,self.prog_version,self.script_version,
                                         self.script_path,self.lic,self.library_list,
                                         self.username,self.trial_version
                                                     )
Mein Ziel ist es ein Loginvorgang mit Thread zu erstellen, damit sich das Fenster dabei nicht aufhängt & der Benutzer denkt das Programm sei abgestürzt.
Der 1. Code funktioniert nicht, der 2. aber schon - sprich: der Code mit dem Thread funktioniert nicht, der ohne Thread tut es aber.

Ich verstehe nicht wieso - okay, wende Threads auch erst seit neuesten an.
Kann mir da jemand erklären, worin das Problem liegt?

Danke im Vorraus & Grüße,
xXSkyWalkerXx1
xXSkyWalkerXx1
User
Beiträge: 379
Registriert: Mittwoch 27. Juni 2018, 17:39

Iwer weiß es doch? ^^
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

GUIs und Threads sind eine schwierige Sache, vor allem, wenn es keine QT-Threads sind.
Die Thread-Klasse macht nichts sinnvolles und der Rest des Codes fehlt, um zu verstehen, was Du machen willst. Was ist `Interface` oder `main`?
Antworten