鱼C论坛

 找回密码
 立即注册
查看: 1519|回复: 2

[作品展示] Python 聊天室第 2 版

[复制链接]
发表于 2020-3-26 17:47:47 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 lixiangyv 于 2020-3-27 07:36 编辑

第 1 版的聊天室只能在服务器上查看的发送消息,这次这个问题解决了^_^

而且还做了 GUI 的界面。

最终的效果图:

photo.png

附件:

聊天助手.rar (2.18 KB, 下载次数: 6)

源代码:

客户端:

  1. import socket
  2. import time
  3. from threading import *
  4. from tkinter import *
  5. from random import choice
  6. from tkinter.messagebox import showwarning

  7. class ChatHelper():
  8.     chat = None
  9.     nick_list = ['黑猫警长', '小脚鱼', '喜洋洋', '冰冰羊']

  10.     def __init__(self, chat):
  11.         """
  12.         初始化
  13.         :param chat:
  14.         """
  15.         self.chat = chat
  16.         self.init_ui()

  17.     def init_ui(self):
  18.         """
  19.         初始化图形界面
  20.         :return:
  21.         """

  22.         window = Tk()
  23.         window.title('聊天助手')

  24.         # 是窗口不可变
  25.         window.resizable(False, False)

  26.         # 聊天显示
  27.         self.area = Text(window, borderwidth=2, relief="groove", width=53, height=16, bg="seashell", font=("微软雅黑", 16))
  28.         self.area.grid(row=0, column=0, columnspan=3)

  29.         # 聊天文字样式
  30.         self.area.tag_config('me', background="#34ACFF", foreground="white")
  31.         self.area.tag_config('others', background="#ABB8C0", foreground="white")
  32.         self.area.tag_config('warn', background="orange", foreground="white")
  33.         self.area.tag_config('success', background="#34D361", foreground="white")

  34.         # 文字输入框
  35.         self.input = Entry(window, width=44, font=("微软雅黑", 16))
  36.         self.input.grid(row=1, column=0, columnspan=2, pady=10)

  37.         # 发送按钮
  38.         btn = Button(window, text=" 发送 ", command=self.send_message)
  39.         btn.grid(row=1, column=2)

  40.         label = Label(window, text='你的昵称:')
  41.         label.grid(row=2, column=0, sticky=W, padx=5, pady=10)

  42.         # 昵称输入框
  43.         self.nick = Entry(window, width=38, font=("微软雅黑", 16))
  44.         self.nick.grid(row=2, column=1, pady=10)
  45.         self.nick.insert(0, self.next_nick())

  46.         # 昵称刷新按钮
  47.         ref = Button(window, text='换一个', command=self.ref_nick)
  48.         ref.grid(row=2, column=2)

  49.     def send_message(self):
  50.         # 获取文本框的内容
  51.         sendMsg = self.input.get()
  52.         nick = self.nick.get()

  53.         if (not sendMsg) or (not nick):
  54.             showwarning(title='警告', message="你发送的消息或者昵称为空!")

  55.         self.chat.sendData(nick, sendMsg)

  56.     def next_nick(self):
  57.         return choice(self.nick_list)

  58.     def ref_nick(self):
  59.         self.nick.delete(0, END)
  60.         self.nick.insert(0, self.next_nick())

  61. # 创建多线程
  62. class MessageHelper(Thread):
  63.     chatHelper = None
  64.     client = None
  65.     SERVERHOST = ('127.0.0.1', 8888)

  66.     def run(self):
  67.         # 等待一秒,便于计算机连接
  68.         time.sleep(1)
  69.         self.connect()

  70.     def connect(self):
  71.         # 创建套接字
  72.         self.client = socket.socket()
  73.         self.client.connect(self.SERVERHOST)

  74.         # 接受服务器的消息
  75.         while True:
  76.             msg = self.client.recv(1024).decode()


  77.             nick, text = msg.split(":")
  78.             if nick == self.chatHelper.nick.get():
  79.                 self.chatHelper.area.insert(END, f"我:{text}", "me")
  80.             elif nick == '系统消息':
  81.                 self.chatHelper.area.insert(END, f"{text}", "success")
  82.             else:
  83.                 self.chatHelper.area.insert(END, f"{nick}:{text}", "others")

  84.             self.chatHelper.area.see(END)

  85.     def sendData(self, nick, message):
  86.         self.client.send(bytes(nick + ":" + message, "utf-8"))

  87.     def set_chathelper(self, ch):
  88.         self.chatHelper = ch

  89. mh = MessageHelper()
  90. mh.start()

  91. ch = ChatHelper(mh)
  92. mh.set_chathelper(ch)

  93. mainloop()
