Python3.8.10每日一练(QQ模拟器)

import tkinter as tk
from tkinter import scrolledtext, messagebox
import random


class QQSimulator:
    def __init__(self, master):
        self.master = master
        self.master.title("QQ模拟器")
        self.master.geometry("400x325")

        # 颜色配置
        self.bg_color = "#E6E6E6"
        self.header_color = "#12B7F5"
        self.button_color = "#12B7F5"
        self.text_bg = "#FFFFFF"

        # 创建主画布
        self.canvas = tk.Canvas(master, width=400, height=325, bg=self.bg_color, highlightthickness=0)
        self.canvas.pack()

        # 绘制标题栏
        self.draw_header()

        # 绘制好友列表
        self.draw_friends_list()

        # 绘制聊天区域
        self.draw_chat_area()

        # 模拟数据
        self.friends = ["张三", "李四", "王五", "赵六", "钱七", "好友1", "好友2", "好友3"]
        self.current_chat = None
        self.messages = {
            "张三": ["你好!", "最近怎么样?", "有空一起吃饭吗?"],
            "李四": ["在吗?", "有个问题想请教你"],
            "王五": ["周末有空吗?", "我们去看电影吧"],
            "赵六": [],
            "钱七": [],
            "好友1": [],
            "好友2": [],
            "好友3": []
        }

        # 初始化好友列表
        self.update_friends_list()

    def draw_header(self):
        # 标题栏背景
        self.canvas.create_rectangle(0, 0, 400, 50, fill=self.header_color, outline=self.header_color)

        # QQ标题
        self.canvas.create_text(50, 25, text="QQ", font=("Arial", 16, "bold"), fill="white")

        # 最小化按钮
        self.canvas.create_rectangle(350, 15, 370, 35, fill=self.header_color, outline="white", width=1)
        self.canvas.create_text(360, 25, text="_", font=("Arial", 12), fill="white", tags="minimize")

        # 关闭按钮
        self.canvas.create_rectangle(375, 15, 395, 35, fill=self.header_color, outline="white", width=1)
        self.canvas.create_text(385, 25, text="×", font=("Arial", 12), fill="white", tags="close")

        # 绑定按钮事件
        self.canvas.tag_bind("minimize", "<Button-1>", lambda e: self.master.iconify())
        self.canvas.tag_bind("close", "<Button-1>", lambda e: self.master.destroy())

    def draw_friends_list(self):
        # 好友列表背景
        self.canvas.create_rectangle(0, 50, 120, 325, fill="#F5F5F5", outline="#DDDDDD")

        # 搜索框
        self.search_var = tk.StringVar()
        self.search_entry = tk.Entry(self.canvas, textvariable=self.search_var, width=12,
                                     font=("Arial", 10), relief="flat", bg="white")
        self.search_window = self.canvas.create_window(60, 75, window=self.search_entry)

        # 好友列表框架
        self.friends_frame = tk.Frame(self.canvas, bg="#F5F5F5")
        self.friends_window = self.canvas.create_window(60, 120, window=self.friends_frame, width=120, height=180)

        # 好友列表滚动条
        self.friends_scroll = tk.Scrollbar(self.friends_frame)
        self.friends_scroll.pack(side="right", fill="y")

        # 好友列表
        self.friends_listbox = tk.Listbox(
            self.friends_frame,
            yscrollcommand=self.friends_scroll.set,
            bg="#F5F5F5",
            font=("Arial", 10),
            selectbackground="#D9E8FB",
            selectforeground="black",
            highlightthickness=0,
            borderwidth=0
        )
        self.friends_listbox.pack(side="left", fill="both", expand=True)
        self.friends_scroll.config(command=self.friends_listbox.yview)

        # 绑定选择事件
        self.friends_listbox.bind("<<ListboxSelect>>", self.on_friend_selected)

    def draw_chat_area(self):
        # 聊天区域背景
        self.canvas.create_rectangle(120, 50, 400, 325, fill=self.text_bg, outline="#DDDDDD")

        # 聊天对象名称
        self.chat_name = self.canvas.create_text(260, 70, text="请选择好友", font=("Arial", 12, "bold"))

        # 消息显示区域
        self.chat_text = scrolledtext.ScrolledText(
            self.canvas,
            wrap=tk.WORD,
            width=32,
            height=10,
            font=("Arial", 10),
            bg=self.text_bg,
            padx=5,
            pady=5
        )
        self.chat_text.config(state="disabled")
        self.chat_window = self.canvas.create_window(260, 160, window=self.chat_text)

        # 消息输入框
        self.input_text = tk.Text(
            self.canvas,
            wrap=tk.WORD,
            width=32,
            height=3,
            font=("Arial", 10),
            padx=5,
            pady=5
        )
        self.input_window = self.canvas.create_window(260, 260, window=self.input_text)

        # 发送按钮
        self.send_button = tk.Button(
            self.canvas,
            text="发送",
            bg=self.button_color,
            fg="white",
            font=("Arial", 10, "bold"),
            relief="flat",
            command=self.send_message
        )
        self.send_window = self.canvas.create_window(360, 300, window=self.send_button)

    def update_friends_list(self):
        self.friends_listbox.delete(0, tk.END)
        search_text = self.search_var.get().lower()

        for friend in self.friends:
            if search_text in friend.lower():
                self.friends_listbox.insert(tk.END, friend)

                # 如果有未读消息,显示小红点
                if len(self.messages[friend]) > 0 and friend != self.current_chat:
                    self.friends_listbox.itemconfig(tk.END, {'fg': 'red'})

    def on_friend_selected(self, event):
        selection = self.friends_listbox.curselection()
        if selection:
            friend = self.friends_listbox.get(selection[0])
            self.current_chat = friend
            self.canvas.itemconfig(self.chat_name, text=friend)
            self.show_chat_history(friend)

    def show_chat_history(self, friend):
        self.chat_text.config(state="normal")
        self.chat_text.delete(1.0, tk.END)

        for msg in self.messages[friend]:
            self.chat_text.insert(tk.END, f"{friend}: {msg}
")

        self.chat_text.config(state="disabled")
        self.chat_text.yview(tk.END)

        # 更新好友列表显示
        self.update_friends_list()

    def send_message(self):
        if not self.current_chat:
            messagebox.showwarning("提示", "请先选择好友")
            return

        message = self.input_text.get("1.0", tk.END).strip()
        if not message:
            return

        # 添加到消息历史
        self.messages[self.current_chat].append(message)

        # 显示在聊天窗口
        self.chat_text.config(state="normal")
        self.chat_text.insert(tk.END, f"我: {message}
")
        self.chat_text.config(state="disabled")
        self.chat_text.yview(tk.END)

        # 清空输入框
        self.input_text.delete("1.0", tk.END)

        # 模拟回复
        self.master.after(1000, self.simulate_reply)

    def simulate_reply(self):
        if not self.current_chat:
            return

        replies = [
            "好的",
            "我知道了",
            "嗯嗯",
            "OK",
            "没问题",
            "哈哈",
            "真的吗?",
            "太棒了!",
            "谢谢",
            "不客气"
        ]

        reply = random.choice(replies)
        self.messages[self.current_chat].append(reply)

        # 如果当前正在查看这个好友的聊天,显示回复
        if self.current_chat == self.friends_listbox.get(tk.ACTIVE):
            self.chat_text.config(state="normal")
            self.chat_text.insert(tk.END, f"{self.current_chat}: {reply}
")
            self.chat_text.config(state="disabled")
            self.chat_text.yview(tk.END)
        else:
            # 否则在好友列表显示红点
            self.update_friends_list()


if __name__ == "__main__":
    root = tk.Tk()
    app = QQSimulator(root)

    # 绑定搜索事件
    app.search_var.trace_add("write", lambda *args: app.update_friends_list())

    root.mainloop()

© 版权声明
THE END
如果内容对您有所帮助,就支持一下吧!
点赞0 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容