Python学习【40】:巧用python的pyqt5+File实现聊天对话

一、学前花絮

用python的pyqt模块设计两个好朋友之间的对话框,双发发送的信息可以在对方区域显示出来。之前的pyqt实现“学习管理”用数据库存储。这次用文件记录对话信息。

至于实际项目中到底是用数据库好还是文件好,一般来说文件属于轻量级,不涉及第三方软件安装,便于使用,但后续处理没有数据库更直观。而一般正式的项目,后台存储都用数据库,它支持sql语言,查询、修改起来方便。

二、python的pyqt5模块实现聊天对话

2.1 程序规划

程序代码应该包含完整的界面布局、消息收发逻辑、文件记录功能,注释清晰可直接运行。功能说明:

  1. 分「小明」和「小丽」两个对话区域,双方发送的消息会实时显示在对方的聊天窗口;
  2. 支持输入多行文本、回车发送(也可点击发送按钮);
  3. 每次发送消息时,自动将「发送方 + 时间 + 内容」追加到 chat_record.txt 文件中;
  4. 界面区分消息发送方(不同颜色 / 对齐方式),提升可读性。

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”
===== 对话开始:{QDateTime.currentDateTime().toString('yyyy-MM-dd HH:mm:ss')} =====
“)

# 创建中心组件

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.setPlaceholderText(“输入消息(回车发送)”)

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.setForeground(QColor(“#409EFF”) if sender_name == “小明” else QColor(“#67C23A”))

sender_format.setFontWeight(QFont.Bold)

# ✅ 仅显示到接收方窗口(左对齐)


receiver_panel.display.append(f”
【{sender_name} {current_time}】”)

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

程序执行之后结果如下:

Python学习【40】:巧用python的pyqt5+File实现聊天对话

聊天界面

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

Python学习【40】:巧用python的pyqt5+File实现聊天对话

聊天信息已经存入文件

三、小结

今天我们学习了Python的pyqt模块设计对话框功能,双方可以

发送信息给对方,所有信息保存在文件记录中。这种应用程序让我们更加热爱python,同时也让学习更有乐趣。

让我们保持学习热烈,多做练习。我们下期再见!

Python学习【40】:巧用python的pyqt5+File实现聊天对话

快乐男孩

#python#

© 版权声明
THE END
如果内容对您有所帮助,就支持一下吧!
点赞0 分享
音律的头像 - 鹿快
评论 共1条

请登录后发表评论