复制代码
服务端:
  1. import socket
  2. import time
  3. from threading import *
  4. from tkinter import *
  5. from random import choice
  6. from tkinter.messagebox import showwarning

  7. class ChatHelper():
  8.     chat = None
  9.     nick_list = ['黑猫警长', '小脚鱼', '喜洋洋', '冰冰羊']

  10.     def __init__(self, chat):
  11.         """
  12.         初始化
  13.         :param chat:
  14.         """
  15.         self.chat = chat
  16.         self.init_ui()

  17.     def init_ui(self):
  18.         """
  19.         初始化图形界面
  20.         :return:
  21.         """

  22.         window = Tk()
  23.         window.title('聊天助手')

  24.         # 是窗口不可变
  25.         window.resizable(False, False)

  26.         # 聊天显示
  27.         self.area = Text(window, borderwidth=2, relief="groove", width=53, height=16, bg="seashell", font=("微软雅黑", 16))
  28.         self.area.grid(row=0, column=0, columnspan=3)

  29.         # 聊天文字样式
  30.         self.area.tag_config('me', background="#34ACFF", foreground="white")
  31.         self.area.tag_config('others', background="#ABB8C0", foreground="white")
  32.         self.area.tag_config('warn', background="orange", foreground="white")
  33.         self.area.tag_config('success', background="#34D361", foreground="white")

  34.         # 文字输入框
  35.         self.input = Entry(window, width=44, font=("微软雅黑", 16))
  36.         self.input.grid(row=1, column=0, columnspan=2, pady=10)

  37.         # 发送按钮
  38.         btn = Button(window, text=" 发送 ", command=self.send_message)
  39.         btn.grid(row=1, column=2)

  40.         label = Label(window, text='你的昵称:')
  41.         label.grid(row=2, column=0, sticky=W, padx=5, pady=10)

  42.         # 昵称输入框
  43.         self.nick = Entry(window, width=38, font=("微软雅黑", 16))
  44.         self.nick.grid(row=2, column=1, pady=10)
  45.         self.nick.insert(0, self.next_nick())

  46.         # 昵称刷新按钮
  47.         ref = Button(window, text='换一个', command=self.ref_nick)
  48.         ref.grid(row=2, column=2)

  49.     def send_message(self):
  50.         # 获取文本框的内容
  51.         sendMsg = self.input.get()
  52.         nick = self.nick.get()

  53.         if (not sendMsg) or (not nick):
  54.             showwarning(title='警告', message="你发送的消息或者昵称为空!")

  55.         self.chat.sendData(nick, sendMsg)

  56.     def next_nick(self):
  57.         return choice(self.nick_list)

  58.     def ref_nick(self):
  59.         self.nick.delete(0, END)
  60.         self.nick.insert(0, self.next_nick())

  61. # 创建多线程
  62. class MessageHelper(Thread):
  63.     chatHelper = None
  64.     client = None
  65.     SERVERHOST = ('127.0.0.1', 8888)

  66.     def run(self):
  67.         # 等待一秒,便于计算机连接
  68.         time.sleep(1)
  69.         self.connect()

  70.     def connect(self):
  71.         # 创建套接字
  72.         self.client = socket.socket()
  73.         self.client.connect(self.SERVERHOST)

  74.         # 接受服务器的消息
  75.         while True:
  76.             msg = self.client.recv(1024).decode()


  77.             nick, text = msg.split(":")
  78.             if nick == self.chatHelper.nick.get():
  79.                 self.chatHelper.area.insert(END, f"我:{text}", "me")
  80.             elif nick == '系统消息':
  81.                 self.chatHelper.area.insert(END, f"{text}", "success")
  82.             else:
  83.                 self.chatHelper.area.insert(END, f"{nick}:{text}", "others")

  84.             self.chatHelper.area.see(END)

  85.     def sendData(self, nick, message):
  86.         self.client.send(bytes(nick + ":" + message, "utf-8"))

  87.     def set_chathelper(self, ch):
  88.         self.chatHelper = ch

  89. mh = MessageHelper()
  90. mh.start()

  91. ch = ChatHelper(mh)
  92. mh.set_chathelper(ch)

  93. mainloop()
复制代码


评分

参与人数 1荣誉 +2 鱼币 +2 收起 理由
hrp + 2 + 2 鱼C有你更精彩^_^

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-3-26 19:38:11 | 显示全部楼层
好狠,不是鱼友III就得花鱼币
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-26 20:33:45 From FishC Mobile | 显示全部楼层
支持
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-6-11 16:55

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表