python版的UDP聊天(UI界面)

版权声明:转载请标明链接, https://blog.csdn.net/qq_43433255/article/details/85225470

利用udp方式,进行通信。
创建udp聊天界面:
在这里插入图片描述

在这里插入图片描述不会创建的,请百度相关知识。

点击生成的python代码:
在这里插入图片描述

将其复制到wxudp。py;并且创建udpgb。py:
在这里插入图片描述

wxformbuilder生成的代码(wxudp.py):

# -*- coding: utf-8 -*-

###########################################################################
# Python code generated with wxFormBuilder (version Jan 23 2018)
# http://www.wxformbuilder.org/
##
# PLEASE DO *NOT* EDIT THIS FILE!
###########################################################################

import wx
import wx.xrc

###########################################################################
# Class denglu
###########################################################################


class denglu (wx.Dialog):

def __init__(self, parent):
wx.Dialog.__init__(self, parent, id=wx.ID_ANY, title=wx.EmptyString, pos=wx.DefaultPosition, size=wx.Size(
369, 216),  style=wx.DEFAULT_DIALOG_STYLE)

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

bSizer1 = wx.BoxSizer(wx.VERTICAL)

bSizer2 = wx.BoxSizer(wx.HORIZONTAL)

self.m_staticText1 = wx.StaticText(
self, wx.ID_ANY, u"输入昵称:", wx.DefaultPosition, wx.DefaultSize, 0)
self.m_staticText1.Wrap(-1)
bSizer2.Add(self.m_staticText1, 0, wx.ALL |
wx.ALIGN_CENTER_VERTICAL, 5)

self.m_nichen = wx.TextCtrl(
self, wx.ID_ANY, wx.EmptyString, wx.DefaultPosition, wx.DefaultSize, 0)
bSizer2.Add(self.m_nichen, 1, wx.ALL | wx.ALIGN_CENTER_VERTICAL, 5)

bSizer1.Add(bSizer2, 1, wx.EXPAND, 5)

bSizer3 = wx.BoxSizer(wx.HORIZONTAL)

self.m_staticText2 = wx.StaticText(
self, wx.ID_ANY, u"输入房间号:(0-50000)", wx.DefaultPosition, wx.DefaultSize, 0)
self.m_staticText2.Wrap(-1)
bSizer3.Add(self.m_staticText2, 0, wx.ALL |
wx.ALIGN_CENTER_VERTICAL, 5)

self.m_fangjian = wx.TextCtrl(
self, wx.ID_ANY, wx.EmptyString, wx.DefaultPosition, wx.DefaultSize, 0)
bSizer3.Add(self.m_fangjian, 1, wx.ALL | wx.ALIGN_CENTER_VERTICAL, 5)

bSizer1.Add(bSizer3, 1, wx.EXPAND, 5)

bSizer5 = wx.BoxSizer(wx.HORIZONTAL)

self.m_button1 = wx.Button(
self, wx.ID_ANY, u"确定", wx.DefaultPosition, wx.DefaultSize, 0)
bSizer5.Add(self.m_button1, 0, wx.ALL | wx.ALIGN_CENTER_VERTICAL, 5)

self.m_button2 = wx.Button(
self, wx.ID_ANY, u"取消", wx.DefaultPosition, wx.DefaultSize, 0)
bSizer5.Add(self.m_button2, 0, wx.ALL | wx.ALIGN_CENTER_VERTICAL, 5)

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

self.SetSizer(bSizer1)
self.Layout()

self.Centre(wx.BOTH)

# Connect Events
self.m_button1.Bind(wx.EVT_BUTTON, self.btn_ok)
self.m_button2.Bind(wx.EVT_BUTTON, self.btn_no)

def __del__(self):
pass

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

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


###########################################################################
# Class liaotian
###########################################################################

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

bSizer7 = wx.BoxSizer(wx.VERTICAL)

bSizer8 = wx.BoxSizer(wx.VERTICAL)

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

bSizer7.Add(bSizer8, 1, wx.EXPAND, 5)

bSizer9 = wx.BoxSizer(wx.HORIZONTAL)

self.m_staticText3 = wx.StaticText(
self, wx.ID_ANY, u"消息:", wx.DefaultPosition, wx.DefaultSize, 0)
self.m_staticText3.Wrap(-1)
bSizer9.Add(self.m_staticText3, 0, wx.ALL, 5)

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

