From a38550c5ffe8666081deaa28fc5e5ec01bda25f0 Mon Sep 17 00:00:00 2001 From: shuaikangzhou <863909694@qq.com> Date: Fri, 17 Nov 2023 23:54:34 +0800 Subject: [PATCH 1/8] =?UTF-8?q?=E5=B0=86=E8=87=AA=E5=B7=B1=E7=9A=84wxid?= =?UTF-8?q?=E8=AE=BE=E7=BD=AE=E4=B8=BA=E9=85=8D=E7=BD=AE=E6=96=87=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .idea/workspace.xml | 34 ++++++----- app/DataBase/micro_msg.py | 1 - app/DataBase/msg.py | 2 +- app/person.py | 1 - app/ui_pc/chat/chat_window.py | 10 ++++ app/ui_pc/contact/contact_window.py | 5 ++ app/ui_pc/mainview.py | 91 +++++++++++++++++++++++++---- app/ui_pc/tool/tool_window.py | 2 + 8 files changed, 115 insertions(+), 31 deletions(-) diff --git a/.idea/workspace.xml b/.idea/workspace.xml index 4c87ef5..dde2923 100644 --- a/.idea/workspace.xml +++ b/.idea/workspace.xml @@ -4,12 +4,14 @@ - @@ -680,7 +681,8 @@ - @@ -704,17 +706,17 @@ file://$PROJECT_DIR$/app/person.py - 101 + 100 file://$PROJECT_DIR$/app/person.py - 99 + 98 file://$PROJECT_DIR$/app/person.py - 100 + 99 diff --git a/app/DataBase/micro_msg.py b/app/DataBase/micro_msg.py index 5c0b78d..6f1cba0 100644 --- a/app/DataBase/micro_msg.py +++ b/app/DataBase/micro_msg.py @@ -31,7 +31,6 @@ def get_contact(): from Contact inner join ContactHeadImgUrl on Contact.UserName = ContactHeadImgUrl.usrName where Type=3 and Alias is not null order by PYInitial - limit 30 ''' cursor.execute(sql) result = cursor.fetchall() diff --git a/app/DataBase/msg.py b/app/DataBase/msg.py index 4b4a94e..b720791 100644 --- a/app/DataBase/msg.py +++ b/app/DataBase/msg.py @@ -62,7 +62,7 @@ def get_message_by_num(username_, n): from MSG where StrTalker=? order by CreateTime - limit 10 + limit 100 ''' result = [] try: diff --git a/app/person.py b/app/person.py index 0ad5ad5..32c8dd4 100644 --- a/app/person.py +++ b/app/person.py @@ -64,7 +64,6 @@ class MePC: self.avatar.loadFromData(img_bytes, format='PNG') else: self.avatar.loadFromData(img_bytes, format='jfif') - self.avatar = QPixmap() class ContactPC: diff --git a/app/ui_pc/chat/chat_window.py b/app/ui_pc/chat/chat_window.py index c5e687f..386790d 100644 --- a/app/ui_pc/chat/chat_window.py +++ b/app/ui_pc/chat/chat_window.py @@ -46,6 +46,8 @@ HistoryPanel::item:hover { class ChatWindow(QWidget, Ui_Form): + load_finish_signal = pyqtSignal(bool) + def __init__(self, parent=None): super().__init__(parent) self.show_thread = None @@ -56,6 +58,7 @@ class ChatWindow(QWidget, Ui_Form): self.show_chats() def init_ui(self): + search_action = QAction(self.lineEdit) search_action.setIcon(Icon.Search_Icon) self.lineEdit.addAction(search_action, QLineEdit.LeadingPosition) @@ -74,6 +77,7 @@ class ChatWindow(QWidget, Ui_Form): return self.show_thread = ShowContactThread() self.show_thread.showSingal.connect(self.show_chat) + self.show_thread.load_finish_signal.connect(self.stop_loading) self.show_thread.start() self.ok_flag = True @@ -88,9 +92,14 @@ class ChatWindow(QWidget, Ui_Form): print(row) self.stackedWidget.setCurrentIndex(row) + def stop_loading(self, a0): + # self.label.setVisible(False) + self.load_finish_signal.emit(True) + class ShowContactThread(QThread): showSingal = pyqtSignal(ContactPC) + load_finish_signal = pyqtSignal(bool) # heightSingal = pyqtSignal(int) def __init__(self): @@ -113,3 +122,4 @@ class ShowContactThread(QThread): contact.set_avatar(contact.smallHeadImgBLOG) self.showSingal.emit(contact) # pprint(contact.__dict__) + self.load_finish_signal.emit(True) diff --git a/app/ui_pc/contact/contact_window.py b/app/ui_pc/contact/contact_window.py index 1496928..51f7102 100644 --- a/app/ui_pc/contact/contact_window.py +++ b/app/ui_pc/contact/contact_window.py @@ -46,6 +46,8 @@ HistoryPanel::item:hover { class ContactWindow(QWidget, Ui_Form): + load_finish_signal = pyqtSignal(bool) + def __init__(self, parent=None): super().__init__(parent) self.show_thread = None @@ -73,6 +75,7 @@ class ContactWindow(QWidget, Ui_Form): return self.show_thread = ShowContactThread() self.show_thread.showSingal.connect(self.show_contact) + self.show_thread.load_finish_signal.connect(self.load_finish_signal) self.show_thread.start() self.ok_flag = True @@ -90,6 +93,7 @@ class ContactWindow(QWidget, Ui_Form): class ShowContactThread(QThread): showSingal = pyqtSignal(ContactPC) + load_finish_signal = pyqtSignal(bool) # heightSingal = pyqtSignal(int) def __init__(self): @@ -112,3 +116,4 @@ class ShowContactThread(QThread): contact.set_avatar(contact.smallHeadImgBLOG) self.showSingal.emit(contact) # pprint(contact.__dict__) + self.load_finish_signal.emit(True) diff --git a/app/ui_pc/mainview.py b/app/ui_pc/mainview.py index 8d7165b..88e9967 100644 --- a/app/ui_pc/mainview.py +++ b/app/ui_pc/mainview.py @@ -7,6 +7,7 @@ @Version : Python3.10 @comment : 主窗口 """ +import json from random import randint from PyQt5.QtCore import * @@ -73,37 +74,65 @@ class MainWinController(QMainWindow, mainwindow.Ui_MainWindow): self.resize(QSize(800, 600)) # self.stackedWidget = QtWidgets.QStackedWidget(self.centralwidget) self.action_desc.triggered.connect(self.about) + self.load_data() self.init_ui() + self.load_num = 0 + + def load_data(self): + with open('./app/data/info.json', 'r', encoding='utf-8') as f: + dic = json.loads(f.read()) + wxid = dic.get('wxid') + if wxid: + me = MePC() + self.set_my_info(wxid) def init_ui(self): + # self.movie = QMovie("./app/data/loading.gif") + self.label = QLabel(self) + self.label.setGeometry(0, 0, self.width(), self.height()) + # self.label.setMovie(self.movie) + # self.movie.start() self.listWidget.currentRowChanged.connect(self.setCurrentIndex) + tool_item = QListWidgetItem(Icon.MyInfo_Icon, '工具', self.listWidget) chat_item = QListWidgetItem(Icon.Chat_Icon, '聊天', self.listWidget) contact_item = QListWidgetItem(Icon.Contact_Icon, '好友', self.listWidget) myinfo_item = QListWidgetItem(Icon.MyInfo_Icon, '我的', self.listWidget) - tool_item = QListWidgetItem(Icon.MyInfo_Icon, '工具', self.listWidget) tool_window = ToolWindow() tool_window.get_info_signal.connect(self.set_my_info) - self.chat_window = ChatWindow() - self.stackedWidget.addWidget(self.chat_window) - self.contact_window = ContactWindow() - # self.contact_window = QWidget() - self.stackedWidget.addWidget(self.contact_window) - label = QLabel('我是页面', self) + tool_window.load_finish_signal.connect(self.loading) + self.stackedWidget.addWidget(tool_window) + self.listWidget.setCurrentRow(0) + self.stackedWidget.setCurrentIndex(0) + chat_window = ChatWindow() + self.stackedWidget.addWidget(chat_window) + contact_window = ContactWindow() + self.stackedWidget.addWidget(contact_window) + label = QLabel('我是页面') label.setAlignment(Qt.AlignCenter) # 设置label的背景颜色(这里随机) # 这里加了一个margin边距(方便区分QStackedWidget和QLabel的颜色) label.setStyleSheet('background: rgb(%d, %d, %d);margin: 50px;' % ( randint(0, 255), randint(0, 255), randint(0, 255))) self.stackedWidget.addWidget(label) - self.stackedWidget.addWidget(tool_window) - self.listWidget.setCurrentRow(3) - self.stackedWidget.setCurrentIndex(3) + tool_window.load_finish_signal.connect(self.loading) + contact_window.load_finish_signal.connect(self.loading) + chat_window.load_finish_signal.connect(self.loading) + # self.load_window_thread = LoadWindowThread(self.stackedWidget) + # self.load_window_thread.okSignal.connect(self.stop_loading) + # self.load_window_thread.start() def setCurrentIndex(self, row): - if row == 1: - self.contact_window.show_contacts() self.stackedWidget.setCurrentIndex(row) + if row == 2: + self.stackedWidget.currentWidget().show_contacts() + + def setWindow(self, window): + try: + window.load_finish_signal.connect(self.loading) + except: + pass + self.stackedWidget.addWidget(window) def set_my_info(self, wxid): self.avatar = QPixmap() @@ -115,9 +144,24 @@ class MainWinController(QMainWindow, mainwindow.Ui_MainWindow): self.avatar.scaled(60, 60) me = MePC() me.set_avatar(img_bytes) + dic = { + 'wxid': wxid + } + with open('./app/data/info.json', 'w', encoding='utf-8') as f: + f.write(json.dumps(dic)) self.myavatar.setScaledContents(True) self.myavatar.setPixmap(self.avatar) + def stop_loading(self, a0): + self.label.setVisible(False) + + def loading(self, a0): + self.load_num += 1 + print('加载一个了') + if self.load_num == 2: + print('ok了') + self.label.setVisible(False) + def about(self): """ 关于 @@ -133,3 +177,26 @@ class MainWinController(QMainWindow, mainwindow.Ui_MainWindow): del self.stackedWidget msg.close() self.contact_window.close() + + +class LoadWindowThread(QThread): + windowSignal = pyqtSignal(QWidget) + okSignal = pyqtSignal(bool) + + def __init__(self, stackedWidget): + super().__init__() + self.stackedWidget = stackedWidget + + def run(self): + chat_window = ChatWindow() + self.stackedWidget.addWidget(chat_window) + contact_window = ContactWindow() + self.stackedWidget.addWidget(contact_window) + label = QLabel('我是页面') + label.setAlignment(Qt.AlignCenter) + # 设置label的背景颜色(这里随机) + # 这里加了一个margin边距(方便区分QStackedWidget和QLabel的颜色) + label.setStyleSheet('background: rgb(%d, %d, %d);margin: 50px;' % ( + randint(0, 255), randint(0, 255), randint(0, 255))) + self.stackedWidget.addWidget(label) + self.okSignal.emit(True) diff --git a/app/ui_pc/tool/tool_window.py b/app/ui_pc/tool/tool_window.py index 0963e2d..e6ddb59 100644 --- a/app/ui_pc/tool/tool_window.py +++ b/app/ui_pc/tool/tool_window.py @@ -46,12 +46,14 @@ HistoryPanel::item:hover { class ToolWindow(QWidget, Ui_Dialog): get_info_signal = pyqtSignal(str) + load_finish_signal = pyqtSignal(bool) def __init__(self, parent=None): super().__init__(parent) self.setupUi(self) self.setStyleSheet(Stylesheet) self.init_ui() + self.load_finish_signal.emit(True) def init_ui(self): self.listWidget.clear() From fd8d0ed1538563d9881a8ce929b3921880b6bb0e Mon Sep 17 00:00:00 2001 From: shuaikangzhou <863909694@qq.com> Date: Fri, 17 Nov 2023 23:59:52 +0800 Subject: [PATCH 2/8] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E8=81=8A=E5=A4=A9?= =?UTF-8?q?=E8=AE=B0=E5=BD=95=E6=98=BE=E7=A4=BA=E9=A1=BA=E5=BA=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .idea/workspace.xml | 29 +++++++++++------------------ app/DataBase/msg.py | 3 ++- 2 files changed, 13 insertions(+), 19 deletions(-) diff --git a/.idea/workspace.xml b/.idea/workspace.xml index dde2923..6e806e5 100644 --- a/.idea/workspace.xml +++ b/.idea/workspace.xml @@ -4,15 +4,8 @@ - @@ -682,7 +674,8 @@ - diff --git a/app/DataBase/msg.py b/app/DataBase/msg.py index b720791..6ddfaa4 100644 --- a/app/DataBase/msg.py +++ b/app/DataBase/msg.py @@ -61,7 +61,7 @@ def get_message_by_num(username_, n): select localId,TalkerId,Type,SubType,IsSender,CreateTime,Status,StrContent,strftime('%Y-%m-%d %H:%M:%S',CreateTime,'unixepoch','localtime') as StrTime from MSG where StrTalker=? - order by CreateTime + order by CreateTime desc limit 100 ''' result = [] @@ -71,6 +71,7 @@ def get_message_by_num(username_, n): cur = cursor[-1] cur.execute(sql, [username_]) result_ = cur.fetchall() + result_.reverse() result += result_ return result_ finally: From c72b67f2a0ad0fc545608082a28377b71ed383df Mon Sep 17 00:00:00 2001 From: shuaikangzhou <863909694@qq.com> Date: Sat, 18 Nov 2023 11:51:58 +0800 Subject: [PATCH 3/8] =?UTF-8?q?=E8=81=8A=E5=A4=A9=E8=AE=B0=E5=BD=95?= =?UTF-8?q?=E4=BB=8E=E5=90=8E=E5=BE=80=E5=89=8D=E6=98=BE=E7=A4=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .idea/workspace.xml | 31 ++++++++++-------- app/DataBase/micro_msg.py | 15 +++------ app/components/bubble_message.py | 51 ++++++++++++++++++----------- app/ui_pc/chat/chat_info.py | 20 +++++++---- app/ui_pc/chat/chat_window.py | 3 +- app/ui_pc/contact/contact_window.py | 2 +- 6 files changed, 70 insertions(+), 52 deletions(-) diff --git a/.idea/workspace.xml b/.idea/workspace.xml index 6e806e5..84098d1 100644 --- a/.idea/workspace.xml +++ b/.idea/workspace.xml @@ -4,8 +4,13 @@ - @@ -675,7 +679,8 @@ - diff --git a/app/DataBase/micro_msg.py b/app/DataBase/micro_msg.py index 6f1cba0..4e489af 100644 --- a/app/DataBase/micro_msg.py +++ b/app/DataBase/micro_msg.py @@ -1,7 +1,8 @@ import os.path import sqlite3 -import time +import threading +lock = threading.Lock() DB = None cursor = None micromsg_path = "./app/Database/Msg/MicroMsg.db" @@ -27,6 +28,7 @@ def is_database_exist(): def get_contact(): try: + lock.acquire(True) sql = '''select UserName,Alias,Type,Remark,NickName,PYInitial,RemarkPYInitial,ContactHeadImgUrl.smallHeadImgUrl,ContactHeadImgUrl.bigHeadImgUrl from Contact inner join ContactHeadImgUrl on Contact.UserName = ContactHeadImgUrl.usrName where Type=3 and Alias is not null @@ -34,15 +36,8 @@ def get_contact(): ''' cursor.execute(sql) result = cursor.fetchall() - except: - time.sleep(0.2) - sql = '''select UserName,Alias,Type,Remark,NickName,PYInitial,RemarkPYInitial,ContactHeadImgUrl.smallHeadImgUrl,ContactHeadImgUrl.bigHeadImgUrl - from Contact inner join ContactHeadImgUrl on Contact.UserName = ContactHeadImgUrl.usrName - where Type=3 and Alias is not null - order by PYInitial - ''' - cursor.execute(sql) - result = cursor.fetchall() + finally: + lock.release() # DB.commit() return result diff --git a/app/components/bubble_message.py b/app/components/bubble_message.py index 8b44654..c6357ef 100644 --- a/app/components/bubble_message.py +++ b/app/components/bubble_message.py @@ -250,12 +250,12 @@ class ScrollBar(QScrollBar): ) -class MyWidget(QWidget): +class ChatWidget(QWidget): def __init__(self): super().__init__() self.resize(500, 200) txt = '''在工具中单击边缘可以添加黑点,单击可以删掉黑点,拖动可以调整黑点长度。勾选等选项可以查看内容、缩放等区域右侧可预览不同拉伸情况下的效果,拖动可以调整预览的拉伸比例''' - avatar = '../data/icons/default_avatar.svg' + avatar = './app/data/icons/default_avatar.svg' bubble_message = BubbleMessage(txt, avatar, Type=1, is_send=False) layout = QVBoxLayout() layout.setSpacing(0) @@ -272,39 +272,52 @@ class MyWidget(QWidget): # 设置滚动区域的内容部署部件为前面生成的内容部署层部件 self.scrollArea.setWidget(self.scrollAreaWidgetContents) layout.addWidget(self.scrollArea) - layout0 = QVBoxLayout() - layout0.setSpacing(0) + self.layout0 = QVBoxLayout() + self.layout0.setSpacing(0) + # self.layout0.addWidget(bubble_message) # self.scrollArea.setLayout(layout0) - self.scrollAreaWidgetContents.setLayout(layout0) + self.scrollAreaWidgetContents.setLayout(self.layout0) time = Notice("2023-11-17 15:44") - layout0.addWidget(time) - txt = "你说啥" - avatar_2 = '../data/icons/default_avatar.svg' - bubble_message1 = BubbleMessage(txt, avatar_2, Type=1, is_send=True) - layout0.addWidget(bubble_message) - layout0.addWidget(bubble_message1) - - bubble_message2 = BubbleMessage('', avatar_2, Type=1, is_send=True) - layout0.addWidget(bubble_message2) - txt = "我啥都没说" - avatar0 = 'Data/fg1.png' + # self.layout0.addWidget(time) + # txt = "你说啥" + # avatar_2 = '../data/icons/default_avatar.svg' + # bubble_message1 = BubbleMessage(txt, avatar_2, Type=1, is_send=True) + # + # self.layout0.addWidget(bubble_message1) + # + # bubble_message2 = BubbleMessage('', avatar_2, Type=1, is_send=True) + # self.layout0.addWidget(bubble_message2) + # txt = "我啥都没说" + # avatar0 = 'Data/fg1.png' bubble_message1 = BubbleMessage("D:\Project\Python\PyQt-master\QLabel\Data\\fg1.png", avatar, Type=3, is_send=False) - layout0.addWidget(bubble_message1) + self.layout0.addWidget(bubble_message1) self.spacerItem = QSpacerItem(10, 10, QSizePolicy.Minimum, QSizePolicy.Expanding) - layout0.addItem(self.spacerItem) + self.layout0.addItem(self.spacerItem) # layout.setStretch(0, 1) self.setLayout(layout) + def add_message_item(self, bubble_message): + self.layout0.addWidget(bubble_message) + + def set_scroll_bar_last(self): + self.scrollArea.verticalScrollBar().setValue(self.scrollArea.widget().height()) + class Test(QWidget): def __init__(self): super().__init__() layout = QVBoxLayout() self.resize(500, 600) - w1 = MyWidget() + w1 = ChatWidget() + bm1 = BubbleMessage( + '你好啊噜啦噜啦嘞绿噜啦噜啦嘞绿绿噜啦噜啦嘞绿绿绿噜啦噜啦嘞绿绿绿绿', + "D:\Project\Python\PyQt-master\QLabel\Data\\fg1.png", + Type=1, + ) + w1.add_message_item(bm1) w2 = QLabel("nihao") layout.addWidget(w1) layout.addWidget(w2) diff --git a/app/ui_pc/chat/chat_info.py b/app/ui_pc/chat/chat_info.py index 72f0573..f765eae 100644 --- a/app/ui_pc/chat/chat_info.py +++ b/app/ui_pc/chat/chat_info.py @@ -1,8 +1,8 @@ from PyQt5.QtCore import QThread, pyqtSignal, Qt -from PyQt5.QtWidgets import QWidget, QVBoxLayout, QSpacerItem, QSizePolicy, QLabel, QHBoxLayout +from PyQt5.QtWidgets import QWidget, QVBoxLayout, QLabel, QHBoxLayout from app.DataBase import msg -from app.components.bubble_message import BubbleMessage, ScrollBar, ScrollArea, ScrollAreaContent +from app.components.bubble_message import BubbleMessage, ScrollBar, ScrollArea, ScrollAreaContent, ChatWidget from app.person import MePC @@ -22,7 +22,11 @@ class ChatInfo(QWidget): self.vBoxLayout = QVBoxLayout() self.vBoxLayout.setSpacing(0) - # self.vBoxLayout.addLayout(self.hBoxLayout) + self.vBoxLayout.addLayout(self.hBoxLayout) + + self.chat_window = ChatWidget() + self.vBoxLayout.addWidget(self.chat_window) + return self.scrollArea = ScrollArea() self.scrollArea.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff) @@ -30,7 +34,7 @@ class ChatInfo(QWidget): self.scrollArea.setVerticalScrollBar(scrollBar) self.scrollAreaWidgetContents = ScrollAreaContent() - self.scrollAreaWidgetContents.setMinimumSize(200, 10000) + self.scrollAreaWidgetContents.setMinimumSize(200, 400) self.scrollArea.setWidget(self.scrollAreaWidgetContents) self.vBoxLayout.addWidget(self.scrollArea) @@ -45,9 +49,10 @@ class ChatInfo(QWidget): self.show_chat_thread.start() def show_finish(self, ok): - self.spacerItem = QSpacerItem(10, 10, QSizePolicy.Minimum, QSizePolicy.Expanding) - self.scroolAreaLayout.addItem(self.spacerItem) + # self.spacerItem = QSpacerItem(10, 10, QSizePolicy.Minimum, QSizePolicy.Expanding) + # self.scroolAreaLayout.addItem(self.spacerItem) self.setLayout(self.vBoxLayout) + self.chat_window.set_scroll_bar_last() def show_chat(self, message): try: @@ -64,7 +69,8 @@ class ChatInfo(QWidget): is_send ) # print(str_content) - self.scroolAreaLayout.addWidget(bubble_message) + # self.scroolAreaLayout.addWidget(bubble_message) + self.chat_window.add_message_item(bubble_message) except: print(message) diff --git a/app/ui_pc/chat/chat_window.py b/app/ui_pc/chat/chat_window.py index 386790d..0994855 100644 --- a/app/ui_pc/chat/chat_window.py +++ b/app/ui_pc/chat/chat_window.py @@ -58,7 +58,6 @@ class ChatWindow(QWidget, Ui_Form): self.show_chats() def init_ui(self): - search_action = QAction(self.lineEdit) search_action.setIcon(Icon.Search_Icon) self.lineEdit.addAction(search_action, QLineEdit.LeadingPosition) @@ -82,7 +81,7 @@ class ChatWindow(QWidget, Ui_Form): self.ok_flag = True def show_chat(self, contact): - contact_item = ContactQListWidgetItem(contact.nickName, contact.smallHeadImgUrl, contact.smallHeadImgBLOG) + contact_item = ContactQListWidgetItem(contact.remark, contact.smallHeadImgUrl, contact.smallHeadImgBLOG) self.listWidget.addItem(contact_item) self.listWidget.setItemWidget(contact_item, contact_item.widget) chat_info_window = ChatInfo(contact) diff --git a/app/ui_pc/contact/contact_window.py b/app/ui_pc/contact/contact_window.py index 51f7102..302c8d5 100644 --- a/app/ui_pc/contact/contact_window.py +++ b/app/ui_pc/contact/contact_window.py @@ -80,7 +80,7 @@ class ContactWindow(QWidget, Ui_Form): self.ok_flag = True def show_contact(self, contact): - contact_item = ContactQListWidgetItem(contact.nickName, contact.smallHeadImgUrl, contact.smallHeadImgBLOG) + contact_item = ContactQListWidgetItem(contact.remark, contact.smallHeadImgUrl, contact.smallHeadImgBLOG) self.listWidget.addItem(contact_item) self.listWidget.setItemWidget(contact_item, contact_item.widget) contact_info_window = ContactInfo(contact) From a248146e83b661f9ddd93edc643d9c9c4b5d3159 Mon Sep 17 00:00:00 2001 From: shuaikangzhou <863909694@qq.com> Date: Sat, 18 Nov 2023 13:25:56 +0800 Subject: [PATCH 4/8] =?UTF-8?q?=E8=81=8A=E5=A4=A9=E6=B6=88=E6=81=AF?= =?UTF-8?q?=E8=87=AA=E9=80=82=E5=BA=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .idea/workspace.xml | 72 ++++++++++++++++---------------- app/DataBase/msg.py | 17 ++++---- app/components/bubble_message.py | 72 +++++++++++--------------------- app/ui_pc/chat/chat_info.py | 60 ++++++++++++++++---------- 4 files changed, 108 insertions(+), 113 deletions(-) diff --git a/.idea/workspace.xml b/.idea/workspace.xml index 84098d1..8323c16 100644 --- a/.idea/workspace.xml +++ b/.idea/workspace.xml @@ -4,13 +4,11 @@ - @@ -680,7 +677,8 @@ - diff --git a/app/DataBase/msg.py b/app/DataBase/msg.py index 6ddfaa4..e15b142 100644 --- a/app/DataBase/msg.py +++ b/app/DataBase/msg.py @@ -2,6 +2,7 @@ import os.path import re import sqlite3 import threading +from pprint import pprint DB = [] cursor = [] @@ -56,22 +57,21 @@ def get_messages(username_): return result -def get_message_by_num(username_, n): +def get_message_by_num(username_, local_id): sql = ''' select localId,TalkerId,Type,SubType,IsSender,CreateTime,Status,StrContent,strftime('%Y-%m-%d %H:%M:%S',CreateTime,'unixepoch','localtime') as StrTime from MSG - where StrTalker=? - order by CreateTime desc - limit 100 + where StrTalker = ? and localId < ? + order by CreateTime desc + limit 30 ''' result = [] try: lock.acquire(True) for cur in cursor: cur = cursor[-1] - cur.execute(sql, [username_]) + cur.execute(sql, [username_, local_id]) result_ = cur.fetchall() - result_.reverse() result += result_ return result_ finally: @@ -93,5 +93,8 @@ if __name__ == '__main__': # result = get_messages(username) # pprint(result) # pprint(len(result)) - result = get_message_by_num('wxid_0o18ef858vnu22', 0) + result = get_message_by_num('wxid_0o18ef858vnu22', 9999999) print(result) + print(result[-1][0]) + local_id = result[-1][0] + pprint(get_message_by_num('wxid_0o18ef858vnu22', local_id)) diff --git a/app/components/bubble_message.py b/app/components/bubble_message.py index c6357ef..517f600 100644 --- a/app/components/bubble_message.py +++ b/app/components/bubble_message.py @@ -140,6 +140,7 @@ class BubbleMessage(QWidget): layout = QHBoxLayout() layout.setSpacing(0) layout.setContentsMargins(0, 5, 5, 5) + # self.resize(QSize(200, 50)) self.avatar = Avatar(avatar) triangle = Triangle(Type, is_send) if Type == 1: @@ -173,35 +174,20 @@ class BubbleMessage(QWidget): class ScrollAreaContent(QWidget): def __init__(self, parent=None): super().__init__(parent) - # self.setStyleSheet( - # ''' - # background-color:rgb(127,127,127); - # ''' - # ) - - def resizeEvent(self, a0: QtGui.QResizeEvent) -> None: - # print(self.width(),self.height()) - self.setMinimumSize(self.width(), self.height()) + self.adjustSize() class ScrollArea(QScrollArea): def __init__(self, parent=None): super().__init__(parent) self.setWidgetResizable(True) + self.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff) self.setStyleSheet( ''' border:none; ''' ) - def resizeEvent(self, a0: QtGui.QResizeEvent) -> None: - # return - self.widget().setMinimumSize(self.width(), self.widget().height()) - self.widget().setMaximumSize(self.width(), self.widget().height()) - self.widget().resize(QSize(self.width(), self.widget().height())) - - -# class ScrollBar(QScrollBar): def __init__(self): @@ -254,57 +240,41 @@ class ChatWidget(QWidget): def __init__(self): super().__init__() self.resize(500, 200) - txt = '''在工具中单击边缘可以添加黑点,单击可以删掉黑点,拖动可以调整黑点长度。勾选等选项可以查看内容、缩放等区域右侧可预览不同拉伸情况下的效果,拖动可以调整预览的拉伸比例''' - avatar = './app/data/icons/default_avatar.svg' - bubble_message = BubbleMessage(txt, avatar, Type=1, is_send=False) + layout = QVBoxLayout() layout.setSpacing(0) - + self.adjustSize() # 生成滚动区域 - self.scrollArea = ScrollArea() - self.scrollArea.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff) + self.scrollArea = ScrollArea(self) scrollBar = ScrollBar() self.scrollArea.setVerticalScrollBar(scrollBar) # self.scrollArea.setGeometry(QRect(9, 9, 261, 211)) # 生成滚动区域的内容部署层部件 - self.scrollAreaWidgetContents = ScrollAreaContent() + self.scrollAreaWidgetContents = ScrollAreaContent(self.scrollArea) self.scrollAreaWidgetContents.setMinimumSize(50, 100) # 设置滚动区域的内容部署部件为前面生成的内容部署层部件 self.scrollArea.setWidget(self.scrollAreaWidgetContents) layout.addWidget(self.scrollArea) self.layout0 = QVBoxLayout() self.layout0.setSpacing(0) - # self.layout0.addWidget(bubble_message) - # self.scrollArea.setLayout(layout0) self.scrollAreaWidgetContents.setLayout(self.layout0) - - time = Notice("2023-11-17 15:44") - # self.layout0.addWidget(time) - # txt = "你说啥" - # avatar_2 = '../data/icons/default_avatar.svg' - # bubble_message1 = BubbleMessage(txt, avatar_2, Type=1, is_send=True) - # - # self.layout0.addWidget(bubble_message1) - # - # bubble_message2 = BubbleMessage('', avatar_2, Type=1, is_send=True) - # self.layout0.addWidget(bubble_message2) - # txt = "我啥都没说" - # avatar0 = 'Data/fg1.png' - bubble_message1 = BubbleMessage("D:\Project\Python\PyQt-master\QLabel\Data\\fg1.png", avatar, Type=3, - is_send=False) - self.layout0.addWidget(bubble_message1) - - self.spacerItem = QSpacerItem(10, 10, QSizePolicy.Minimum, QSizePolicy.Expanding) - self.layout0.addItem(self.spacerItem) - # layout.setStretch(0, 1) self.setLayout(layout) - def add_message_item(self, bubble_message): - self.layout0.addWidget(bubble_message) + def add_message_item(self, bubble_message, index=1): + if index: + self.layout0.addWidget(bubble_message) + else: + self.layout0.insertWidget(0, bubble_message) def set_scroll_bar_last(self): self.scrollArea.verticalScrollBar().setValue(self.scrollArea.widget().height()) + def set_scroll_bar_value(self, val): + self.verticalScrollBar().setValue(val) + + def verticalScrollBar(self): + return self.scrollArea.verticalScrollBar() + class Test(QWidget): def __init__(self): @@ -318,6 +288,12 @@ class Test(QWidget): Type=1, ) w1.add_message_item(bm1) + for i in range(10): + txt = '''在工具中单击边缘可以添加黑点,单击可以删掉黑点,拖动可以调整黑点长度。勾选等选项可以查看内容、缩放等区域右侧可预览不同拉伸情况下的效果,拖动可以调整预览的拉伸比例''' + avatar = '../data/icons/default_avatar.svg' + bubble_message = BubbleMessage(txt, avatar, Type=1, is_send=False) + print(bubble_message.height(), '高度') + w1.add_message_item(bubble_message, 0) w2 = QLabel("nihao") layout.addWidget(w1) layout.addWidget(w2) diff --git a/app/ui_pc/chat/chat_info.py b/app/ui_pc/chat/chat_info.py index f765eae..5cb18b2 100644 --- a/app/ui_pc/chat/chat_info.py +++ b/app/ui_pc/chat/chat_info.py @@ -1,14 +1,15 @@ -from PyQt5.QtCore import QThread, pyqtSignal, Qt +from PyQt5.QtCore import QThread, pyqtSignal from PyQt5.QtWidgets import QWidget, QVBoxLayout, QLabel, QHBoxLayout from app.DataBase import msg -from app.components.bubble_message import BubbleMessage, ScrollBar, ScrollArea, ScrollAreaContent, ChatWidget +from app.components.bubble_message import BubbleMessage, ChatWidget from app.person import MePC class ChatInfo(QWidget): def __init__(self, contact, parent=None): super().__init__(parent) + self.last_pos = 0 self.contact = contact self.init_ui() @@ -25,22 +26,8 @@ class ChatInfo(QWidget): self.vBoxLayout.addLayout(self.hBoxLayout) self.chat_window = ChatWidget() + self.chat_window.scrollArea.verticalScrollBar().valueChanged.connect(self.verticalScrollBar) self.vBoxLayout.addWidget(self.chat_window) - return - - self.scrollArea = ScrollArea() - self.scrollArea.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff) - scrollBar = ScrollBar() - self.scrollArea.setVerticalScrollBar(scrollBar) - - self.scrollAreaWidgetContents = ScrollAreaContent() - self.scrollAreaWidgetContents.setMinimumSize(200, 400) - self.scrollArea.setWidget(self.scrollAreaWidgetContents) - - self.vBoxLayout.addWidget(self.scrollArea) - self.scroolAreaLayout = QVBoxLayout() - self.scroolAreaLayout.setSpacing(0) - self.scrollAreaWidgetContents.setLayout(self.scroolAreaLayout) def show_chats(self): self.show_chat_thread = ShowChatThread(self.contact) @@ -52,7 +39,32 @@ class ChatInfo(QWidget): # self.spacerItem = QSpacerItem(10, 10, QSizePolicy.Minimum, QSizePolicy.Expanding) # self.scroolAreaLayout.addItem(self.spacerItem) self.setLayout(self.vBoxLayout) - self.chat_window.set_scroll_bar_last() + self.setScrollBarPos() + + def verticalScrollBar(self, pos): + """ + 滚动条到0之后自动更新聊天记录 + :param pos: + :return: + """ + # print(pos) + if pos > 0: + return + self.last_pos = self.chat_window.verticalScrollBar().maximum() + print('记录当前滚动条位置:', self.last_pos) + self.show_chat_thread.start() + + def setScrollBarPos(self): + """ + 将滚动条位置设置为上次看到的地方 + :param pos: + :return: + """ + print('上次滚动条位置', self.last_pos) + pos = self.chat_window.verticalScrollBar().maximum() - self.last_pos + + print('当前滚动条位置:', pos) + self.chat_window.set_scroll_bar_value(pos) def show_chat(self, message): try: @@ -62,15 +74,16 @@ class ChatInfo(QWidget): avatar = MePC().avatar if is_send else self.contact.avatar if type_ == 1: str_content = message[7] + str_time = message[8] bubble_message = BubbleMessage( - str_content, + str_time + ' ' + str_content, avatar, type_, is_send ) # print(str_content) # self.scroolAreaLayout.addWidget(bubble_message) - self.chat_window.add_message_item(bubble_message) + self.chat_window.add_message_item(bubble_message, 0) except: print(message) @@ -78,14 +91,19 @@ class ChatInfo(QWidget): class ShowChatThread(QThread): showSingal = pyqtSignal(tuple) finishSingal = pyqtSignal(int) + msg_id = 0 # heightSingal = pyqtSignal(int) def __init__(self, contact): super().__init__() + self.last_message_id = 9999999 self.wxid = contact.wxid def run(self) -> None: - messages = msg.get_message_by_num(self.wxid, 0) + messages = msg.get_message_by_num(self.wxid, self.last_message_id) + if messages: + self.last_message_id = messages[-1][0] for message in messages: self.showSingal.emit(message) + self.msg_id += 1 self.finishSingal.emit(1) From 6ca36b61b1900bc7df45aa25d4ec5614431f14f9 Mon Sep 17 00:00:00 2001 From: shuaikangzhou <863909694@qq.com> Date: Sat, 18 Nov 2023 14:41:40 +0800 Subject: [PATCH 5/8] =?UTF-8?q?=E6=96=B0=E7=89=88=E6=9C=AC=E6=9B=B4?= =?UTF-8?q?=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .idea/workspace.xml | 27 ++++++++++-------- app/components/bubble_message.py | 44 ++++++++++++++++++++++++----- app/config.py | 7 ++++- app/ui_pc/chat/chat_info.py | 38 ++++++++++++++++--------- app/ui_pc/chat/chat_window.py | 2 +- app/ui_pc/contact/contact_window.py | 2 +- app/ui_pc/mainview.py | 7 +++-- 7 files changed, 89 insertions(+), 38 deletions(-) diff --git a/.idea/workspace.xml b/.idea/workspace.xml index 8323c16..d059fc9 100644 --- a/.idea/workspace.xml +++ b/.idea/workspace.xml @@ -4,11 +4,14 @@ - @@ -678,7 +680,8 @@ - diff --git a/app/components/bubble_message.py b/app/components/bubble_message.py index 517f600..5396abd 100644 --- a/app/components/bubble_message.py +++ b/app/components/bubble_message.py @@ -1,6 +1,6 @@ from PIL import Image from PyQt5 import QtGui -from PyQt5.QtCore import QSize, pyqtSignal, Qt, QThread +from PyQt5.QtCore import QSize, pyqtSignal, Qt, QThread, QTimer from PyQt5.QtGui import QPainter, QFont, QColor, QPixmap, QPolygon from PyQt5.QtWidgets import QApplication, QWidget, QLabel, QHBoxLayout, QSizePolicy, QVBoxLayout, QSpacerItem, \ QScrollArea, QScrollBar @@ -265,9 +265,12 @@ class ChatWidget(QWidget): self.layout0.addWidget(bubble_message) else: self.layout0.insertWidget(0, bubble_message) + # self.set_scroll_bar_last() def set_scroll_bar_last(self): - self.scrollArea.verticalScrollBar().setValue(self.scrollArea.widget().height()) + self.scrollArea.verticalScrollBar().setValue( + self.scrollArea.verticalScrollBar().maximum() + ) def set_scroll_bar_value(self, val): self.verticalScrollBar().setValue(val) @@ -275,34 +278,61 @@ class ChatWidget(QWidget): def verticalScrollBar(self): return self.scrollArea.verticalScrollBar() + def update(self) -> None: + super().update() + self.scrollAreaWidgetContents.adjustSize() + self.scrollArea.update() + # self.scrollArea.repaint() + # self.verticalScrollBar().setMaximum(self.scrollAreaWidgetContents.height()) + class Test(QWidget): def __init__(self): super().__init__() layout = QVBoxLayout() self.resize(500, 600) - w1 = ChatWidget() + self.w1 = ChatWidget() bm1 = BubbleMessage( '你好啊噜啦噜啦嘞绿噜啦噜啦嘞绿绿噜啦噜啦嘞绿绿绿噜啦噜啦嘞绿绿绿绿', "D:\Project\Python\PyQt-master\QLabel\Data\\fg1.png", Type=1, ) - w1.add_message_item(bm1) + self.w1.add_message_item(bm1) + self.w1.verticalScrollBar().valueChanged.connect(self.value) for i in range(10): txt = '''在工具中单击边缘可以添加黑点,单击可以删掉黑点,拖动可以调整黑点长度。勾选等选项可以查看内容、缩放等区域右侧可预览不同拉伸情况下的效果,拖动可以调整预览的拉伸比例''' avatar = '../data/icons/default_avatar.svg' bubble_message = BubbleMessage(txt, avatar, Type=1, is_send=False) - print(bubble_message.height(), '高度') - w1.add_message_item(bubble_message, 0) + # print(bubble_message.height(), '高度') + self.w1.add_message_item(bubble_message, 0) + print('滚动条最大值', self.w1.verticalScrollBar().maximum()) w2 = QLabel("nihao") - layout.addWidget(w1) + layout.addWidget(self.w1) layout.addWidget(w2) self.setLayout(layout) + # 使用 QTimer 延迟更新滚动条 + QTimer.singleShot(0, lambda: self.w1.update()) + + print('滚动条最大值001', self.w1.verticalScrollBar().value()) + self.w1.verticalScrollBar().setValue(100) + # self.w1.update() + + def value(self, val): + print('pos:', val) + print('滚动条最大值', self.w1.verticalScrollBar().maximum()) if __name__ == '__main__': app = QApplication([]) widget = Test() + widget.w1.update() # widget = MyWidget() + widget.w1.verticalScrollBar().setValue(200) + print('滚动条最大值002', widget.w1.verticalScrollBar().maximum()) widget.show() + # QThread.sleep(2) + widget.w1.verticalScrollBar().setValue(200) + # widget.w1.verticalScrollBar().setValue(200) + # widget.w1.verticalScrollBar().setValue(200) + app.exec_() diff --git a/app/config.py b/app/config.py index 37ed164..6efe682 100644 --- a/app/config.py +++ b/app/config.py @@ -1,2 +1,7 @@ -version = '0.2.1' +version = '0.2.2' contact = '474379264' +description = [ + '1. 支持获取个人信息\n', + '2. 支持显示聊天界面\n', + '3. 支持导出scv格式的聊天记录\n', +] diff --git a/app/ui_pc/chat/chat_info.py b/app/ui_pc/chat/chat_info.py index 5cb18b2..67a82e8 100644 --- a/app/ui_pc/chat/chat_info.py +++ b/app/ui_pc/chat/chat_info.py @@ -2,13 +2,14 @@ from PyQt5.QtCore import QThread, pyqtSignal from PyQt5.QtWidgets import QWidget, QVBoxLayout, QLabel, QHBoxLayout from app.DataBase import msg -from app.components.bubble_message import BubbleMessage, ChatWidget +from app.components.bubble_message import BubbleMessage, ChatWidget, Notice from app.person import MePC class ChatInfo(QWidget): def __init__(self, contact, parent=None): super().__init__(parent) + self.last_timestamp = 0 self.last_pos = 0 self.contact = contact @@ -28,17 +29,15 @@ class ChatInfo(QWidget): self.chat_window = ChatWidget() self.chat_window.scrollArea.verticalScrollBar().valueChanged.connect(self.verticalScrollBar) self.vBoxLayout.addWidget(self.chat_window) + self.setLayout(self.vBoxLayout) def show_chats(self): self.show_chat_thread = ShowChatThread(self.contact) - self.show_chat_thread.showSingal.connect(self.show_chat) + self.show_chat_thread.showSingal.connect(self.add_message) self.show_chat_thread.finishSingal.connect(self.show_finish) self.show_chat_thread.start() def show_finish(self, ok): - # self.spacerItem = QSpacerItem(10, 10, QSizePolicy.Minimum, QSizePolicy.Expanding) - # self.scroolAreaLayout.addItem(self.spacerItem) - self.setLayout(self.vBoxLayout) self.setScrollBarPos() def verticalScrollBar(self, pos): @@ -50,8 +49,12 @@ class ChatInfo(QWidget): # print(pos) if pos > 0: return + + # 记录当前滚动条最大值 self.last_pos = self.chat_window.verticalScrollBar().maximum() - print('记录当前滚动条位置:', self.last_pos) + self.update_history_messages() + + def update_history_messages(self): self.show_chat_thread.start() def setScrollBarPos(self): @@ -60,23 +63,32 @@ class ChatInfo(QWidget): :param pos: :return: """ - print('上次滚动条位置', self.last_pos) + self.chat_window.update() + self.chat_window.show() pos = self.chat_window.verticalScrollBar().maximum() - self.last_pos - - print('当前滚动条位置:', pos) self.chat_window.set_scroll_bar_value(pos) - def show_chat(self, message): + def is_5_min(self, timestamp): + if abs(timestamp - self.last_timestamp) > 300: + self.last_timestamp = timestamp + return True + return False + + def add_message(self, message): try: type_ = message[2] + str_content = message[7] + str_time = message[8] # print(type_, type(type_)) is_send = message[4] avatar = MePC().avatar if is_send else self.contact.avatar + timestamp = message[5] if type_ == 1: - str_content = message[7] - str_time = message[8] + if self.is_5_min(timestamp): + time_message = Notice(str_time) + self.chat_window.add_message_item(time_message, 0) bubble_message = BubbleMessage( - str_time + ' ' + str_content, + str_content, avatar, type_, is_send diff --git a/app/ui_pc/chat/chat_window.py b/app/ui_pc/chat/chat_window.py index 0994855..02d4db6 100644 --- a/app/ui_pc/chat/chat_window.py +++ b/app/ui_pc/chat/chat_window.py @@ -88,7 +88,7 @@ class ChatWindow(QWidget, Ui_Form): self.stackedWidget.addWidget(chat_info_window) def setCurrentIndex(self, row): - print(row) + # print(row) self.stackedWidget.setCurrentIndex(row) def stop_loading(self, a0): diff --git a/app/ui_pc/contact/contact_window.py b/app/ui_pc/contact/contact_window.py index 302c8d5..c0d7adc 100644 --- a/app/ui_pc/contact/contact_window.py +++ b/app/ui_pc/contact/contact_window.py @@ -87,7 +87,7 @@ class ContactWindow(QWidget, Ui_Form): self.stackedWidget.addWidget(contact_info_window) def setCurrentIndex(self, row): - print(row) + # print(row) self.stackedWidget.setCurrentIndex(row) diff --git a/app/ui_pc/mainview.py b/app/ui_pc/mainview.py index 88e9967..290bb47 100644 --- a/app/ui_pc/mainview.py +++ b/app/ui_pc/mainview.py @@ -157,9 +157,9 @@ class MainWinController(QMainWindow, mainwindow.Ui_MainWindow): def loading(self, a0): self.load_num += 1 - print('加载一个了') + # print('加载一个了') if self.load_num == 2: - print('ok了') + # print('ok了') self.label.setVisible(False) def about(self): @@ -169,7 +169,8 @@ class MainWinController(QMainWindow, mainwindow.Ui_MainWindow): QMessageBox.about(self, "关于", f"版本:{config.version}\n" f"QQ交流群:{config.contact}\n" - "地址:https://github.com/LC044/WeChatMsg" + "地址:https://github.com/LC044/WeChatMsg\n" + f"新特性:\n{''.join(['*' + i for i in config.description])}" ) def close(self) -> bool: From b8704bc59f9591b5536db07113f2425644593e28 Mon Sep 17 00:00:00 2001 From: shuaikangzhou <863909694@qq.com> Date: Sat, 18 Nov 2023 14:55:41 +0800 Subject: [PATCH 6/8] update readme --- .idea/workspace.xml | 30 +++++++++++++----------------- app/DataBase/micro_msg.py | 2 +- 2 files changed, 14 insertions(+), 18 deletions(-) diff --git a/.idea/workspace.xml b/.idea/workspace.xml index d059fc9..df4ef8f 100644 --- a/.idea/workspace.xml +++ b/.idea/workspace.xml @@ -4,14 +4,10 @@ - @@ -681,7 +676,8 @@ - diff --git a/app/DataBase/micro_msg.py b/app/DataBase/micro_msg.py index 4e489af..106865e 100644 --- a/app/DataBase/micro_msg.py +++ b/app/DataBase/micro_msg.py @@ -31,7 +31,7 @@ def get_contact(): lock.acquire(True) sql = '''select UserName,Alias,Type,Remark,NickName,PYInitial,RemarkPYInitial,ContactHeadImgUrl.smallHeadImgUrl,ContactHeadImgUrl.bigHeadImgUrl from Contact inner join ContactHeadImgUrl on Contact.UserName = ContactHeadImgUrl.usrName - where Type=3 and Alias is not null + where Type%2=1 and Alias is not null order by PYInitial ''' cursor.execute(sql) From d22e30bcca8a2eea95c49bed82f0377835f28880 Mon Sep 17 00:00:00 2001 From: shuaikangzhou <863909694@qq.com> Date: Sat, 18 Nov 2023 14:55:46 +0800 Subject: [PATCH 7/8] update readme --- readme.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/readme.md b/readme.md index f9c3c9c..d9a17ce 100644 --- a/readme.md +++ b/readme.md @@ -40,6 +40,8 @@
+聊天界面 + image-20230520235113261 ![image-20230520235220104](doc/images/image-20230520235220104.png) @@ -97,6 +99,9 @@ pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple * [数据库功能介绍](./doc/数据库介绍.md) * [更多功能介绍](./doc/电脑端使用教程.md) +显示效果 +聊天界面 +
### 使用模拟器 From 954454905bdf85b3c113c4eed05a9b0e45e56ade Mon Sep 17 00:00:00 2001 From: shuaikangzhou <863909694@qq.com> Date: Sat, 18 Nov 2023 14:55:54 +0800 Subject: [PATCH 8/8] update readme --- doc/images/chat_.png | Bin 0 -> 102364 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 doc/images/chat_.png diff --git a/doc/images/chat_.png b/doc/images/chat_.png new file mode 100644 index 0000000000000000000000000000000000000000..9e3ec20f04c340f7e32df3d2b2502b9096b60e7a GIT binary patch literal 102364 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