3 Stimmen

Die Loop-Götter schlagen wieder zu - Wie hält man die Socket-Verbindung trotz GUI-Mainloop aufrecht?

Frage

Wie führe ich die Tkinter mainloop und eine unendliche Server-Schleife gleichzeitig im selben Skript aus?

Hintergrund

Ich bin dabei, einen GUI-Server in Tkinter (Python 2.7.3) zu erstellen. Bisher funktioniert das GUI korrekt, der Server funktioniert korrekt, aber ich habe Schwierigkeiten, beides zu integrieren. Soweit ich weiß (korrigiere mich, wenn ich falsch liege), muss der Server in einer unendlichen Schleife laufen, um neue Benutzer zu akzeptieren. Leider benötigt das GUI auch eine unendliche Schleife. Ich frage mich, wie ich beide Schleifen gleichzeitig laufen lassen kann.

Meine aktuelle mainloop-Funktion sieht wie folgt aus (s ist das Socket-Objekt):

def mainloop(s):
    while True:
        channel, addr = s.accept()
        print "Verbunden mit", addr

Das wird offensichtlich benötigt, um den Server am Laufen zu halten (denke ich). Das Problem ist jedoch, dass diese Schleife vor meinem mainloop kommt und ich daher Probleme damit habe. Wenn ich es anders herum mache, wird der Server nie geöffnet.

Vollständiger Code

Mein Server-Code ist hier und mein Client ist hier.

Danke!

4voto

twasbrillig Punkte 14254

Verwenden Sie das Thread-Modul, um Ihre Server-Mainloop in einem neuen Thread zu öffnen.

Ersetzen

mainloop(s)

mit

thread.start_new_thread(mainloop, (s,))

Dann können Sie root.mainloop() aufrufen, um Tkinter auszuführen, genau wie Sie es getan haben.


UPDATE

Gemäß A. Rodas' Kommentar unten wird empfohlen, das neuere threading-Modul zu verwenden, das mit Python 3 kompatibel ist.

Sie können also

mainloop(s)

mit

threading.Thread(target=mainloop, args=(s,)).start()

3voto

Saurabh7 Punkte 710

Sie möchten vielleicht Twisted verwenden http://twistedmatrix.com/trac/

Es integriert die Tk-Schleife in seine Reactor-Schleife (die das Networking macht) http://twistedmatrix.com/documents/8.2.0/api/twisted.internet.tksupport.html, und Sie können leicht Protokolle erstellen....

0voto

Nathan Davis Punkte 5198

Führen Sie sie in separaten Threads aus. Siehe die Dokumentation zum threading-Modul für weitere Informationen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X