当套接字循环发生时,Tkinter无法工作

时间:2012-06-25 21:56:12

标签: 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.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冻结,我无法使用它。拜托,我需要一个解决方案。

4 个答案:

答案 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)"

一样简单