循环之神再次罢工 - 尽管GUI主循环如何保持套接字连接?

时间:2013-04-02 02:02:48

标签: python sockets client-server tkinter

问题

如何在同一个脚本中同时运行Tkinter mainloop和无限服务器循环?

背景

我正在使用Tkinter(Python 2.7.3)创建GUI服务器。到目前为止,GUI工作正常,服务器正常工作,我遇到了集成两者的问题。据我所知(如果我错了,请纠正我)服务器需要在无限循环上运行才能接受新用户。遗憾的是,GUI还需要一个无限循环。我想知道如何让两个循环同时运行。

我当前的mainloop函数看起来像这样(s是套接字对象):

def mainloop(s):
    while True:
        channel, addr = s.accept()
        print "Connected with", addr

显然需要保持服务器运行(我想。)但问题是,这个循环出现在mainloop之前,因此我遇到了问题。如果我反过来这样做,服务器永远不会打开。

完整代码

我的服务器代码为here,我的客户端为here

谢谢!

3 个答案:

答案 0 :(得分:4)

使用线程模块在新线程中打开服务器mainloop。

替换

mainloop(s)

thread.start_new_thread(mainloop, (s,))

然后你可以调用root.mainloop()来运行Tkinter,就像你一样。


<强>更新

Per A. Rodas&#39;在下面发表评论时,我们首选使用与Python 3兼容的较新threading模块。

所以你可以替换

mainloop(s)

threading.Thread(target=mainloop, args=(s,)).start()

答案 1 :(得分:3)

您可能想要使用Twisted http://twistedmatrix.com/trac/

它将Tk循环集成到其反应器循环(进行网络连接)http://twistedmatrix.com/documents/8.2.0/api/twisted.internet.tksupport.html中,您可以轻松构建协议....

答案 2 :(得分:0)

在不同的线程中运行它们。有关详细信息,请参阅threading module documentation