您的位置:首页 > 编程语言 > Python开发

简单的python聊天界面

2019-07-01 18:32 1991 查看

简单的python聊天界面

一、用eclipse编写python代码

server代码
import socket
host = 'host'
port = 12344
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind((host, port))
s.listen(1)
sock, addr = s.accept()
print('Connection built')
info = sock.recv(1024).decode()
while info != 'exit':
print('client:' + info)
send_mes = input()
sock.send(send_mes.encode())
if send_mes == 'exit':
break
info = sock.recv(1024).decode()
sock.close()
s.close()
client代码
import socket

s = socket.socket()
host = 'host'
port = 12345
s.connect((host, port))
print('Linked')
info = ''
while info != 'exit':
print('server:' + info)
send_mes = input()
s.send(send_mes.encode())
if send_mes == 'exit':
break
info = s.recv(1024).decode()
s.close()
先运行server代码,再运行client代码,就可以进行无界面聊天,但是只能一问一答,不能连续发送多条消息

二、客户端界面

先用wxFormBuilder创建好一个界面,创建好界面后点击F8生成python,直接将这个python代码复制粘贴进上面的工程中,如果不清楚这一步的,可以参考这个博客
https://www.geek-share.com/detail/2755178914.html
完成这一步后,新建一个py文件,我命名为clientframe,如下图

在client.py中添加如下代码

import wx
import noname

class CliFrame(noname.MyFrame1):
def __init__(self, parent):
noname.MyFrame1.__init__(self, parent)

def main():
app = wx.App(False)
frame = CliFrame(None)
frame.Show(True)
app.MainLoop()

if __name__ == "__main__":
main()
pass

直接运行这个py文件,你导入的窗体界面就会弹出来啦

下面我们来完成对这个窗体中的事件,我先将我的窗体python代码贴出来
import wx
import wx.xrc

###########################################################################
# Class MyFrame1
###########################################################################

class MyFrame1 (wx.Frame):

def __init__(self, parent):
wx.Frame.__init__(self, parent, id=wx.ID_ANY, title=wx.EmptyString, pos=wx.DefaultPosition, size=wx.Size(
500, 300), style=wx.DEFAULT_FRAME_STYLE | wx.TAB_TRAVERSAL)

self.SetSizeHints(wx.DefaultSize, wx.DefaultSize)

bSizer21 = wx.BoxSizer(wx.VERTICAL)

bSizer29 = wx.BoxSizer(wx.HORIZONTAL)

self.m_staticText11 = wx.StaticText(
self, wx.ID_ANY, u"服务器ip", wx.DefaultPosition, wx.DefaultSize, 0)
self.m_staticText11.Wrap(-1)
bSizer29.Add(self.m_staticText11, 0, wx.ALL, 5)

self.m_textCtrl14 = wx.TextCtrl(
self, wx.ID_ANY, wx.EmptyString, wx.DefaultPosition, wx.DefaultSize, 0)
bSizer29.Add(self.m_textCtrl14, 1, wx.ALL, 5)

self.m_staticText12 = wx.StaticText(
self, wx.I
1cca8
D_ANY, u"端口号", wx.DefaultPosition, wx.DefaultSize, 0)
self.m_staticText12.Wrap(-1)
bSizer29.Add(self.m_staticText12, 0, wx.ALL, 5)

self.m_textCtrl13 = wx.TextCtrl(
self, wx.ID_ANY, wx.EmptyString, wx.DefaultPosition, wx.DefaultSize, 0)
bSizer29.Add(self.m_textCtrl13, 1, wx.ALL | wx.EXPAND, 5)

self.bt1 = wx.Button(self, wx.ID_ANY, u"确定",
wx.DefaultPosition, wx.DefaultSize, 0)
bSizer29.Add(self.bt1, 0, wx.ALL, 5)

bSizer21.Add(bSizer29, 1, wx.EXPAND, 5)

self.m_textCtrl7 = wx.TextCtrl(
self, wx.ID_ANY, wx.EmptyString, wx.DefaultPosition, wx.DefaultSize, style=wx.TE_MULTILINE)
bSizer21.Add(self.m_textCtrl7, 5, wx.ALL | wx.EXPAND, 5)

bSizer5 = wx.BoxSizer(wx.HORIZONTAL)

self.m_textCtrl8 = wx.TextCtrl(
self, wx.ID_ANY, wx.EmptyString, wx.DefaultPosition, wx.DefaultSize, 0)
bSizer5.Add(self.m_textCtrl8, 1, wx.ALL | wx.EXPAND, 5)

self.bt2 = wx.Button(self, wx.ID_ANY, u"发送",
wx.DefaultPosition, wx.DefaultSize, 0)
bSizer5.Add(self.bt2, 0, wx.ALL | wx.ALIGN_RIGHT, 5)

bSizer21.Add(bSizer5, 1, wx.EXPAND, 5)

self.SetSizer(bSizer21)
self.Layout()

self.Centre(wx.BOTH)

# Connect Events
self.bt1.Bind(wx.EVT_BUTTON, self.bt_sure)
self.bt2.Bind(wx.EVT_BUTTON, self.bt_send)

def __del__(self):
pass

# Virtual event handlers, overide them in your derived class
def bt_sure(self, event):
event.Skip()

def bt_send(self, event):
event.Skip()

打开clientFrame.py
import wx

import noname
from socket import *

s = socket(AF_INET, SOCK_STREAM)

class CliFrame(noname.MyFrame1):
def __init__(self, parent):
noname.MyFrame1.__init__(self, parent)

def bt_send(self, event):
buffsize = 1024#缓存的数据
senddata = self.m_textCtrl8.GetValue()#获取发送的内容
s.send(senddata.encode())#发送内容
self.m_textCtrl8.SetValue("")#清楚内容
self.m_textCtrl7.AppendText(senddata + '\n')#在对话框显示发送的内容
recvdata = s.recv(buffsize).decode('utf-8')#转换接收的内容榕
self.m_textCtrl7.AppendText(recvdata + '\n')#在对话框显示接收的内容

def bt_sure(self, event):
address = self.m_textCtrl14.GetValue()  # 服务器的ip地址
port = int(self.m_textCtrl13.GetValue())  # 服务器的端口号
s.connect((address, port))#连接

def main():
app = wx.App(False)
frame = CliFrame(None)
frame.Show(True)
app.MainLoop()
if __name__ == "__main__":
main()
pass
同样先运行server端,在运行clientFrame,客户端就可以在界面中聊天啦(注意,只能一问一答)

wxpython默认输入框不能换行,在窗体生成的py文件中,在你需要换行的那个窗口下,将
wx.TextCtrl( self, wx.ID_ANY, wx.EmptyString, wx.DefaultPosition, wx.DefaultSize, 0)
修改为
wx.TextCtrl( self, wx.ID_ANY, wx.EmptyString, wx.DefaultPosition, wx.DefaultSize, style=wx.TE_MULTILINE)

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: