Tkinter und Socket-Server parallel... Threading?
Verfasst: Donnerstag 14. Januar 2016, 19:29
Hallo zusammen,
ich bin dabei eine Anwendung zu schreiben, die neben einer Benutzeroberfläche mit Tkinter auch einen Socket-Server behinhaltet.
Grobe Funktion: Anwendung liest eine .csv-Datei ein, in der Aufgaben stehen. Die Tasks werden in der GUI dargestellt und können beabeitet und neu abgespeichert werden. Über den Socket verbinden sich Clients, welche vom Server gewisse Tasks zugeschickt bekommen sollen. Die Clients geben daraufhin Feedback.
Mit vielen Tutorials und Beispielcodes habe ich mich ans Werk gemacht und versucht es möglichst simpel umzusetzen (ohne OOP).
Alle Bestandteile für sich funktionieren soweit. Nun friert leider die GUI ein, sobald sich ein Client mit dem Server verbindet. Warum ist mir auch klar: der Socket blockiert die GUI solange, bis die Verbindungen geschlossen werden.
Abhilfe würde es also schaffen, die GUI in einem separatem Thread laufen zu lassen. Ich habe schon mehrere Möglichkeiten probiert, aber nichts hat funktioniert.
Ich habe mal versucht meinen Code um alles für dieses Problem überflüssige zu erleichtern. Dies ist der letzte funktionierende Stand (ohne meine vergeblichen Versuche die GUI in einen Thread zu verpacken):
Ich bin ein kompletter Python-Neuling und dies stellt mein erstes Projekt dar. Würde mich sehr über ein paar konkrete Hinweise freuen!
Viele Grüße
Oliver
P.S.: Es MUSS leider bei Python 2.7 bleiben, da ich auf ein zusätzliches Modul angewiesen bin, welches nur unter 2.7 läuft!
ich bin dabei eine Anwendung zu schreiben, die neben einer Benutzeroberfläche mit Tkinter auch einen Socket-Server behinhaltet.
Grobe Funktion: Anwendung liest eine .csv-Datei ein, in der Aufgaben stehen. Die Tasks werden in der GUI dargestellt und können beabeitet und neu abgespeichert werden. Über den Socket verbinden sich Clients, welche vom Server gewisse Tasks zugeschickt bekommen sollen. Die Clients geben daraufhin Feedback.
Mit vielen Tutorials und Beispielcodes habe ich mich ans Werk gemacht und versucht es möglichst simpel umzusetzen (ohne OOP).
Alle Bestandteile für sich funktionieren soweit. Nun friert leider die GUI ein, sobald sich ein Client mit dem Server verbindet. Warum ist mir auch klar: der Socket blockiert die GUI solange, bis die Verbindungen geschlossen werden.
Abhilfe würde es also schaffen, die GUI in einem separatem Thread laufen zu lassen. Ich habe schon mehrere Möglichkeiten probiert, aber nichts hat funktioniert.
Ich habe mal versucht meinen Code um alles für dieses Problem überflüssige zu erleichtern. Dies ist der letzte funktionierende Stand (ohne meine vergeblichen Versuche die GUI in einen Thread zu verpacken):
Code: Alles auswählen
from Tkinter import *
import csv
import socket
import sys
import json
from thread import *
import threading
root = Tk()
#------------Server Config------
HOST = ''
PORT = 8888
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) #test
print 'Socket created'
#Bind socket to local host and port
try:
s.bind((HOST, PORT))
except socket.error as msg:
print 'Bind failed. Error Code : ' + str(msg[0]) + ' Message: ' + msg[1]
sys.exit()
print 'Socket bind complete'
#Start listening on socket
s.listen(10)
print 'Socket now listening'
#------------Functions---------
# a lot of functions...
def clientthread(conn):
conn.send('CONNECTED \n')
#conn.send(json.dumps(tasksA))
station = ""
while True:
print "Entered loop" #
databytes = conn.recv(1024)
if not databytes: break
data = databytes.decode("utf-8")
print "Client: " + data
if data =='STATION_A':
station = "Station A"
print "Connected to: " + station
conn.send(json.dumps(tasksA))
#some more if-clauses
conn.close()
def runServer():
while True:
conn, addr = s.accept()
#conn.setblocking(0)
print 'Connected with ' + addr[0] + ':' + str(addr[1])
#start new thread takes 1st argument as a function name to be run, second is the tuple of arguments to the function.
start_new_thread(clientthread ,(conn,))
root.after(100, runServer)
s.close()
#------------GUI-----------------------
root.geometry("1024x768")
root.minsize(width="1024", height="768")
root.title("FTS v04")
#... left out most of the gui stuff... just too much code
thread = threading.Thread(target = runServer)
thread.deamon = True
thread.start()
root.mainloop()
Viele Grüße
Oliver
P.S.: Es MUSS leider bei Python 2.7 bleiben, da ich auf ein zusätzliches Modul angewiesen bin, welches nur unter 2.7 läuft!