|
|
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;")
|
|
|
|
|
|
|
|
|
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_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)
|
|
|
|
|
|
|
|
|
|
|
|
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_())
|
|
|
|