一、学前花絮
用python的pyqt模块设计两个好朋友之间的对话框,双发发送的信息可以在对方区域显示出来。之前的pyqt实现“学习管理”用数据库存储。这次用文件记录对话信息。
至于实际项目中到底是用数据库好还是文件好,一般来说文件属于轻量级,不涉及第三方软件安装,便于使用,但后续处理没有数据库更直观。而一般正式的项目,后台存储都用数据库,它支持sql语言,查询、修改起来方便。
二、python的pyqt5模块实现聊天对话
2.1 程序规划
程序代码应该包含完整的界面布局、消息收发逻辑、文件记录功能,注释清晰可直接运行。功能说明:
- 分「小明」和「小丽」两个对话区域,双方发送的消息会实时显示在对方的聊天窗口;
- 支持输入多行文本、回车发送(也可点击发送按钮);
- 每次发送消息时,自动将「发送方 + 时间 + 内容」追加到 chat_record.txt 文件中;
- 界面区分消息发送方(不同颜色 / 对齐方式),提升可读性。
2.2程序示例:
|
import sys import datetime from PyQt5.QtWidgets import ( QApplication, QMainWindow, QWidget, QVBoxLayout, QHBoxLayout, QTextEdit, QPushButton, QLabel, QScrollArea ) from PyQt5.QtCore import Qt, QDateTime from PyQt5.QtGui import QTextCharFormat, QColor, QFont class ChatWindow(QMainWindow): def __init__(self): super().__init__() self.setWindowTitle(“小明-小丽双向对话框”) self.setMinimumSize(800, 600) # 初始化文件(若不存在则创建) self.chat_file = “chat_record.txt” with open(self.chat_file, “a”, encoding=”utf-8″) as f: f.write(f” # 创建中心组件 central_widget = QWidget() self.setCentralWidget(central_widget) # 整体布局:左右分栏(小明 + 小丽) main_layout = QHBoxLayout(central_widget) main_layout.setSpacing(20) main_layout.setContentsMargins(20, 20, 20, 20) # 1. 创建小明聊天区域(保存为实例属性,避免覆盖) self.user_panel = self._create_chat_panel(“小明”) # 2. 创建小丽聊天区域(保存为实例属性) self.client_panel = self._create_chat_panel(“小丽”) main_layout.addWidget(self.user_panel, stretch=1) main_layout.addWidget(self.client_panel, stretch=1) def _create_chat_panel(self, panel_name): “””创建单个聊天面板(标题 + 聊天显示区 + 输入区 + 发送按钮)””” panel = QWidget() layout = QVBoxLayout(panel) # 面板标题 title_label = QLabel(panel_name) title_label.setAlignment(Qt.AlignCenter) title_label.setFont(QFont(“微软雅黑”, 12, QFont.Bold)) layout.addWidget(title_label) # 聊天显示区(只读,带滚动) display = QTextEdit() display.setReadOnly(True) display.setFont(QFont(“微软雅黑”, 10)) display.setStyleSheet(“border: 1px solid #ccc; padding: 10px;”) layout.addWidget(display, stretch=5) # 输入区 + 发送按钮布局 input_layout = QHBoxLayout() msg_input = QTextEdit()
msg_input.setFont(QFont(“微软雅黑”, 10)) msg_input.setMaximumHeight(100) input_layout.addWidget(msg_input, stretch=4) send_btn = QPushButton(“发送”) send_btn.setStyleSheet(“background-color: #409EFF; color: white; border: none; padding: 8px;”) # 绑定发送按钮:传递当前面板的输入框、显示区、名称 send_btn.clicked.connect(lambda: self._send_message(panel_name, msg_input, display)) input_layout.addWidget(send_btn, stretch=1) layout.addLayout(input_layout, stretch=1) # 绑定回车发送(区分普通回车和Shift+回车) # 为每个输入框单独绑定回车事件,传递面板信息 def custom_key_press(event, input_box=msg_input, name=panel_name): self._handle_enter(event, input_box, name) msg_input.keyPressEvent = custom_key_press # 为面板绑定属性(方便后续访问) panel.display = display panel.input = msg_input panel.name = panel_name return panel def _handle_enter(self, event, input_box, panel_name): “””处理回车事件:普通回车发送,Shift+回车换行””” if event.key() == Qt.Key_Return or event.key() == Qt.Key_Enter: if event.modifiers() & Qt.ShiftModifier: # Shift+回车:正常换行 QTextEdit.keyPressEvent(input_box, event) else: # 普通回车:发送消息(传入当前输入框) self._send_message(panel_name, input_box, None) else: # 其他按键正常处理 QTextEdit.keyPressEvent(input_box, event) def _send_message(self, sender_name, input_box, sender_display): “””发送消息核心逻辑:仅显示到对方窗口 + 记录到文件””” # 获取输入的消息并去除首尾空格 msg_content = input_box.toPlainText().strip() if not msg_content: return # 空消息不发送 # 确定接收方面板 if sender_name == “小明”: receiver_panel = self.client_panel # 用户发 → 小丽收 sender_panel = self.user_panel # 发送方自己的面板(用于清空输入) else: receiver_panel = self.user_panel # 小丽发 → 小明收 sender_panel = self.client_panel # 发送方自己的面板 # 获取当前时间 current_time = QDateTime.currentDateTime().toString(“HH:mm:ss”) # 1. 格式化消息(区分发送方,不同颜色) sender_format = QTextCharFormat()
sender_format.setFontWeight(QFont.Bold) # ✅ 仅显示到接收方窗口(左对齐)
receiver_panel.display.setTextCursor(receiver_panel.display.textCursor()) receiver_panel.display.setCurrentCharFormat(sender_format) receiver_panel.display.insertPlainText(msg_content) receiver_panel.display.setAlignment(Qt.AlignLeft) # 2. 记录到文件 with open(self.chat_file, “a”, encoding=”utf-8″) as f: f.write(f”[{current_time}] {sender_name}:{msg_content} # 3. 清空发送方的输入框 input_box.clear() # 4. 接收方窗口滚动到最新消息 receiver_panel.display.verticalScrollBar().setValue( receiver_panel.display.verticalScrollBar().maximum() ) if __name__ == “__main__”: app = QApplication(sys.argv) window = ChatWindow() window.show() sys.exit(app.exec_()) |
程序执行之后结果如下:

聊天界面
双方的对话信息保存在文件“chat_record.txt”中,我们查看文件显示如下:

聊天信息已经存入文件
三、小结
今天我们学习了Python的pyqt模块设计对话框功能,双方可以
发送信息给对方,所有信息保存在文件记录中。这种应用程序让我们更加热爱python,同时也让学习更有乐趣。
让我们保持学习热烈,多做练习。我们下期再见!

快乐男孩
#python#















- 最新
- 最热
只看作者