File size: 7,558 Bytes
38d8dc2 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 |
import sys
from PyQt5.QtWidgets import QApplication, QWidget, QVBoxLayout, QPushButton, QTextEdit, QLineEdit, QListWidget, QLabel, QHBoxLayout, QListWidgetItem
import _MyModel
from PyQt5.QtGui import QColor, QPalette
from PyQt5.QtCore import Qt
class ChatSession:
"""储存单个对话的内容"""
def __init__(self, topic="新对话"):
self.topic = topic
self.messages = [] # 存储聊天记录
def add_message(self, sender, text):
"""添加消息(sender: 'user' 或 'ai')"""
self.messages.append((sender, text))
class ChatGPTUI(QWidget):
def __init__(self, MyModel):
super().__init__()
self.model = MyModel
self.first_list_item = QListWidget()
self.setWindowTitle("ChatGPT 聊天界面")
self.setGeometry(200, 200, 800, 600)
self.setStyleSheet("background-color: #DCB272; color: white;") # 设置深色背景
#self.setWindowFlags(Qt.FramelessWindowHint) # 设置无边框
# 创建主布局
main_layout = QHBoxLayout(self)
# 左侧:
left_layout = QVBoxLayout()
# 添加“新建对话”按钮
self.new_chat_button = QPushButton("新建对话")
self.new_chat_button.setStyleSheet("background-color: #0FA958; color: white; padding: 8px; border-radius: 5px;")
self.new_chat_button.clicked.connect(self.create_new_chat)
left_layout.addWidget(self.new_chat_button)
# 左侧:对话历史列表
self.history_list = QListWidget()
self.history_list.setStyleSheet("background-color: #E4DECE; color: black; border: none;")
self.history_list.itemClicked.connect(self.load_selected_chat) # 绑定选择对话事件
left_layout.addWidget(self.history_list)
# 右侧:聊天区域
right_layout = QVBoxLayout()
# 对话主题输入框
self.topic_input = QLineEdit()
self.topic_input.setPlaceholderText("请输入对话主题...")
self.topic_input.setStyleSheet("background-color: #E4DECE; color: black; padding: 5px; border-radius: 5px;")
# 聊天显示区域
self.chat_display = QTextEdit()
self.chat_display.setReadOnly(True)
self.chat_display.setStyleSheet("background-color: #E4DECE; color: black; border: none; padding: 10px;")
right_layout.addWidget(self.chat_display, 7)
# 输入区域(水平布局)
input_layout = QHBoxLayout()
# 用户输入框
self.input_field = QLineEdit()
self.input_field.setPlaceholderText("输入消息...")
self.input_field.setStyleSheet("background-color: #E4DECE; color: black; padding: 5px; border-radius: 5px;")
input_layout.addWidget(self.input_field, 8)
self.input_field.returnPressed.connect(self.send_message)
# 发送按钮
self.send_button = QPushButton("发送")
self.send_button.setStyleSheet("background-color: #DA8D6D; color: white; padding: 8px; border-radius: 5px;")
self.send_button.clicked.connect(self.send_message)
input_layout.addWidget(self.send_button, 2)
right_layout.addLayout(input_layout)
# 将右侧布局添加到主布局
main_layout.addLayout(left_layout, 2)
main_layout.addLayout(right_layout, 8)
self.setLayout(main_layout)
# 初始对话存储
self.chat_sessions = [] # 存储多个会话
self.current_session = None
self.create_new_chat() # 启动时创建默认对话
def create_new_chat(self):
"""新建对话并添加到历史列表"""
topic = self.topic_input.text().strip()
if not topic:
topic = "新对话"
new_session = ChatSession(topic)
self.chat_sessions.append(new_session)
self.current_session = new_session
# 更新左侧历史对话列表
self.add_chat_item(topic)
self.history_list.setCurrentRow(self.history_list.count() - 1) # 选中新建的对话
self.chat_display.clear()
def load_selected_chat(self):
"""切换到用户选择的历史对话"""
selected_index = self.history_list.currentRow()
if selected_index >= 0:
self.current_session = self.chat_sessions[selected_index]
self.display_chat_history()
def display_chat_history(self):
"""显示当前会话的聊天记录"""
self.chat_display.clear()
for sender, text in self.current_session.messages:
if sender == 'user':
self.chat_display.append(f"<b><span style='color: #9b7438; font-family: 微软雅黑; font-size: 28px'>主题 : </span><span style='color: #1B2131; font-family: 微软雅黑; font-size: 28px'> {text}</span></b>")
else:
self.chat_display.append(f"<b>{'用户' if sender == 'user' else 'ChatGPT'}:</b> {text}")
def send_message(self):
"""发送用户输入的消息"""
user_text = self.input_field.text().strip()
if user_text and self.current_session:
self.current_session.add_message("user", user_text)
self.chat_display.append(f"<b><span style='color: #9b7438; font-family: 微软雅黑; font-size: 28px'>主题 : </span><span style='color: #1B2131; font-family: 微软雅黑; font-size: 28px'> {user_text}</span></b>")
self.input_field.clear()
# 触发 AI 回复(暂时用占位内容)
ai_reply = self.get_ai_response(user_text)
self.receive_message(ai_reply)
def receive_message(self, text):
"""显示 AI 回复"""
if self.current_session:
self.current_session.add_message("ai", text)
self.chat_display.append(f"<b>ChatGPT:</b> {text}")
def get_ai_response(self, user_input):
"""可在此接入 AI 模型,如 OpenAI API 或本地大模型"""
output = self.model.predict(user_input)
return f"<span style='font-size: 20px;'>{output}</span>"
def add_chat_item(self, text):
""" 添加带删除按钮的聊天记录项 """
item_widget = QWidget()
item_layout = QHBoxLayout(item_widget)
item_layout.setContentsMargins(5, 2, 5, 2)
label = QLabel(text)
delete_button = QPushButton("×")
delete_button.setFixedSize(20, 20)
delete_button.setStyleSheet("background-color: #cc6666; color: white; border-radius: 10px;")
item_layout.addWidget(label)
item_layout.addWidget(delete_button)
item_layout.addStretch()
list_item = QListWidgetItem(self.history_list)
list_item.setSizeHint(item_widget.sizeHint())
self.history_list.addItem(list_item)
self.history_list.setItemWidget(list_item, item_widget)
# 绑定删除事件
delete_button.clicked.connect(lambda: self.remove_chat_item(list_item))
self.first_list_item = list_item
def remove_chat_item(self, item):
""" 删除聊天记录项 """
row = self.history_list.row(item)
del self.chat_sessions[row]
self.history_list.takeItem(row)
# 运行 PyQt5 应用
if __name__ == "__main__":
app = QApplication(sys.argv)
window = ChatGPTUI()
window.show()
window.remove_chat_item(window.first_list_item)
window.create_new_chat()
sys.exit(app.exec_())
|