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


















暂无评论内容