ckblt 发表于 2022-2-12 17:44:48

【Python】聊天室!但好像没啥用……

以前我做了一个聊天室软件,本来想分享给大家的,结果,没了!!!{:10_285:} {:10_266:}
没办法,我只能复刻一下这个聊天室软件。

正如标题所说,
我用的是文件来存储信息的( data.pkl ),所以没办法两台电脑聊天……
确实没用!

来看看效果吧:


小缺陷:

[*]没给代码标注释,因为懒……{:10_262:}


废话挺多的,上代码!{:10_279:}
from copy import deepcopy
from tkinter import *
from tkinter import ttk
from time import strftime
from tkinter.font import Font
import os
import pickle as p


chat_room = {"Chatroom": []}
_chat_room = {}

root = Tk()
root.geometry("810x670")
root.title("Chatroom 聊天室")

user = StringVar()
room = StringVar()
_room = ""
_user = ""

scroll = None


def chinese_char_count(s):
    c = 0
    punctuation = [
      "–",
      "—",
      "‘",
      "’",
      "“",
      "”",
      "…",
      "、",
      "。",
      "〈",
      "〉",
      "《",
      "》",
      "「",
      "」",
      "『",
      "』",
      "【",
      "】",
      "〔",
      "〕",
      "!",
      "(",
      ")",
      ",",
      ".",
      ":",
      ";",
      "?",
    ]

    for i in s:
      if "\u4e00" <= i <= "\u9fff" or i in punctuation:
            c += 1
    return c


def submit():
    v = tk_chat_bar.get("0.0", END)
    tk_chat_bar.delete("0.0", END)
    if not v.isspace():
      if room.get() not in chat_room.keys():
            chat_room = []

      chat_room.append(
            (user.get(), strftime("%Y-%m-%d %H:%M:%S"), v[:-1])
      )

      with open(
            os.path.join(os.path.dirname(__file__), "data.pkl"), "wb"
      ) as f:
            p.dump(chat_room, f)

      update()


def update():
    global chat_room, _chat_room, _room, scroll, _user

    tk_show_chat.config(state=NORMAL)

    with open(os.path.join(os.path.dirname(__file__), "data.pkl"), "rb") as f:
      chat_room = p.load(f)

    if chat_room != _chat_room or _room != room.get() or _user != user.get():
      print(chat_room)
      scroll = round(
            tk_show_chat.yview() * tk_show_chat.get("0.0", END).count("\n")
      )

      tk_show_chat.delete("0.0", END)
      if room.get() in chat_room.keys():
            for i in chat_room:
                tk_show_chat.insert(END, "%s " % (i), "time")
                tk_show_chat.insert(END, "%s " % (i), "user")
                tk_show_chat.insert(END, "说:\n")
                x = 0
                for j in i.split("\n"):
                  if x < len(j):
                        x = len(j) + chinese_char_count(j)
                for j in i.split("\n"):

                  tk_show_chat.insert(
                        END,
                        " %s%s "
                        % (j, " " * (x - len(j) - chinese_char_count(j))),
                        "my_dialog" if i == user.get() else "dialog",
                  )
                  tk_show_chat.insert(END, "\n")

                tk_show_chat.insert(END, "\n")
      print(scroll)
      tk_show_chat.yview_scroll(scroll, "units")
      _chat_room = deepcopy(chat_room)
      _room = room.get()
      _user = user.get()

    tk_show_chat.config(state=DISABLED)


def update_aft():
    update()
    root.after(1000, update_aft)


def original():
    global chat_room
    chat_room = {"Chatroom": []}
    with open(os.path.join(os.path.dirname(__file__), "data.pkl"), "wb") as f:
      p.dump(chat_room, f)


tk_font = Font(root, family="NSimSun", size=16)


tk_chat_frame = ttk.Frame(root)
tk_chat_setting_frame = ttk.Frame(tk_chat_frame)
tk_user_label = ttk.Label(tk_chat_setting_frame, text="用户名:")
tk_user_entry = ttk.Entry(tk_chat_setting_frame, textvariable=user)
tk_room_label = ttk.Label(tk_chat_setting_frame, text="房间:")
tk_room_entry = ttk.Entry(tk_chat_setting_frame, textvariable=room)
tk_show_chat_frame = ttk.Frame(tk_chat_frame)
tk_show_chat_scroll = ttk.Scrollbar(tk_show_chat_frame)
tk_show_chat = Text(
    tk_show_chat_frame,
    width=70,
    height=25,
    font=tk_font,
    yscrollcommand=tk_show_chat_scroll.set,
    state=DISABLED
)
tk_chat_bar_frame = ttk.Frame(tk_chat_frame)
tk_chat_bar = Text(tk_chat_bar_frame, width=65, height=5, font=tk_font)
tk_chat_btn = ttk.Button(tk_chat_bar_frame, text="提交", command=submit)


