Seite 1 von 1

Python 3.5 Threading

Verfasst: Mittwoch 4. Mai 2016, 12:49
von Donar3103
Ich habe folgendes Problem:
Ich habe in Python mit Hilfe von Sockets ein einfachen Netzwerknachrichtendienst als GUI programmiert.
Dazu benutze ich drei Klassen:
den Empfänger, welcher die eingehenden Nachrichten empfängt und an die Hauptklasse weitergibt.

Die Hauptklasse erzeugt für jeden Chat ein Object aus der Klasse Chats und übergibt die Nachrichten, welche von dem Empfänger(Objekt) kommen, an das jeweile Chatfenster(Objekt von Klasse Chats).
Den Empfänger habe ich in einen neuen Thread gesteckt damit dieser ungestört empfangen kann. Jedoch gibt es beim übergeben von Empfänger zu dem Objekt der Klasse Hauptklasse einen Fehler.

Fehler:
RuntimeError: main thread is not in main loop

"main": Objekt der Hauptklasse

Was mache ich falsch?

Re: Python 3.5 Threading

Verfasst: Mittwoch 4. Mai 2016, 13:09
von Sirius3
@Donar3103: main-thread ist der Thread der erzeugt wird, wenn das Programm gestartet wird. GUIs dürfen immer nur von diesem Thread aus verändert werden, normalerweise im Rahmen der Event-Verarbeitung, die vom main-loop des GUI-Rahmenwerks gesteuert wird.

Re: Python 3.5 Threading

Verfasst: Mittwoch 4. Mai 2016, 13:54
von Donar3103
und wie löse ich mein Problem dann?

Re: Python 3.5 Threading

Verfasst: Mittwoch 4. Mai 2016, 14:05
von BlackJack
@Donar3103: Das kommt auf das GUI-Rahmenwerk an, ob und wenn ja welche Möglichkeiten es bietet um Informationen threadsicher zum Hauptthread in die GUI zu bringen.

Re: Python 3.5 Threading

Verfasst: Donnerstag 5. Mai 2016, 20:02
von Donar3103
Ich benutze tkinter
was genau meinst du jetzt mit GUI Rahmenwerk?

gibt es nicht eine einfache Möglichkeit mit den Thread des Empfängers auf den HAuptthread zuzugreifen?

Re: Python 3.5 Threading

Verfasst: Donnerstag 5. Mai 2016, 20:13
von BlackJack
@Donar3103: In diesem Fall ist `tkinter` genau mit GUI-Rahmenwerk gemeint. Gibt ja auch noch andere.

Bei Tk ist die übliche Lösung andere Threads Informationen in eine `Queue.Queue` stecken zu lassen, die der GUI-Thread regelmässig abfragt. Dazu kann man die `after()`-Methode auf Widgets verwenden.