请,我的代码需要帮助:
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冻结,我无法使用它。拜托,我需要一个解决方案。
答案 0 :(得分:3)
你是对的。实质上,您需要并行运行两个无限循环:您需要一个服务GUI,另一个服务套接字服务器。您唯一的选择是使用两个线程或两个进程。*
要记住的主要事情是Tkinter需要在主线程中运行,并且您不能直接从其他线程访问Tkinter对象,因为Tkinter不是线程安全的。如果希望套接字线程与Tkinter交互
,则需要引入某种消息传递机制*这些不是你唯一的选择,但它们是最实用的。当我需要从套接字读取数据时,我通常编写一些Tcl代码在底层Tcl解释器中运行,因为Tcl的fileevent模型非常强大。你失去了线程实现的复杂性,代价是不得不做一点Tcl编程。但我离题了。
答案 1 :(得分:1)
嗯,我现在只是使用Threaring。看:
t = Thread(target=start_server)
t.start()
但是谢谢你的回答。
答案 2 :(得分:0)
您可能想尝试multiprocessing module:
import multiprocessing
def start():
def start_tkinter():
global main,l
# ...
main.update()
proc = multiprocessing.Process(target=start_server)
proc.start()
def start_server():
HOST, PORT = "localhost", 9999
# ...
但是,由于我们不知道你想做什么,你的代码在问题中都没有真正可执行,我不能只提出这个建议。
答案 3 :(得分:0)
你确定你的原始问题并非来自使用"阻止"插座? 如果是这种情况,那么答案就像输入" socket.setblocking(0)"
一样简单