self.m_button3 = wx.Button(
self, wx.ID_ANY, u"发送", wx.DefaultPosition, wx.DefaultSize, 0)
bSizer9.Add(self.m_button3, 0, wx.ALL, 5)

bSizer7.Add(bSizer9, 0, wx.EXPAND, 5)

self.SetSizer(bSizer7)
self.Layout()

self.Centre(wx.BOTH)

# Connect Events
self.m_button3.Bind(wx.EVT_BUTTON, self.btn_fasong)

def __del__(self):
pass

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

udpgb.py的代码:

#!/usr/bin/env python3
# -*- coding:utf-8 -*-
u'''
Created on 2018年12月23日

@author: wuluo
'''
__author__ = 'wuluo'
__version__ = '1.0.0'
__company__ = u'重庆交大'
__updated__ = '2018-12-23'
import socket
import datetime
import threading
import wx
import jpyc.jcoding as jc
from udplte import wxudpe
udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)


class denglu(wxudpe.denglu):
def __init__(self):
wxudpe.denglu.__init__(self, None)
self.myname = None
self.myroom = None
self.m_button1.SetDefault()

def __del__(self):
wxudpe.denglu.__del__(self)

def btn_ok(self, event):
myname = self.m_nichen.GetValue().strip()  # 昵称
if not myname:
wx.MessageBox(u'昵称不能为空', u'错误信息', wx.OK | wx.ICON_ERROR)
self.m_nichen.SetBackgroundColour("red")
self.m_nichen.SetFocus()
return
else:
self.m_nichen.SetBackgroundColour(
wx.SystemSettings.GetColour(wx.SYS_COLOUR_WINDOW))
myroom = int(self.m_fangjian.GetValue())
if not myroom or myroom < 0 or myroom > 50000:
wx.MessageBox(u'房间号错误', u'错误信息', wx.OK | wx.ICON_ERROR)
self.m_fangjian.SetBackgroundColour("red")
self.m_fangjian.SetFocus()
return
else:
self.m_fangjian.SetBackgroundColour(
wx.SystemSettings.GetColour(wx.SYS_COLOUR_WINDOW))
self.myname = myname
self.myroom = myroom
self.Close()
event.Skip()

def btn_no(self, event):
self.Close()
event.Skip()


class liaotian(wxudpe.liaotian):
def __init__(self, nichen, fangjian):
wxudpe.liaotian.__init__(self, None)
self.myname = nichen
self.room = fangjian

self.udp = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
self.udp.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
self.udp.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1)
self.udp.bind(('', 5000 + self.room))
self.udp.settimeout(1)
self.isalive = True
self.th = threading.Thread(target=self.recv1, args=())
self.th.setDaemon(True)
self.th.start()
self.m_fasong.SetFocus()

def recv1(self):
try:
while self.isalive:
data, _ = self.udp.recvfrom(8192)
self.m_msg.AppendText(
u'%s\n' % jc.tounicode(datetime.datetime.now()))
self.m_msg.AppendText(u'%s\n\n' % jc.tounicode(data))
except:
pass
finally:
self.udp.close()

def __del__(self):
wxudpe.liaotian.__del__(self)

def send(self):
msg = self.m_fasong.GetValue().strip()
if not msg:
return
self.m_fasong.SetValue(u'')
msg = jc.toutf8(self.myname) + jc.toutf8(msg)
self.m_msg.AppendText(u'%s\n' % jc.tounicode(datetime.datetime.now()))
self.m_msg.AppendText(u'%s\n\n' % jc.tounicode(msg))
# ('255.255.255.255', 5000 + self.room)

self.udp.sendto(msg, '255.255.255.255',  5000 + self.room)

def btn_fasong(self, event):
self.send()
event.Skip()


class MyApp(wx.App):
def OnInit(self):
room = denglu()
room.ShowModal()
myname = room.myname
myroom = room.myroom
if myname is None:
room.Destroy()
self.ExitMainLoop()
return True
self.chatmain = liaotian(myname, myroom)
self.chatmain.Show()
return True

def OnExit(self):
self.chatmain.Destroy()


if __name__ == "__main__":
app = MyApp()
app.MainLoop()

运行结果:
在这里插入图片描述
在这里插入图片描述

但还是会出现以下错误:
在这里插入图片描述

有能力的,可以去解决!

猜你喜欢

转载自blog.csdn.net/qq_43433255/article/details/85225470