Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Tkinter can';套接字循环正在发生时无法工作_Python_Sockets_Loops_Tkinter - Fatal编程技术网

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()