2

拜托,我的代码需要帮助:

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

4 回答 4

4

你是对的。本质上,您需要两个并行运行的无限循环:您需要一个为 GUI 提供服务,另一个为套接字服务器提供服务。您唯一的选择是使用两个线程或两个进程。*

要记住的主要事情是 Tkinter 需要在主线程中运行,并且您不能直接从另一个线程访问 Tkinter 对象,因为 Tkinter 不是线程安全的。如果您希望套接字线程与 Tkinter 交互,则需要引入某种消息传递机制

*这些不是您唯一的选择,但它们是最实用的。当我需要从套接字读取数据时,我通常会编写一些 Tcl 代码在底层 Tcl 解释器中运行,因为 Tcl 的 fileevent 模型非常强大。你失去了线程实现的复杂性,代价是不得不做一些 Tcl 编程。但我离题了。

于 2012-06-25T23:41:30.837 回答
1

好吧,男孩们我现在只使用Threaring。看:

t = Thread(target=start_server)
t.start()

但感谢您的回答。

于 2012-06-28T01:00:53.643 回答
0

你确定你原来的问题不是来自使用“阻塞”套接字吗?如果是这种情况,那么答案就像输入“socket.setblocking(0)”一样简单

于 2014-05-09T00:41:50.377 回答
0

您可能想尝试多处理模块

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
     # ...

但是,由于我们不知道您想做什么,您的代码也不是问题中给出的真正可执行的,我不能只给出这个建议。

于 2012-06-25T22:06:18.913 回答