【问题标题】:Tkinter can't work while a socket loop is happening发生套接字循环时,Tkinter 无法工作
【发布时间】:2012-06-27 05:11:21
【问题描述】:

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

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

【问题讨论】:

    标签: python sockets loops tkinter


    【解决方案1】:

    你可能想试试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
         # ...
    

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

    【讨论】:

    • @Meni 如果没有您的代码,我们将无能为力,如果您的示例不遵循these instructions,无论如何将很难提供帮助。使用您的新代码发布一个新问题并将链接放在这里,以便我们尝试找到问题。
    【解决方案2】:

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

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

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

    【讨论】:

      【解决方案3】:

      好吧,伙计们,我现在只使用 Threaring。看:

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

      但感谢您的回答。

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          猜你喜欢
          • 2021-11-20
          • 1970-01-01
          • 1970-01-01
          • 2021-10-02
          • 1970-01-01
          • 2016-06-18
          • 2021-05-12
          • 2015-02-20
          • 1970-01-01
          相关资源
          最近更新 更多