Python:GUI和套接字线程

时间:2016-01-14 15:27:27

标签: python multithreading sockets user-interface tkinter

我正在开发一款软件并遇到一些重大问题(我是python的新手)...... 该应用程序应该处理.csv中的一些任务。程序启动时,它应该读取文件并在GUI中很好地显示任务。在GUI中有一些工具,如编辑,删除和移动某些任务。 还有一个套接字服务器,它将已排序的任务发送给客户端。 这两个功能都有效,但不兼容。 每次客户端连接到服务器时,GUI都会崩溃。我知道这是因为套接字阻塞了进程,我需要为GUI创建一个单独的线程,但我无法弄清楚如何做到这一点。

我在一个函数中填充了GUI的所有Tkinter-Code并尝试了threading.Thread(target = guiStart,args =())。但是由于“从不同公寓调用Tcl”(在OSX上运行,但也应该在Win上运行)以及修改GUI内容的函数中的一些未定义的全局变量等错误消息,GUI停止工作...

我不知道该怎么做,我读了很多线程示例代码,但我无法弄清楚如何解决我的问题。

有没有人可以告诉我该怎么做?

这是我的代码(没有我的线程尝试):

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



loadTasks()   
thread = threading.Thread(target = runServer)
thread.deamon = True
thread.start()
root.mainloop()

(还有另一个小错误我无法摆脱:see here

1 个答案:

答案 0 :(得分:1)

我建议您查看saveas并使用异步套接字,而不是每个连接生成一个新线程。这将删除所有“阻止”从套接字读取/接受的想法。在异步文件I / O方面,Asyncio处理了许多棘手的事情,但需要一点时间来适应整个“未来”概念。我建议您阅读文档。