Python 3.5 Threading

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.
Antworten
Donar3103
User
Beiträge: 9
Registriert: Sonntag 24. Januar 2016, 12:04

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?
Sirius3
User
Beiträge: 17737
Registriert: Sonntag 21. Oktober 2012, 17:20

@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.
Donar3103
User
Beiträge: 9
Registriert: Sonntag 24. Januar 2016, 12:04

und wie löse ich mein Problem dann?
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.
Donar3103
User
Beiträge: 9
Registriert: Sonntag 24. Januar 2016, 12:04

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?
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.
Antworten