Python Tkinter can';套接字循环正在发生时无法工作
请,我需要代码方面的帮助:Python Tkinter can';套接字循环正在发生时无法工作,python,sockets,loops,tkinter,Python,Sockets,Loops,Tkinter,请,我需要代码方面的帮助: def start(): def start_tkinter(): global main,l main.destroy() main=Tk() l=Listbox(main) f1=Frame(main) e=Entry(f1) b1=Button(main,text="Stop",command=parar) l.pack(side=TOP) f1.p
def start():
def start_tkinter():
global main,l
main.destroy()
main=Tk()
l=Listbox(main)
f1=Frame(main)
e=Entry(f1)
b1=Button(main,text="Stop",command=parar)
l.pack(side=TOP)
f1.pack(side=BOTTOM)
e.pack(side=LEFT)
b1.pack(side=RIGHT)
main.update()
start_server()
def start_server():
HOST, PORT = "localhost", 9999
server = SocketServer.UDPServer((HOST, PORT), MyUDPHandler)
server.serve_forever()
start_tkinter()
当我启动循环时,Tkinter冻结,我无法使用它。请,我需要一个解决方案。您可以尝试以下方法:
但是,由于我们不知道您想要做什么,您的代码也不是问题中给出的真正可执行的,因此我不能给出这个建议。您是正确的。本质上,您需要两个并行运行的无限循环:一个用于服务GUI,另一个用于服务socket服务器。您唯一的选择是使用两个线程或两个进程* 要记住的主要一点是Tkinter需要在主线程中运行,并且您不能直接从另一个线程访问Tkinter对象,因为Tkinter不是线程安全的。如果希望套接字线程与Tkinter交互,则需要引入某种消息传递机制
*这些不是你唯一的选择,但它们是最实际的。当我需要从套接字读取数据时,我通常会编写一些Tcl代码以在底层Tcl解释器中运行,因为Tcl的fileevent模型非常强大。您将失去线程化实现的复杂性,代价是必须进行一点Tcl编程。但我离题了。好了,孩子们,我现在就用这个。看:
t = Thread(target=start_server)
t.start()
但是谢谢你的回答。你确定你原来的问题不是因为使用了“阻塞”套接字吗?
如果是这样的话,那么答案将非常简单,只需键入“socket.setblocking(0)”@Meni如果没有您的代码,我们将无法提供帮助,如果您的示例不遵循,我们将很难提供帮助。用你的新代码发布一个新问题,并将链接放在这里,这样我们就可以尝试找到问题。
t = Thread(target=start_server)
t.start()