Python 从多人聊天室开始谈系列 - Tkinter GUI
接下来我们差不多能聊起来了,剩下的就是解决上一篇中我们遗留的登出移除问题以及做一个界面,那样我们就能给更多的人用啦。
选择Tkinter,主要是,作为一个没有其他语言GUI基础的人,入门最简单粗暴的方法可能就是这个了。
关于Tkinter,网上的资源其实说不上太多,还是比较难找的,尤其是对于一个写惯了HTML/CSS的,其实是挺痛苦的。
Tkinter的布局教程可以看这里:http://effbot.org/tkinterbook/grid.htm
具体的组件可以见:http://www.tutorialspoint.com/python/python_gui_programming.htm
看完了之后,我们简单的选择组件进行操作。
root = Tk()
text = Text(root)
text.insert(INSERT, "Hello.....")
text.insert(END, "Bye Bye.....")
text.grid(row = 0, columnspan=15)
这里我们用grid布局,可以见上述的连接1,有详细的grid布局解释。
当然,我们的聊天界面是不应该允许编辑的,但是在Tkinter的组件中,不允许编辑意味着连使用代码都无法插入,所以我们需要在插入时开启,在结束后关闭。
text['state'] = NORMAL
text.insert(END, '\n' + word)
text['state'] = DISABLED
然后,我们还需要输入框。
userLabel = Label(root, text='UserName')
userLabel.grid(row=1)
userInput = Entry(root)
userInput.grid(row=1, column=1, columnspan=8)
messageLabel = Label(root, text='Message')
messageLabel.grid(row=2)
messageInput = Entry(root)
messageInput.grid(row=2, column=1, columnspan=8)
postMessageBtn = Button(root, text='POST', command=postMessage)
postMessageBtn.grid(row=2, column=9)
画完之后,我们需要用get()
获取数据,在未来的版本中,我们还将更新提交后删除输入框内文字的功能。
def postMessage():
text['state'] = NORMAL
text.insert(END, '\n' + userInput.get() + ': ' + messageInput.get())
s.sendall(userInput.get() + ': ' + messageInput.get())
text['state'] = DISABLED
当然,除了GUI,我们还需要额外的线程去处理接收,这个基本不用修改,和上一个版本一致:
class receiveThread(threading.Thread):
def __init__(self):
threading.Thread.__init__(self)
def run(self):
while 1:
word = s.recv(1024)
if (word):
text['state'] = NORMAL
text.insert(END, '\n' + word)
text['state'] = DISABLED
main的部分,实现一个调用窗口,之后再加上一句,在窗口关闭时结束连接:
root.mainloop()
s.close()
这样GUI就差不多了,实现了简单的收发和显示。
接下来我们要解决由于退出了客户端而没有删除连接List中的值导致报错的问题,这里提供最简单的解决思路:
print self.address, ' -> ', receiver['address']
try:
receiver['client'].sendall(msg)
except Exception, e:
print '已登出该用户'
lists.remove(receiver)
print lists
像这样,lists.remove(elem)
,就能删除元素了。remove中传入的不是index,而是element,这是个很方便的特性,因为这样我就能保证操作的原子性了,否则的话,我们可以想象到:首先我们找到index,然后在操作,如果多线程就会遇到同步问题了。
这样,GUI的部分也基本完成了。
备注:如果无法输入中文,可能是Tkinter版本过低,请升级。
植入部分
如果您觉得文章不错,可以通过赞助支持我。
如果您不希望打赏,也可以通过关闭广告屏蔽插件的形式帮助网站运作。