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版本过低,请升级。

植入部分

如果您觉得文章不错,可以通过赞助支持我。

如果您不希望打赏,也可以通过关闭广告屏蔽插件的形式帮助网站运作。

标签: 成品, 源码, 知识, 代码段, 语法

添加新评论