tk_chat_frame.grid()

tk_chat_setting_frame.grid(row=0, column=0, sticky=NSEW)
tk_user_label.pack(side=LEFT)
tk_user_entry.pack(side=LEFT)
tk_room_entry.pack(side=RIGHT)
tk_room_label.pack(side=RIGHT)

tk_show_chat_frame.grid(row=1, column=0, sticky=NSEW)
tk_show_chat.pack(side=LEFT, fill=BOTH, expand=True)
tk_show_chat_scroll.pack(side=LEFT, fill=Y)

tk_chat_bar_frame.grid(row=2, column=0, sticky=NSEW)
tk_chat_bar.pack(side=LEFT, fill=BOTH)
tk_chat_btn.pack(side=LEFT, fill=BOTH, expand=True)


tk_show_chat_scroll.config(command=tk_show_chat.yview)


tk_show_chat.tag_config("time", foreground="#888")
tk_show_chat.tag_config("user", foreground="#33c")
tk_show_chat.tag_config("dialog", background="#ccc")
tk_show_chat.tag_config("my_dialog", background="#3c3")


tk_user_entry.insert(0, "Ckblt")
tk_room_entry.insert(0, "Chatroom")


if not os.path.exists(os.path.join(os.path.dirname(__file__), "data.pkl")):
    original()


update_aft()
root.mainloop()

这个软件我以后会继续完善,有问题可以提出哦~{:10_279:}
如果您喜欢这个软件,可以给我评分哦~{:10_254:}

隔壁老程呀 发表于 2022-2-12 19:04:15

{:10_254:}

hornwong 发表于 2022-2-12 22:05:17

{:5_95:}

一叶无伤 发表于 2022-2-13 10:55:33

大神,接受我的膝盖

小伤口 发表于 2022-2-13 19:15:30

厉害,加油{:9_227:}

大马强 发表于 2022-2-28 08:19:13

666

qwb1997 发表于 2022-2-28 09:57:15

{:10_281:}

yuanming1027 发表于 2022-2-28 16:19:09

这个我怎么感觉就是文件同步....一个程序发言写入文件,其他程序读取文件{:5_109:}

ckblt 发表于 2022-2-28 17:58:33

yuanming1027 发表于 2022-2-28 16:19
这个我怎么感觉就是文件同步....一个程序发言写入文件,其他程序读取文件

差不多

korrina 发表于 2022-2-28 18:31:24

牛啊

沮授 发表于 2022-3-6 10:47:06

用pyqt不是更好吗?

ckblt 发表于 2022-3-6 11:07:01

沮授 发表于 2022-3-6 10:47
用pyqt不是更好吗?

暂时还不会

Minecraft程序猿 发表于 2022-3-12 19:29:24

正好我之前也做过一个,没弄完

Minecraft程序猿 发表于 2022-3-12 19:32:48

我之前做的是用的socket,UDP协议,加了个端口号,本机信息显示,测试网络连通性什么的,还有分组,但网络信息加密和校验还没做好,不过你那个tag我可以学学

Minecraft程序猿 发表于 2022-4-8 17:55:58

嘿,伙计,我写的那个把验证部分删掉了,四舍五入就是完成了,邮箱发给你看看?(打包成exe和安装包了)

ckblt 发表于 2022-4-8 18:01:10

Minecraft程序猿 发表于 2022-4-8 17:55
嘿,伙计,我写的那个把验证部分删掉了,四舍五入就是完成了,邮箱发给你看看?(打包成exe和安装包了)

好的{:10_323:}

Minecraft程序猿 发表于 2022-4-8 18:40:41

ckblt 发表于 2022-4-8 18:01
好的

地址?

Minecraft程序猿 发表于 2022-4-9 14:57:51

其实现在主流的网络通信方式socket也是采用了文件读写的思想
页: [1]
查看完整版本: 【Python】聊天室!但好像没啥用……