import tkinter as tk
from tkinter import scrolledtext, messagebox
from datetime import datetime
import random
class QQChatApp:
def __init__(self, root):
self.root = root
self.root.title("简易QQ")
self.root.geometry("800x600")
# 模拟用户数据
self.current_user = "用户" + str(random.randint(1000, 9999))
self.users = [self.current_user, "小明", "小红", "张三"]
self.user_colors = {
self.current_user: "#4285F4", # 蓝色(自己)
"小明": "#34A853", # 绿色
"小红": "#EA4335", # 红色
"张三": "#FBBC05" # 黄色
}
self.create_widgets()
self.add_system_message(f"欢迎 {self.current_user} 进入聊天室")
def create_widgets(self):
# 主容器
main_frame = tk.Frame(self.root)
main_frame.pack(fill=tk.BOTH, expand=True)
# 左侧:聊天区域
chat_frame = tk.Frame(main_frame, bg="#F0F0F0")
chat_frame.pack(side=tk.LEFT, fill=tk.BOTH, expand=True)
# 消息显示区
self.message_area = scrolledtext.ScrolledText(
chat_frame,
wrap=tk.WORD,
bg="white",
state='disabled'
)
self.message_area.pack(fill=tk.BOTH, expand=True, padx=10, pady=10)
# 输入区域
input_frame = tk.Frame(chat_frame, bg="#F0F0F0")
input_frame.pack(fill=tk.X, padx=10, pady=(0, 10))
self.input_entry = tk.Entry(input_frame, font=("Arial", 12))
self.input_entry.pack(side=tk.LEFT, fill=tk.X, expand=True)
self.input_entry.bind("<Return>", self.send_message)
send_button = tk.Button(
input_frame,
text="发送",
command=self.send_message,
bg="#4285F4",
fg="white",
font=("Arial", 10, "bold")
)
send_button.pack(side=tk.RIGHT, padx=(10, 0))
# 右侧:用户列表
user_frame = tk.Frame(main_frame, width=200, bg="#E0E0E0")
user_frame.pack(side=tk.RIGHT, fill=tk.Y)
user_frame.pack_propagate(False)
# 用户列表标题
tk.Label(
user_frame,
text="在线用户",
font=("Arial", 12, "bold"),
bg="#E0E0E0"
).pack(pady=10)
# 用户列表
self.user_listbox = tk.Listbox(
user_frame,
font=("Arial", 11),
selectmode=tk.SINGLE,
bg="white"
)
self.user_listbox.pack(fill=tk.BOTH, expand=True, padx=10, pady=10)
# 添加用户到列表
for user in self.users:
self.user_listbox.insert(tk.END, user)
def send_message(self, event=None):
message = self.input_entry.get().strip()
if not message:
return
# 添加消息到显示区
self.add_message(self.current_user, message)
# 清空输入框
self.input_entry.delete(0, tk.END)
def add_message(self, sender, message):
self.message_area.config(state='normal')
# 获取时间戳
time_str = datetime.now().strftime("%H:%M:%S")
# 设置消息格式
color = self.user_colors.get(sender, "#000000")
formatted_msg = f"\n[{time_str}] <font color='{color}'>{sender}:</font> {message}"
# 插入HTML样式的消息(Tkinter支持部分HTML)
self.message_area.insert(tk.END, formatted_msg, "message")
# 配置消息样式
self.message_area.tag_config("message", font=("Arial", 11))
# 自动滚动到底部
self.message_area.see(tk.END)
self.message_area.config(state='disabled')
def add_system_message(self, message):
self.message_area.config(state='normal')
time_str = datetime.now().strftime("%H:%M:%S")
self.message_area.insert(tk.END, f"\n[{time_str}] <font color='gray'>系统: {message}</font>")
self.message_area.tag_config("message", font=("Arial", 11, "italic"))
self.message_area.see(tk.END)
self.message_area.config(state='disabled')
if __name__ == "__main__":
root = tk.Tk()
app = QQChatApp(root)
root.mainloop()
聊天界面:

用户交互:
消息格式:

python main.py
网络通信:
socket或websockets库界面美化:

ttk主题功能增强:
注意:此代码仅实现本地界面功能,实际QQ应用需要复杂的网络协议和服务器支持,建议学习网络编程后自行扩展网络功能。
如果需要更完整的实现(含网络通信),可以参考开源项目如: