我正在开发一款软件并遇到一些重大问题(我是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
答案 0 :(得分:1)
我建议您查看saveas并使用异步套接字,而不是每个连接生成一个新线程。这将删除所有“阻止”从套接字读取/接受的想法。在异步文件I / O方面,Asyncio处理了许多棘手的事情,但需要一点时间来适应整个“未来”概念。我建议您阅读文档。