修复部分bug

This commit is contained in:
shuaikangzhou 2023-03-31 11:15:44 +08:00
parent aeefce19b5
commit 5faa0cb1e6
14 changed files with 1079 additions and 557 deletions

59
TEST.py
View File

@ -1,25 +1,40 @@
import os import json
import openai
print("欢迎使用ChatGPT智能问答请在Q:后面输入你的问题输入quit退出") from pyecharts import options as opts
openai.api_key = '''eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCIsImtpZCI6Ik1UaEVOVUpHTkVNMVFURTRNMEZCTWpkQ05UZzVNRFUxUlRVd1FVSkRNRU13UmtGRVFrRXpSZyJ9.eyJodHRwczovL2FwaS5vcGVuYWkuY29tL3Byb2ZpbGUiOnsiZW1haWwiOiI4NjM5MDk2OTRAcXEuY29tIiwiZW1haWxfdmVyaWZpZWQiOnRydWUsImdlb2lwX2NvdW50cnkiOiJVUyJ9LCJodHRwczovL2FwaS5vcGVuYWkuY29tL2F1dGgiOnsidXNlcl9pZCI6InVzZXItdmdiMG1IeU5MQUNHRG1qRndrekVMNVM3In0sImlzcyI6Imh0dHBzOi8vYXV0aDAub3BlbmFpLmNvbS8iLCJzdWIiOiJhdXRoMHw2M2RjYmNiZWRiNzFkNmVhMzA5YmEzYzciLCJhdWQiOlsiaHR0cHM6Ly9hcGkub3BlbmFpLmNvbS92MSIsImh0dHBzOi8vb3BlbmFpLm9wZW5haS5hdXRoMGFwcC5jb20vdXNlcmluZm8iXSwiaWF0IjoxNjc1NDEyNTg2LCJleHAiOjE2NzYwMTczODYsImF6cCI6IlRkSkljYmUxNldvVEh0Tjk1bnl5d2g1RTR5T282SXRHIiwic2NvcGUiOiJvcGVuaWQgcHJvZmlsZSBlbWFpbCBtb2RlbC5yZWFkIG1vZGVsLnJlcXVlc3Qgb3JnYW5pemF0aW9uLnJlYWQgb2ZmbGluZV9hY2Nlc3MifQ.dlTy6oc0eIDIJg0AqlFdarXWh7h-n7C6id3Kv5-uOrASoYB3qtfhPMuj15yV0VOOmFyj_L7v3MCpPEnsJp08NJo1Jn32jKtCkKD-sy8DpT5rafj_B6TKNvEBsqdXgDENg0ly9KiAjS-HDlCmQoBEqg-kc2VaqlpPIfk-164WI2SCTgQb50GNKWu0jwG-lx8BHnY8gUqC7sGVx4Hg9sLHccyAL93kMu4NS-S9CsqNefYAolLbqQLPBOG9MFaTD1jvyZpuqwm3eiv7HwgHempVWAfCK9sfGBblExHRT5zi0oSGwwBGmi2EnBHjEX185RRqtuH_uKRwp47m0TcHulJsfQ''' from pyecharts.charts import Graph
start_sequence = "\nA:" with open(r'data/npmdepgraph.min10.json', 'r') as f:
restart_sequence = "\nQ: " data = json.load(f)
while True:
prompt = input(restart_sequence) nodes = [
if prompt == 'quit': {
break 'x': node['x'],
else: 'y': node['y'],
try: 'name': node['label'],
response = openai.Completion.create( 'symbolSize': node['size'],
model="text-davinci-003", # 这里我们使用的是davinci-003的模型准确度更高。 'itemStyle': {'color': node['color']}
prompt=prompt, }
temperature=1, for node in data['nodes']
max_tokens=2000, # 这里限制的是回答的长度,你可以可以限制字数,如:写一个300字作文等。 ]
frequency_penalty=0,
presence_penalty=0 edges = [
{
'source': edge['sourceID'],
'target': edge['targetID']
}
for edge in data['edges']
]
G = Graph(init_opts=opts.InitOpts(width='900', height='900'))
G.add(
series_name='',
nodes=nodes,
links=edges,
layout='none',
is_roam=True,
is_focusnode=True,
label_opts=opts.LabelOpts(is_show=True),
linestyle_opts=opts.LineStyleOpts(width=0.5, curve=0.3, opacity=0.7)
) )
print(start_sequence, response["choices"][0]["text"].strip()) G.set_global_opts(title_opts=opts.TitleOpts(title='NPM Dependencies'))
except Exception as exc: # 捕获异常后打印出来 G.render('npm_dependencies.html')
print(exc)

View File

@ -11,6 +11,7 @@ import hashlib
import os import os
import sqlite3 import sqlite3
import time import time
import requests import requests
DB = None DB = None
@ -66,6 +67,7 @@ def mkdir(path):
return True return True
mkdir(os.path.abspath('.') + '/app/DataBase')
mkdir(os.path.abspath('.') + '/app/data/emoji') mkdir(os.path.abspath('.') + '/app/data/emoji')
if os.path.exists('./app/DataBase/Msg.db'): if os.path.exists('./app/DataBase/Msg.db'):
DB = sqlite3.connect("./app/DataBase/Msg.db", check_same_thread=False) DB = sqlite3.connect("./app/DataBase/Msg.db", check_same_thread=False)
@ -96,7 +98,7 @@ def decrypt(db, key):
if os.path.exists('./app/DataBase/Msg.db'): if os.path.exists('./app/DataBase/Msg.db'):
print('/app/DataBase/Msg.db 已经存在') print('/app/DataBase/Msg.db 已经存在')
return True return True
cmd = '/sqlcipher-3.0.1/bin/sqlcipher-shell32.exe' cmd = './sqlcipher-3.0.1/bin/sqlcipher-shell32.exe'
print(os.path.abspath('.')) print(os.path.abspath('.'))
param = f""" param = f"""
PRAGMA key = '{key}'; PRAGMA key = '{key}';
@ -105,9 +107,10 @@ def decrypt(db, key):
SELECT sqlcipher_export('Msg'); SELECT sqlcipher_export('Msg');
DETACH DATABASE Msg; DETACH DATABASE Msg;
""" """
with open('./app/DataBase/config.txt', 'w') as f:
with open('./app/data/config.txt', 'w') as f:
f.write(param) f.write(param)
p = os.system(f"{os.path.abspath('.')}{cmd} {db} < ./app/DataBase/config.txt") p = os.system(f"{os.path.abspath('.')}{cmd} {db} < ./app/data/config.txt")
global DB global DB
global cursor global cursor
DB = sqlite3.connect("./app/DataBase/Msg.db", check_same_thread=False) DB = sqlite3.connect("./app/DataBase/Msg.db", check_same_thread=False)
@ -155,10 +158,12 @@ def get_conRemark(username):
sql = 'select conRemark,nickname from rcontact where username=?' sql = 'select conRemark,nickname from rcontact where username=?'
cursor.execute(sql, [username]) cursor.execute(sql, [username])
result = cursor.fetchone() result = cursor.fetchone()
if result:
if result[0]: if result[0]:
return result[0] return result[0]
else: else:
return result[1] return result[1]
return False
def get_nickname(username): def get_nickname(username):
@ -260,9 +265,14 @@ def get_emoji(imgPath):
def download_emoji(imgPath, url): def download_emoji(imgPath, url):
if not url:
return False
try:
resp = requests.get(url) resp = requests.get(url)
with open(imgPath, 'wb') as f: with open(imgPath, 'wb') as f:
f.write(resp.content) f.write(resp.content)
except:
return False
return imgPath return imgPath
@ -308,6 +318,15 @@ def recv_nums(username):
return cursor.fetchone()[0] return cursor.fetchone()[0]
def get_imgPath(imgPath):
sql = '''
select bigImgPath from ImgInfo2
where thumbImgPath = ?;
'''
cursor.execute(sql, [imgPath])
return cursor.fetchone()[0]
def get_text(username): def get_text(username):
sql = ''' sql = '''
select content from message select content from message
@ -330,7 +349,7 @@ def msg_type_num(username):
def get_msg_start_time(username): def get_msg_start_time(username):
sql = ''' sql = '''
select createTime from message select strftime('%Y-%m-%d %H:%M:%S',createTime/1000,'unixepoch','localtime') from message
where talker = ? where talker = ?
order by msgId order by msgId
limit 1 limit 1
@ -341,7 +360,7 @@ def get_msg_start_time(username):
def get_msg_end_time(username): def get_msg_end_time(username):
sql = ''' sql = '''
select createTime from message select strftime('%Y-%m-%d %H:%M:%S',createTime/1000,'unixepoch','localtime') from message
where talker = ? where talker = ?
order by msgId desc order by msgId desc
limit 1 limit 1
@ -365,6 +384,18 @@ def get_msg_by_days(username, year='2022'):
return result return result
def get_msg_by_day(username):
sql = '''
SELECT strftime('%Y-%m-%d',createTime/1000,'unixepoch','localtime') as days,count(msgId)
from message
where talker = ?
group by days
'''
cursor.execute(sql, [username])
result = cursor.fetchall()
return result
def get_msg_by_month(username, year='2022'): def get_msg_by_month(username, year='2022'):
sql = ''' sql = '''
SELECT strftime('%Y-%m',createTime/1000,'unixepoch','localtime') as days,count(msgId) SELECT strftime('%Y-%m',createTime/1000,'unixepoch','localtime') as days,count(msgId)
@ -377,6 +408,252 @@ def get_msg_by_month(username, year='2022'):
return result return result
def get_msg_by_hour(username):
sql = '''
SELECT strftime('%H:00',createTime/1000,'unixepoch','localtime') as days,count(msgId)
from message
where talker = ?
group by days
'''
cursor.execute(sql, [username])
result = cursor.fetchall()
return result
def get_sport():
sql = '''
SELECT createTime,content,strftime('%Y-%m-%d',createTime/1000,'unixepoch','localtime') as months
from message
where talker = 'gh_43f2581f6fd6'
'''
cursor.execute(sql)
result = cursor.fetchall()
return result
def get_myInfo():
sql = '''
select value from userinfo
where id = 4
'''
cursor.execute(sql)
name = cursor.fetchone()[0]
sql = '''
select value from userinfo
where id = 5
'''
cursor.execute(sql)
email = cursor.fetchone()[0]
sql = '''
select value from userinfo
where id = 6
'''
cursor.execute(sql)
tel = cursor.fetchone()[0]
sql = '''
select value from userinfo
where id = 9
'''
cursor.execute(sql)
QQ = cursor.fetchone()[0]
sql = '''
select value from userinfo
where id = 42
'''
cursor.execute(sql)
wxid = cursor.fetchone()[0]
sql = '''
select value from userinfo
where id = 12291
'''
cursor.execute(sql)
signature = cursor.fetchone()[0]
sql = '''
select value from userinfo
where id = 12292
'''
cursor.execute(sql)
city = cursor.fetchone()[0]
sql = '''
select value from userinfo
where id = 12293
'''
cursor.execute(sql)
province = cursor.fetchone()[0]
return {
'name': name,
'username': wxid,
'city': city,
'province': province,
'email': email,
'QQ': QQ,
'signature': signature,
'tel': tel,
}
from pyecharts import options as opts
from pyecharts.charts import Bar, Line, Timeline, Grid
import pandas as pd
import xmltodict
def sport(username):
sports = get_sport()
ranks = []
steps = []
date = []
for sport in sports:
try:
timestamp, content, t = sport
rank_data = xmltodict.parse(content)
sub_data = rank_data['msg']['appmsg']['hardwareinfo']['messagenodeinfo']
# print(sub_data)
my_rank = sub_data['rankinfo']['rank']['rankdisplay']
my_steps = int(sub_data['rankinfo']['score']['scoredisplay'])
# print(f'rank: {my_rank},steps: {my_steps}')
rank_view = rank_data['msg']['appmsg']['hardwareinfo']['rankview']['rankinfolist']['rankinfo']
for userinfo in rank_view:
username0 = userinfo['username']
if username0 == username:
rank_ta = int(userinfo['rank']['rankdisplay'])
steps_ta = int(userinfo['score']['scoredisplay'])
ranks.append(rank_ta)
steps.append(steps_ta)
date.append(t)
except:
continue
df = pd.DataFrame({'ranks': ranks, 'score': steps, 'date': date}, index=date)
months = pd.date_range(date[0], date[-1], freq='M')
tl = Timeline(init_opts=opts.InitOpts(width="440px", height="245px"))
tl.add_schema(is_auto_play=True)
for i in range(len(months) - 1):
da = df[(months[i + 1].strftime("%Y-%m-%d") >= df['date']) & (df['date'] > months[i].strftime("%Y-%m-%d"))]
bar = (
Bar(init_opts=opts.InitOpts(width="400px", height="235px"))
.add_xaxis(list(da['date']))
.add_yaxis(
"步数",
list(da['score']),
yaxis_index=1,
color="#d14a61",
)
.extend_axis(
yaxis=opts.AxisOpts(
name="步数",
type_="value",
# grid_index=0,
# min_=0,
# max_=250,
position="right",
axisline_opts=opts.AxisLineOpts(
linestyle_opts=opts.LineStyleOpts(color="#d14a61")
),
# axislabel_opts=opts.LabelOpts(formatter="{value} ml"),
)
)
.extend_axis(
yaxis=opts.AxisOpts(
type_="value",
name="排名",
# min_=0,
# max_=25,
position="left",
is_inverse=True,
# interval=True,
# grid_index=1,
axisline_opts=opts.AxisLineOpts(
linestyle_opts=opts.LineStyleOpts(color="#675bba")
),
# axislabel_opts=opts.LabelOpts(formatter="{value} °C"),
splitline_opts=opts.SplitLineOpts(
is_show=True, linestyle_opts=opts.LineStyleOpts(opacity=1)
),
)
)
.set_global_opts(
title_opts=opts.TitleOpts(title="{}月运动步数".format(months[i + 1].strftime("%Y-%m"))),
# legend_opts=opts.LegendOpts(is_show=False),
yaxis_opts=opts.AxisOpts(is_inverse=True)
)
.set_series_opts(
label_opts=opts.LabelOpts(
is_show=False
)
)
)
# init_opts = opts.InitOpts(width="400px", height="235px")
line = (
Line(init_opts=opts.InitOpts(width="400px", height="235px"))
.add_xaxis(list(da['date']))
.add_yaxis(
"排名",
list(da['ranks']),
yaxis_index=0,
color="#675bba",
# label_opts=opts.LabelOpts(is_show=False),
)
.set_global_opts(
yaxis_opts=opts.AxisOpts(is_inverse=True)
)
)
bar.overlap(line)
grid = Grid()
grid.add(bar, opts.GridOpts(pos_left="5%", pos_right="20%"), is_control_axis_index=True)
grid.render("grid_multi_yaxis.html")
quit()
# tl.add(bar, "{}".format(months[i].strftime("%Y-%m")))
# tl.render("./sports.html")
return {
username: {
'ranks': ranks,
'score': steps,
'date': date,
}
}
def radar_hour(username):
msg_data = get_msg_by_hour(username)
x_axis = list(map(lambda x: x[0], msg_data))
y_data = list(map(lambda x: x[1], msg_data))
print(x_axis)
print(y_data)
max_ = max(y_data)
c = (
Line()
.add_xaxis(xaxis_data=x_axis)
.add_yaxis(
series_name="聊天频率",
y_axis=y_data,
markpoint_opts=opts.MarkPointOpts(
data=[
opts.MarkPointItem(type_="max", name="最大值"),
opts.MarkPointItem(type_="min", name="最小值"),
]
),
markline_opts=opts.MarkLineOpts(
data=[opts.MarkLineItem(type_="average", name="平均值")]
),
)
.render("temperature_change_line_chart.html")
)
def chat_start_endTime(username):
start_time = get_msg_start_time(username)
end_time = get_msg_end_time(username)
year = start_time[:4]
month = start_time[5:7]
day = start_time[8:10]
hour = start_time[11:13]
minute = start_time[14:16]
second = start_time[17:]
print(year, month, day, hour, minute, second)
if __name__ == '__main__': if __name__ == '__main__':
# rconversation = get_rconversation() # rconversation = get_rconversation()
# for i in rconversation: # for i in rconversation:
@ -385,14 +662,23 @@ if __name__ == '__main__':
# for contact in contacts: # for contact in contacts:
# print(contact) # print(contact)
# [(177325,)] (73546,) (103770,) # [(177325,)] (73546,) (103770,)
print(search_send_message(1, 1)) # print(search_send_message(1, 1))
print(send_nums('wxid_vqave8lcp49r22')) # print(send_nums('wxid_vqave8lcp49r22'))
print(recv_nums('wxid_vqave8lcp49r22')) # print(recv_nums('wxid_vqave8lcp49r22'))
# for t in get_text('wxid_vqave8lcp49r22'): # # for t in get_text('wxid_vqave8lcp49r22'):
# print(t) # # print(t)
print(msg_type_num('wxid_vqave8lcp49r22')) # print(msg_type_num('wxid_vqave8lcp49r22'))
st = get_msg_start_time('wxid_vqave8lcp49r22') # st = get_msg_start_time('wxid_vqave8lcp49r22')
print(st, timestamp2str(st)) # print(st, timestamp2str(st))
st = get_msg_end_time('wxid_vqave8lcp49r22') # st = get_msg_end_time('wxid_vqave8lcp49r22')
print(st, timestamp2str(st)) # print(st, timestamp2str(st))
print(get_msg_by_month('wxid_8piw6sb4hvfm22', year='2022')) # print(get_msg_by_month('wxid_8piw6sb4hvfm22', year='2022'))
# print(len(get_sport()))
# result = sport('wxid_8piw6sb4hvfm22')
# print(get_imgPath('THUMBNAIL_DIRPATH://th_92f32326df645b3e1aecef9b6266a3b8'))
# result = get_msg_by_hour('wxid_8piw6sb4hvfm22')
# print(result)
# radar_hour('wxid_8piw6sb4hvfm22')
# print(result)
print(get_msg_start_time('wxid_8piw6sb4hvfm22'), get_msg_end_time('wxid_8piw6sb4hvfm22'))
chat_start_endTime('wxid_8piw6sb4hvfm22')

View File

@ -1,13 +1,15 @@
import os import os
import re import re
import time import time
import docx import docx
import xmltodict import xmltodict
from PyQt5.QtCore import *
from docx import shared from docx import shared
from docx.enum.table import WD_ALIGN_VERTICAL from docx.enum.table import WD_ALIGN_VERTICAL
from docx.enum.text import WD_COLOR_INDEX, WD_PARAGRAPH_ALIGNMENT from docx.enum.text import WD_COLOR_INDEX, WD_PARAGRAPH_ALIGNMENT
from docxcompose.composer import Composer from docxcompose.composer import Composer
from PyQt5.QtCore import *
from . import data from . import data
@ -301,6 +303,7 @@ class ChildThread(QThread):
:param status: :param status:
:return: :return:
''' '''
try:
pat_data = xmltodict.parse(content) pat_data = xmltodict.parse(content)
pat_data = pat_data['msg']['appmsg']['patMsg']['records']['record'] pat_data = pat_data['msg']['appmsg']['patMsg']['records']['record']
fromUser = pat_data['fromUser'] fromUser = pat_data['fromUser']
@ -311,6 +314,9 @@ class ChildThread(QThread):
template = template.replace(f'${{{fromUser}}}', data.get_conRemark(fromUser)) template = template.replace(f'${{{fromUser}}}', data.get_conRemark(fromUser))
template = template.replace(f'${{{pattedUser}}}', data.get_conRemark(pattedUser)) template = template.replace(f'${{{pattedUser}}}', data.get_conRemark(pattedUser))
print(template) print(template)
except Exception as e:
print(e)
template = '糟糕!出错了。'
p = doc.add_paragraph() p = doc.add_paragraph()
run = p.add_run(template) run = p.add_run(template)
p.paragraph_format.alignment = WD_PARAGRAPH_ALIGNMENT.CENTER p.paragraph_format.alignment = WD_PARAGRAPH_ALIGNMENT.CENTER

View File

@ -12,9 +12,10 @@ import time
import xmltodict import xmltodict
from PIL import Image from PIL import Image
from PyQt5.QtWidgets import *
from PyQt5.QtCore import * from PyQt5.QtCore import *
from PyQt5.QtGui import * from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
from .chatUi import * from .chatUi import *
from ...DataBase import data from ...DataBase import data
from ...ImageBox.ui import MainDemo from ...ImageBox.ui import MainDemo
@ -225,6 +226,7 @@ class ChatController(QWidget, Ui_Dialog):
# self.message.moveCursor(self.message.textCursor().End) # self.message.moveCursor(self.message.textCursor().End)
def pat_a_pat(self, content): def pat_a_pat(self, content):
try:
pat_data = xmltodict.parse(content) pat_data = xmltodict.parse(content)
pat_data = pat_data['msg']['appmsg']['patMsg']['records']['record'] pat_data = pat_data['msg']['appmsg']['patMsg']['records']['record']
fromUser = pat_data['fromUser'] fromUser = pat_data['fromUser']
@ -235,6 +237,10 @@ class ChatController(QWidget, Ui_Dialog):
template = template.replace(f'${{{fromUser}}}', data.get_conRemark(fromUser)) template = template.replace(f'${{{fromUser}}}', data.get_conRemark(fromUser))
template = template.replace(f'${{{pattedUser}}}', data.get_conRemark(pattedUser)) template = template.replace(f'${{{pattedUser}}}', data.get_conRemark(pattedUser))
print(template) print(template)
except Exception as e:
print(e)
template = '糟糕!出错了。'
html = ''' html = '''
<table align="center" style="vertical-align: middle;"> <table align="center" style="vertical-align: middle;">
<tbody> <tbody>
@ -258,6 +264,8 @@ class ChatController(QWidget, Ui_Dialog):
def show_emoji(self, isSend, imagePath, content): def show_emoji(self, isSend, imagePath, content):
imgPath = data.get_emoji(imagePath) imgPath = data.get_emoji(imagePath)
if not imgPath:
return False
image = Image.open(imgPath) image = Image.open(imgPath)
imagePixmap = image.size # 宽高像素 imagePixmap = image.size # 宽高像素
# 设置最大宽度 # 设置最大宽度
@ -281,12 +289,13 @@ class ChatController(QWidget, Ui_Dialog):
def show_img(self, isSend, imgPath, content): def show_img(self, isSend, imgPath, content):
'THUMBNAIL_DIRPATH://th_29cd0f0ca87652943be9ede365aabeaa' 'THUMBNAIL_DIRPATH://th_29cd0f0ca87652943be9ede365aabeaa'
imgPath = imgPath.split('th_')[1] # imgPath = imgPath.split('th_')[1]
imgPath = f'./app/data/image2/{imgPath[0:2]}/{imgPath[2:4]}/th_{imgPath}' imgPath = data.get_imgPath(imgPath)
imgPath = f'./app/data/image2/{imgPath[0:2]}/{imgPath[2:4]}/{imgPath}'
html = ''' html = '''
<td style="border: 1px #000000 solid"> <td style="border: 1px #000000 solid;" height="150">
<a href="%s" target="_blank"> <a href="%s" target="_blank" height="150">
<img herf= "baidu.com" align="right" src="%s"/> <img herf= "baidu.com" align="right" src="%s" style="max-height:100%%" height="200">
</a> </a>
</td> </td>
''' % (imgPath, imgPath) ''' % (imgPath, imgPath)

View File

@ -1,9 +1,10 @@
import sys import sys
from PyQt5.QtWebEngineWidgets import QWebEngineView
from PyQt5.QtWidgets import *
from PyQt5.QtCore import * from PyQt5.QtCore import *
from PyQt5.QtGui import * from PyQt5.QtGui import *
from PyQt5.QtWebEngineWidgets import QWebEngineView
from PyQt5.QtWidgets import *
from . import charts from . import charts
@ -14,7 +15,8 @@ class AnalysisController(QWidget):
self.setWindowTitle('数据分析') self.setWindowTitle('数据分析')
self.setWindowIcon(QIcon('./app/data/icon.png')) self.setWindowIcon(QIcon('./app/data/icon.png'))
# self.setWindowFlag(Qt.FramelessWindowHint) # self.setWindowFlag(Qt.FramelessWindowHint)
self.setStyleSheet('''QWidget{background-color:rgb(255, 255, 255);}''') # self.setStyleSheet('''QWidget{background-color:rgb(255, 255, 255);}''')
# self.setBackground()
self.resize(400, 300) self.resize(400, 300)
self.center() self.center()
self.setAttribute(Qt.WA_AttributeCount) self.setAttribute(Qt.WA_AttributeCount)
@ -40,16 +42,14 @@ class AnalysisController(QWidget):
def m_movie(self): def m_movie(self):
movie = QMovie("./app/data/bg.gif") movie = QMovie("./app/data/bg.gif")
self.label.setMovie(movie) self.label.setMovie(movie)
movie.start() movie.start()
def initUI(self): def initUI(self):
self.label.setVisible(False) self.label.setVisible(False)
main_box = QHBoxLayout(self) main_box = QHBoxLayout(self)
self.browser1 = QWebEngineView() self.browser1 = QWebEngineView()
self.browser1.load(QUrl('http://www.baidu.com')) self.browser1.load(QUrl('file:///data/聊天统计/title.html'))
# self.browser1 = QFrame(self) # self.browser1 = QFrame(self)
# self.browser1.setFrameShape(QFrame.StyledPanel) # self.browser1.setFrameShape(QFrame.StyledPanel)
# self.layoutWidget = QtWidgets.QWidget(self.browser1) # self.layoutWidget = QtWidgets.QWidget(self.browser1)
@ -67,13 +67,13 @@ class AnalysisController(QWidget):
self.browser2 = QWebEngineView() self.browser2 = QWebEngineView()
self.browser2.load(QUrl('file:///data/聊天统计/wordcloud.html')) self.browser2.load(QUrl('file:///data/聊天统计/wordcloud.html'))
self.browser3 = QWebEngineView() self.browser3 = QWebEngineView()
self.browser3.load(QUrl('http://www.baidu.com')) self.browser3.load(QUrl('file:///data/聊天统计/time.html'))
self.browser4 = QWebEngineView() self.browser4 = QWebEngineView()
self.browser4.load(QUrl('http://www.baidu.com')) self.browser4.load(QUrl('http://www.baidu.com'))
self.browser5 = QWebEngineView() self.browser5 = QWebEngineView()
self.browser5.load(QUrl('http://www.baidu.com')) self.browser5.load(QUrl('file:///data/聊天统计/chat_session.html'))
self.browser6 = QWebEngineView() self.browser6 = QWebEngineView()
self.browser6.load(QUrl('http://www.baidu.com')) self.browser6.load(QUrl('file:///data/聊天统计/sports.html'))
self.browser7 = QWebEngineView() self.browser7 = QWebEngineView()
self.browser7.load(QUrl('file:///data/聊天统计/month_num.html')) self.browser7.load(QUrl('file:///data/聊天统计/month_num.html'))
self.browser8 = QWebEngineView() self.browser8 = QWebEngineView()
@ -95,7 +95,7 @@ class AnalysisController(QWidget):
splitter1.addWidget(self.browser1) splitter1.addWidget(self.browser1)
splitter1.addWidget(splitter2) splitter1.addWidget(splitter2)
splitter1.setSizes([1, 5]) splitter1.setSizes([1, 8])
splitter2.addWidget(splitter6) splitter2.addWidget(splitter6)
splitter2.addWidget(splitter3) splitter2.addWidget(splitter3)
@ -107,10 +107,10 @@ class AnalysisController(QWidget):
splitter4.addWidget(splitter5) splitter4.addWidget(splitter5)
splitter4.addWidget(self.browser2) splitter4.addWidget(self.browser2)
splitter4.setSizes([1, 3]) splitter4.setSizes([1, 5])
splitter5.addWidget(self.browser3) splitter5.addWidget(self.browser3)
splitter5.addWidget(self.browser4) # splitter5.addWidget(self.browser4)
splitter6.addWidget(self.browser5) splitter6.addWidget(self.browser5)
splitter6.addWidget(splitter7) splitter6.addWidget(splitter7)
@ -149,11 +149,15 @@ class LoadData(QThread):
self.ta_username = ta_u self.ta_username = ta_u
def run(self): def run(self):
charts.chat_start_endTime(self.ta_username)
charts.title(self.ta_username)
charts.send_recv_rate(self.ta_username) charts.send_recv_rate(self.ta_username)
charts.message_word_cloud(self.ta_username) charts.message_word_cloud(self.ta_username)
charts.msg_type_rate(self.ta_username) charts.msg_type_rate(self.ta_username)
charts.calendar_chart(self.ta_username) charts.calendar_chart(self.ta_username)
charts.month_num(self.ta_username) charts.month_num(self.ta_username)
charts.sport(self.ta_username)
charts.chat_session(self.ta_username)
self.okSignal.emit(10) self.okSignal.emit(10)

View File

@ -1,9 +1,15 @@
import os import os
import jieba import jieba
import pandas as pd
import xmltodict
from pyecharts import options as opts from pyecharts import options as opts
from pyecharts.charts import Pie, WordCloud, Calendar, Bar from pyecharts.charts import Pie, WordCloud, Calendar, Bar, Line, Timeline, Grid
from ....DataBase import data from ....DataBase import data
# from app.DataBase import data
data.mkdir(os.path.abspath('.') + '/data/聊天统计') data.mkdir(os.path.abspath('.') + '/data/聊天统计')
Type = { Type = {
@ -34,7 +40,7 @@ def send_recv_rate(username):
total_num = send_num + recv_num total_num = send_num + recv_num
print(send_num, recv_num) print(send_num, recv_num)
c = ( c = (
Pie(init_opts=opts.InitOpts(width="460px", height="240px")) Pie(init_opts=opts.InitOpts(width="463px", height="243px"))
.add( .add(
"", "",
[ [
@ -104,7 +110,7 @@ def message_word_cloud(username):
text_data = text_data[:100] text_data = text_data[:100]
# print(text_data) # print(text_data)
( (
WordCloud(init_opts=opts.InitOpts(width="900px", height="550px")) WordCloud(init_opts=opts.InitOpts(width="900px", height="700px"))
.add(series_name="聊天文字", data_pair=text_data, word_size_range=[20, 100]) .add(series_name="聊天文字", data_pair=text_data, word_size_range=[20, 100])
.set_global_opts( .set_global_opts(
title_opts=opts.TitleOpts( title_opts=opts.TitleOpts(
@ -112,17 +118,18 @@ def message_word_cloud(username):
title_textstyle_opts=opts.TextStyleOpts(font_size=23) title_textstyle_opts=opts.TextStyleOpts(font_size=23)
), ),
tooltip_opts=opts.TooltipOpts(is_show=True), tooltip_opts=opts.TooltipOpts(is_show=True),
legend_opts=opts.LegendOpts(is_show=False)
) )
.render("./data/聊天统计/wordcloud.html") .render("./data/聊天统计/wordcloud.html")
) )
def calendar_chart(username): def calendar_chart(username):
msg_data = data.get_msg_by_days(username) msg_data = data.get_msg_by_days(username, year='2022')
min_ = min(map(lambda x: x[1], msg_data)) min_ = min(map(lambda x: x[1], msg_data))
max_ = max(map(lambda x: x[1], msg_data)) max_ = max(map(lambda x: x[1], msg_data))
c = ( c = (
Calendar(init_opts=opts.InitOpts(width="460px", height="255px")) Calendar(init_opts=opts.InitOpts(width="460px", height="270px"))
.add( .add(
"", "",
msg_data, msg_data,
@ -139,6 +146,7 @@ def calendar_chart(username):
pos_bottom="0px", pos_bottom="0px",
pos_left="0px", pos_left="0px",
), ),
legend_opts=opts.LegendOpts(is_show=False)
) )
.render("./data/聊天统计/calendar.html") .render("./data/聊天统计/calendar.html")
) )
@ -152,10 +160,9 @@ def month_num(username):
y_data = list(map(lambda x: x[1], msg_data)) y_data = list(map(lambda x: x[1], msg_data))
x_axis = list(map(lambda x: x[0], msg_data)) x_axis = list(map(lambda x: x[0], msg_data))
c = ( c = (
Bar(init_opts=opts.InitOpts(width="440px", height="245px")) Bar(init_opts=opts.InitOpts(width="440px", height="265px"))
.add_xaxis(x_axis) .add_xaxis(x_axis)
.add_yaxis("消息数量", y_data) .add_yaxis("消息数量", y_data)
# .add_yaxis("商家B", Faker.values())
.set_global_opts( .set_global_opts(
title_opts=opts.TitleOpts(title="逐月聊天统计", subtitle=None), title_opts=opts.TitleOpts(title="逐月聊天统计", subtitle=None),
datazoom_opts=opts.DataZoomOpts(), datazoom_opts=opts.DataZoomOpts(),
@ -165,5 +172,339 @@ def month_num(username):
) )
def chat_session(username):
msg_data = data.get_msg_by_hour(username)
x_axis = list(map(lambda x: x[0], msg_data))
y_data = list(map(lambda x: x[1], msg_data))
# print(x_axis)
# print(y_data)
# max_ = max(y_data)
c = (
Line(init_opts=opts.InitOpts(width="460px", height="270px"))
.add_xaxis(xaxis_data=x_axis)
.add_yaxis(
series_name="聊天频率",
y_axis=y_data,
markpoint_opts=opts.MarkPointOpts(
data=[
opts.MarkPointItem(type_="max", name="最大值"),
opts.MarkPointItem(type_="min", name="最小值", value=int(10)),
]
),
markline_opts=opts.MarkLineOpts(
data=[opts.MarkLineItem(type_="average", name="平均值")]
),
)
.set_global_opts(
title_opts=opts.TitleOpts(title="聊天时段", subtitle=None),
# datazoom_opts=opts.DataZoomOpts(),
# toolbox_opts=opts.ToolboxOpts(),
)
.set_series_opts(
label_opts=opts.LabelOpts(
is_show=False
)
)
.render("./data/聊天统计/chat_session.html")
)
def sport(username):
sports = data.get_sport()
ranks = []
steps = []
date = []
for sport in sports:
try:
timestamp, content, t = sport
rank_data = xmltodict.parse(content)
sub_data = rank_data['msg']['appmsg']['hardwareinfo']['messagenodeinfo']
# print(sub_data)
my_rank = sub_data['rankinfo']['rank']['rankdisplay']
my_steps = int(sub_data['rankinfo']['score']['scoredisplay'])
# print(f'rank: {my_rank},steps: {my_steps}')
rank_view = rank_data['msg']['appmsg']['hardwareinfo']['rankview']['rankinfolist']['rankinfo']
for userinfo in rank_view:
username0 = userinfo['username']
if username0 == username:
rank_ta = int(userinfo['rank']['rankdisplay'])
steps_ta = int(userinfo['score']['scoredisplay'])
ranks.append(rank_ta)
steps.append(steps_ta)
date.append(t)
except:
continue
df = pd.DataFrame({'ranks': ranks, 'score': steps, 'date': date}, index=date)
months = pd.date_range(date[0], date[-1], freq='M')
tl = Timeline(init_opts=opts.InitOpts(width="440px", height="265px"))
tl.add_schema(is_auto_play=True)
for i in range(len(months) - 1):
da = df[(months[i + 1].strftime("%Y-%m-%d") >= df['date']) & (df['date'] > months[i].strftime("%Y-%m-%d"))]
bar = (
Bar(init_opts=opts.InitOpts(width="440px", height="265px"))
.add_xaxis(list(da['date']))
.add_yaxis(
"步数",
list(da['score']),
yaxis_index=1,
color="#d14a61",
)
.extend_axis(
yaxis=opts.AxisOpts(
name="步数",
type_="value",
# grid_index=0,
# min_=0,
# max_=250,
position="right",
axisline_opts=opts.AxisLineOpts(
linestyle_opts=opts.LineStyleOpts(color="#d14a61")
),
# axislabel_opts=opts.LabelOpts(formatter="{value} ml"),
)
)
.extend_axis(
yaxis=opts.AxisOpts(
type_="value",
name="排名",
# min_=0,
# max_=25,
position="left",
is_inverse=True,
is_show=False,
# interval=True,
# grid_index=1,
axisline_opts=opts.AxisLineOpts(
linestyle_opts=opts.LineStyleOpts(color="#675bba")
),
# axislabel_opts=opts.LabelOpts(formatter="{value} °C"),
splitline_opts=opts.SplitLineOpts(
is_show=True, linestyle_opts=opts.LineStyleOpts(opacity=1)
),
)
)
.set_global_opts(
title_opts=opts.TitleOpts(title="{}".format(months[i + 1].strftime("%Y-%m"))),
# legend_opts=opts.LegendOpts(is_show=False),
yaxis_opts=opts.AxisOpts(is_inverse=True)
)
.set_series_opts(
label_opts=opts.LabelOpts(
is_show=False
)
)
)
# init_opts = opts.InitOpts(width="400px", height="235px")
line = (
Line(init_opts=opts.InitOpts(width="440px", height="265px"))
.add_xaxis(list(da['date']))
.add_yaxis(
"排名",
list(da['ranks']),
yaxis_index=0,
color="#675bba",
# label_opts=opts.LabelOpts(is_show=False),
)
.set_global_opts(
yaxis_opts=opts.AxisOpts(is_inverse=True)
)
.set_series_opts(
label_opts=opts.LabelOpts(
is_show=False
)
)
)
bar.overlap(line)
grid = Grid()
grid.add(bar, opts.GridOpts(pos_left="7%", pos_right="11%"), is_control_axis_index=True)
# grid.render("grid_multi_yaxis.html")
tl.add(grid, "{}".format(months[i].strftime("%Y-%m")))
tl.render("./data/聊天统计/sports.html")
return {
username: {
'ranks': ranks,
'score': steps,
'date': date,
}
}
def chat_start_endTime(username):
start_time = data.get_msg_start_time(username)
end_time = data.get_msg_end_time(username)
year = start_time[:4]
month = start_time[5:7]
day = start_time[8:10]
hour = start_time[11:13]
minute = start_time[14:16]
second = start_time[17:]
html = '''
<html>
<head>
<meta charset="UTF-8">
<title>聊天时间</title>
<style>
/* 倒计时开始 */
.gn_box {
padding: 10px 14px;
margin-bottom: 10px;
text-align: center;
background-color: #fff;
}
#t_d{
color: #982585;
font-size: 18px;
}
#t_h{
color: #8f79c1;
font-size: 18px;
}
#t_m{
color: #65b4b5;
font-size: 18px;
}
#t_s{
color: #83caa3;
font-size: 18px;
}
#text{
color: #E80017;
font-size: 18px;
}
</style>
<!--倒计时开始-->
</head>
<body>
<div class="gn_box">
<h1>
<font color="#E80017"></font><font color="#D1002E">一次</font><font color="#BA0045">聊天</font><font
color="#A3005C">发生</font><font color="#8C0073"></font>
<font color="#75008A">%s</font><font color="#5E00A1">-</font><font color="#4700B8">%s</font><font
color="#3000CF"> %s</font><font color="#1900E6">:%s</font><font color="#0200FD">:%s</font>
</h1>
<center>
<div id="CountMsg" class="HotDate">
<span id="text">距今已有</span>
<span id="t_d">626 </span>
<span id="t_h">6 </span>
<span id="t_m">26 </span>
<span id="t_s">26 </span>
</div>
</center>
</div>
<!--倒计时结束-->
<script type="text/javascript"> function getRTime() {
var EndTime = new Date('%s');
var NowTime = new Date();
var t = NowTime.getTime()-EndTime.getTime();
var d = Math.floor(t / 1000 / 60 / 60 / 24);
var h = Math.floor(t / 1000 / 60 / 60 %% 24);
var m = Math.floor(t / 1000 / 60 %% 60);
var s = Math.floor(t / 1000 %% 60);
document.getElementById("t_d").innerHTML = d + "";
document.getElementById("t_h").innerHTML = h + "";
document.getElementById("t_m").innerHTML = m + "";
document.getElementById("t_s").innerHTML = s + "";
}
setInterval(getRTime, 1000);
</script>
</body>
</html>
''' % (year, month + '-' + day, hour, minute, second, start_time)
print(year, month, day, hour, minute, second)
with open('./data/聊天统计/time.html', 'w', encoding='utf-8') as f:
f.write(html)
def title(username):
conRemark = data.get_conRemark(username)
avatar = data.get_avator(username)
html = '''
<html>
<head>
<meta charset="UTF-8">
<title>聊天时间</title>
<style>
/* 倒计时开始 */
.gn_box {
padding: 10px 14px;
margin-bottom: 10px;
text-align: center;
background-color: #fff;
}
#t_d{
color: #982585;
font-size: 18px;
}
#t_h{
color: #8f79c1;
font-size: 18px;
}
#t_m{
color: #65b4b5;
font-size: 18px;
}
#t_s{
color: #83caa3;
font-size: 18px;
}
#text{
color: #E80017;
font-size: 18px;
}
#conRemark{
color: #A3005C;
font-size: 28px;
}
#table {
width: 600px; height: 400px;//可随意
position: absolute; left: 0; top: 0; right: 0; bottom: 0;
margin: auto; /* 有了这个就自动居中了 */
}
</style>
<!--倒计时开始-->
</head>
<body>
<div class="gn_box">
<table align="center" style="margin:0px auto;">
<tr valign="middle">
<td valign="middle">
<table>
<tr>
<td>
<img src="../../../%s" height="50" width="50"
alt="Avatar"/>
</td>
</tr>
</table>
</td>
<td align="center" valign="middle">
<table>
<tr>
<td>
<font id="conRemark">%s</font>
</td>
</tr>
</table>
</td>
</tr>
</table>
<div>
<span>
</span>
<span></span>
</div>
</div>
</body>
</html>
''' % (avatar, conRemark)
print('头像地址', avatar)
with open('./data/聊天统计/title.html', 'w', encoding='utf-8') as f:
f.write(html)
if __name__ == '__main__': if __name__ == '__main__':
send_recv_rate('wxid_wt2vsktnu4z022') # send_recv_rate('wxid_wt2vsktnu4z022')
sport('wxid_wt2vsktnu4z022')

View File

@ -10,13 +10,14 @@
import hashlib import hashlib
import os import os
import time import time
import xml.etree.ElementTree as ET
from PyQt5.QtCore import *
from PyQt5.QtGui import * from PyQt5.QtGui import *
from PyQt5.QtWidgets import * from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
from . import decryptUi from . import decryptUi
from ...DataBase import data from ...DataBase import data
import xml.etree.ElementTree as ET
class DecryptControl(QWidget, decryptUi.Ui_Dialog): class DecryptControl(QWidget, decryptUi.Ui_Dialog):
@ -103,7 +104,7 @@ class DecryptControl(QWidget, decryptUi.Ui_Dialog):
print("enter clicked") print("enter clicked")
# 中间可以添加处理逻辑 # 中间可以添加处理逻辑
self.DecryptSignal.emit('ok') self.DecryptSignal.emit('ok')
self.close() # self.close()
def progressBar_view(self, value): def progressBar_view(self, value):
""" """
@ -120,7 +121,7 @@ class DecryptControl(QWidget, decryptUi.Ui_Dialog):
def btnExitClicked(self): def btnExitClicked(self):
print("Exit clicked") print("Exit clicked")
self.close() # self.close()
class DecryptThread(QThread): class DecryptThread(QThread):

View File

@ -8,13 +8,14 @@
@comment : 主窗口 @comment : 主窗口
""" """
from PyQt5.QtWidgets import *
from PyQt5.QtCore import * from PyQt5.QtCore import *
from PyQt5.QtGui import * from PyQt5.QtGui import *
from .mainviewUi import * from PyQt5.QtWidgets import *
from app.DataBase import data from app.DataBase import data
from .chat import chat from .chat import chat
from .contact import contact from .contact import contact
from .mainviewUi import *
class MainWinController(QMainWindow, Ui_Dialog): class MainWinController(QMainWindow, Ui_Dialog):
@ -31,9 +32,11 @@ class MainWinController(QMainWindow, Ui_Dialog):
self.chatView.setVisible(False) self.chatView.setVisible(False)
self.contactView = contact.ContactController(self.Me, parent=self.frame_main) self.contactView = contact.ContactController(self.Me, parent=self.frame_main)
self.contactView.setVisible(False) self.contactView.setVisible(False)
# self.myinfoView = userinfo.MyinfoController(self.Me, parent=self.frame_main)
# self.myinfoView.setVisible(False)
self.btn_chat.clicked.connect(self.chat_view) # 聊天按钮 self.btn_chat.clicked.connect(self.chat_view) # 聊天按钮
self.btn_contact.clicked.connect(self.contact_view) self.btn_contact.clicked.connect(self.contact_view)
self.btn_myinfo.clicked.connect(self.myInfo) # self.btn_myinfo.clicked.connect(self.myInfo)
self.btn_about.clicked.connect(self.about) self.btn_about.clicked.connect(self.about)
self.now_btn = self.btn_chat self.now_btn = self.btn_chat
self.btn_about.setContextMenuPolicy(Qt.CustomContextMenu) self.btn_about.setContextMenuPolicy(Qt.CustomContextMenu)
@ -105,6 +108,7 @@ class MainWinController(QMainWindow, Ui_Dialog):
self.last_btn.setStyleSheet("QPushButton {background-color: rgb(240,240,240);}" self.last_btn.setStyleSheet("QPushButton {background-color: rgb(240,240,240);}"
"QPushButton:hover{background-color: rgb(209,209,209);}\n") "QPushButton:hover{background-color: rgb(209,209,209);}\n")
self.last_btn = self.now_btn self.last_btn = self.now_btn
self.setviewVisible(self.myinfoView)
def about(self): def about(self):
""" """

View File

@ -47,18 +47,6 @@ class Ui_Dialog(object):
"QPushButton:hover{background-color: rgb(209,209,209);}") "QPushButton:hover{background-color: rgb(209,209,209);}")
self.btn_contact.setObjectName("btn_contact") self.btn_contact.setObjectName("btn_contact")
self.verticalLayout_2.addWidget(self.btn_contact) self.verticalLayout_2.addWidget(self.btn_contact)
self.btn_addC = QtWidgets.QPushButton(self.verticalLayoutWidget)
self.btn_addC.setMinimumSize(QtCore.QSize(0, 80))
self.btn_addC.setStyleSheet("QPushButton {background-color: rgb(240,240,240);}\n"
"QPushButton:hover{background-color: rgb(209,209,209);}")
self.btn_addC.setObjectName("btn_addC")
self.verticalLayout_2.addWidget(self.btn_addC)
self.btn_add_group = QtWidgets.QPushButton(self.verticalLayoutWidget)
self.btn_add_group.setMinimumSize(QtCore.QSize(0, 80))
self.btn_add_group.setStyleSheet("QPushButton {background-color: rgb(240,240,240);}\n"
"QPushButton:hover{background-color: rgb(209,209,209);}")
self.btn_add_group.setObjectName("btn_add_group")
self.verticalLayout_2.addWidget(self.btn_add_group)
self.btn_myinfo = QtWidgets.QPushButton(self.verticalLayoutWidget) self.btn_myinfo = QtWidgets.QPushButton(self.verticalLayoutWidget)
self.btn_myinfo.setMinimumSize(QtCore.QSize(100, 80)) self.btn_myinfo.setMinimumSize(QtCore.QSize(100, 80))
self.btn_myinfo.setStyleSheet("QPushButton {background-color: rgb(240,240,240);}\n" self.btn_myinfo.setStyleSheet("QPushButton {background-color: rgb(240,240,240);}\n"
@ -73,7 +61,6 @@ class Ui_Dialog(object):
self.verticalLayout_2.addWidget(self.btn_about) self.verticalLayout_2.addWidget(self.btn_about)
self.verticalLayout_2.setStretch(0, 1) self.verticalLayout_2.setStretch(0, 1)
self.verticalLayout_2.setStretch(2, 1) self.verticalLayout_2.setStretch(2, 1)
self.verticalLayout_2.setStretch(4, 1)
self.myavatar = QtWidgets.QLabel(self.frame_info) self.myavatar = QtWidgets.QLabel(self.frame_info)
self.myavatar.setGeometry(QtCore.QRect(30, 50, 100, 100)) self.myavatar.setGeometry(QtCore.QRect(30, 50, 100, 100))
self.myavatar.setObjectName("myavatar") self.myavatar.setObjectName("myavatar")
@ -92,8 +79,6 @@ class Ui_Dialog(object):
Dialog.setWindowTitle(_translate("Dialog", "Dialog")) Dialog.setWindowTitle(_translate("Dialog", "Dialog"))
self.btn_chat.setText(_translate("Dialog", "聊天")) self.btn_chat.setText(_translate("Dialog", "聊天"))
self.btn_contact.setText(_translate("Dialog", "联系人")) self.btn_contact.setText(_translate("Dialog", "联系人"))
self.btn_addC.setText(_translate("Dialog", "添加联系人"))
self.btn_add_group.setText(_translate("Dialog", "群聊"))
self.btn_myinfo.setText(_translate("Dialog", "我的")) self.btn_myinfo.setText(_translate("Dialog", "我的"))
self.btn_about.setText(_translate("Dialog", "关于")) self.btn_about.setText(_translate("Dialog", "关于"))
self.myavatar.setText(_translate("Dialog", "avatar")) self.myavatar.setText(_translate("Dialog", "avatar"))

View File

@ -62,7 +62,7 @@
<height>501</height> <height>501</height>
</rect> </rect>
</property> </property>
<layout class="QVBoxLayout" name="verticalLayout_2" stretch="1,0,1,0,1,0"> <layout class="QVBoxLayout" name="verticalLayout_2" stretch="1,0,1,0">
<property name="spacing"> <property name="spacing">
<number>0</number> <number>0</number>
</property> </property>
@ -76,7 +76,8 @@
</property> </property>
<property name="styleSheet"> <property name="styleSheet">
<string notr="true">QPushButton {background-color: rgb(240,240,240);} <string notr="true">QPushButton {background-color: rgb(240,240,240);}
QPushButton:hover{background-color: rgb(209,209,209);}</string> QPushButton:hover{background-color: rgb(209,209,209);}
</string>
</property> </property>
<property name="text"> <property name="text">
<string>聊天</string> <string>聊天</string>
@ -93,47 +94,14 @@ QPushButton:hover{background-color: rgb(209,209,209);}</string>
</property> </property>
<property name="styleSheet"> <property name="styleSheet">
<string notr="true">QPushButton {background-color: rgb(240,240,240);} <string notr="true">QPushButton {background-color: rgb(240,240,240);}
QPushButton:hover{background-color: rgb(209,209,209);}</string> QPushButton:hover{background-color: rgb(209,209,209);}
</string>
</property> </property>
<property name="text"> <property name="text">
<string>联系人</string> <string>联系人</string>
</property> </property>
</widget> </widget>
</item> </item>
<item>
<widget class="QPushButton" name="btn_addC">
<property name="minimumSize">
<size>
<width>0</width>
<height>80</height>
</size>
</property>
<property name="styleSheet">
<string notr="true">QPushButton {background-color: rgb(240,240,240);}
QPushButton:hover{background-color: rgb(209,209,209);}</string>
</property>
<property name="text">
<string>添加联系人</string>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="btn_add_group">
<property name="minimumSize">
<size>
<width>0</width>
<height>80</height>
</size>
</property>
<property name="styleSheet">
<string notr="true">QPushButton {background-color: rgb(240,240,240);}
QPushButton:hover{background-color: rgb(209,209,209);}</string>
</property>
<property name="text">
<string>群聊</string>
</property>
</widget>
</item>
<item> <item>
<widget class="QPushButton" name="btn_myinfo"> <widget class="QPushButton" name="btn_myinfo">
<property name="minimumSize"> <property name="minimumSize">
@ -144,7 +112,8 @@ QPushButton:hover{background-color: rgb(209,209,209);}</string>
</property> </property>
<property name="styleSheet"> <property name="styleSheet">
<string notr="true">QPushButton {background-color: rgb(240,240,240);} <string notr="true">QPushButton {background-color: rgb(240,240,240);}
QPushButton:hover{background-color: rgb(209,209,209);}</string> QPushButton:hover{background-color: rgb(209,209,209);}
</string>
</property> </property>
<property name="text"> <property name="text">
<string>我的</string> <string>我的</string>
@ -161,7 +130,8 @@ QPushButton:hover{background-color: rgb(209,209,209);}</string>
</property> </property>
<property name="styleSheet"> <property name="styleSheet">
<string notr="true">QPushButton {background-color: rgb(240,240,240);} <string notr="true">QPushButton {background-color: rgb(240,240,240);}
QPushButton:hover{background-color: rgb(209,209,209);}</string> QPushButton:hover{background-color: rgb(209,209,209);}
</string>
</property> </property>
<property name="text"> <property name="text">
<string>关于</string> <string>关于</string>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 18 KiB

After

Width:  |  Height:  |  Size: 910 B

17
main.py
View File

@ -1,7 +1,7 @@
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
from PyQt5.QtGui import *
import sys import sys
from PyQt5.QtWidgets import *
from app.Ui import * from app.Ui import *
@ -23,9 +23,10 @@ class ViewController:
注册界面 注册界面
:return: :return:
""" """
self.viewDecrypt = register.registerControl() # 需要将viewlogin设为成员变量 pass
self.viewDecrypt.DecryptSignal.connect(self.loadDecryptView) # self.viewDecrypt = register.registerControl() # 需要将viewlogin设为成员变量
self.viewDecrypt.show() # self.viewDecrypt.DecryptSignal.connect(self.loadDecryptView)
# self.viewDecrypt.show()
def loadMainWinView(self, username): def loadMainWinView(self, username):
""" """
@ -46,6 +47,6 @@ class ViewController:
if __name__ == '__main__': if __name__ == '__main__':
app = QApplication(sys.argv) app = QApplication(sys.argv)
view = ViewController() view = ViewController()
# view.loadDecryptView() # 进入登录界面如果viewlogin不是成员变量则离开作用域后失效。 view.loadDecryptView() # 进入登录界面如果viewlogin不是成员变量则离开作用域后失效。
view.loadMainWinView('102') # view.loadMainWinView('102')
sys.exit(app.exec_()) sys.exit(app.exec_())

View File

@ -3,7 +3,6 @@
<head> <head>
<meta charset="UTF-8"> <meta charset="UTF-8">
<title>Title</title> <title>Title</title>
</head>
<style type="text/css"> <style type="text/css">
.mobile-page .admin-reply{ .mobile-page .admin-reply{
box-shadow: 0px 0px 2px #ddd; box-shadow: 0px 0px 2px #ddd;
@ -12,24 +11,39 @@
width: 75%; width: 75%;
position: relative; position: relative;
} }
</style> </style>
</head>
<body> <body>
<div> <div>
<table align="right" style="vertical-align: middle;"> <table align="right" style="vertical-align: middle;">
<tbody> <tbody>
<tr> <tr>
<td> <td style="border: 1px #000000 solid;" height="150">
%s 13245: <a href="%s" target="_blank">
<img herf="baidu.com" align="right" src="./app/data/image2/ff/92/ff921ad247c22e77b9da5aadf2fd8a5e.jpg
" style="max-height:100%">
</a>
</td> </td>
<td></td> <td></td>
<td rowspan="2" style="border: 1px #000000 solid"> <td rowspan="2" style="border: 1px #000000 solid">
<a href="D:\Project\Python\WeChatMsg\app\data\icon.png" target="_blank"> <a href="D:\Project\Python\WeChatMsg\app\data\icon.png" target="_blank">
<img align="right" src="./app/data/avatar/2a/42/user_2a427a26f96058921da245444ab542f5.png" width="45" height="45"/> <img align="right" src="./app/data/avatar/2a/42/user_2a427a26f96058921da245444ab542f5.png"
width="45" height="45"/>
</a> </a>
</td> </td>
<td rowspan="2">ADC</td> <td rowspan="2">ADC</td>
</tr>> </tr>
>
<tr> <tr>
<td style="background-color: #9EEA6A;right: 4px;border-radius: 4px;"> <td style="background-color: #9EEA6A;right: 4px;border-radius: 4px;">
%s 13245: %s 13245:
@ -56,7 +70,6 @@
<th>英雄</th> <th>英雄</th>
<th>性别</th> <th>性别</th>
<th>职业</th> <th>职业</th>
</tr> </tr>
</thead> </thead>
<tbody> <tbody>

View File

@ -1,168 +1,55 @@
<!doctype html>
<html> <html>
<head> <head>
<meta charset="utf-8"> <meta charset="UTF-8">
<meta name="aplus-terminal" content="1"> <title>聊天时间</title>
<meta name="apple-mobile-web-app-title" content=""> <style>
<meta name="apple-mobile-web-app-capable" content="yes">
<meta name="apple-mobile-web-app-status-bar-style" content="black-translucent">
<meta name="viewport" content="width=device-width,initial-scale=1,maximum-scale=1,user-scalable=no">
<meta name="format-detection" content="telephone=no, address=no">
<title>title</title>
<style type="text/css"> <style type="text/css">
/*公共样式*/ #nav {
body,h1,h2,h3,h4,p,ul,ol,li,form,button,input,textarea,th,td { height: 40px;
margin:0; margin-top: 50px;
padding:0 background-color: #690;
} }
body,button,input,select,textarea { #nav ul {
font:12px/1.5 Microsoft YaHei UI Light,tahoma,arial,"\5b8b\4f53"; list-style: none;
*line-height:1.5; margin-left: 50px;
-ms-overflow-style:scrollbar
} }
h1,h2,h3,h4{ #nav li {
font-size:100% display: block;
}
ul,ol {
list-style:none
}
a {
text-decoration:none
}
a:hover {
text-decoration:underline
}
img {
border:0
}
button,input,select,textarea {
font-size:100%
}
table {
border-collapse:collapse;
border-spacing:0
}
/*rem*/
html {
font-size:62.5%;
}
body {
font:16px/1.5 "microsoft yahei", 'tahoma';
}
body .mobile-page {
font-size: 1.6rem;
}
/*浮动*/
.fl{
float: left; float: left;
} }
.fr{ #nav a {
float: right; line-height: 40px;
}
.clearfix:after{
content: '';
display: block; display: block;
height: 0; color: #fff;
clear: both; text-decoration: none;
visibility: hidden; padding: 0 20px;
}
#nav a:hover {
background-color: #060;
}
#menu li {
float:left; /* 往左浮动 */
} }
body{
background-color: #F5F5F5;
}
.mobile-page{
max-width: 600px;
}
.mobile-page .admin-img, .mobile-page .user-img{
width: 45px;
height: 45px;
}
i.triangle-admin,i.triangle-user{
width: 0;
height: 0;
position: absolute;
top: 10px;
display: inline-block;
border-top: 10px solid transparent;
border-bottom: 10px solid transparent;
}
.mobile-page i.triangle-admin{
left: 4px;
border-right: 12px solid #fff;
}
.mobile-page i.triangle-user{
right: 4px;
border-left: 12px solid #9EEA6A;
}
.mobile-page .admin-group, .mobile-page .user-group{
padding: 6px;
display: flex;
display: -webkit-flex;
}
.mobile-page .admin-group{
justify-content: flex-start;
-webkit-justify-content: flex-start;
}
.mobile-page .user-group{
justify-content: flex-end;
-webkit-justify-content: flex-end;
}
.mobile-page .admin-reply, .mobile-page .user-reply{
display: inline-block;
padding: 8px;
border-radius: 4px;
background-color: #fff;
margin:0 15px 12px;
}
.mobile-page .admin-reply{
box-shadow: 0px 0px 2px #ddd;
}
.mobile-page .user-reply{
text-align: left;
background-color: #9EEA6A;
box-shadow: 0px 0px 2px #bbb;
}
.mobile-page .user-msg, .mobile-page .admin-msg{
width: 75%;
position: relative;
}
.mobile-page .user-msg{
text-align: right;
}
</style> </style>
</head> </head>
<body> <body>
<div class="mobile-page">
<div class="user-group"> <div>
<div class="user-msg"> 你好
<span class="user-reply">我要抢楼</span>
<i class="triangle-user"></i>
</div>
<img class="user-img" src="http://localhost/public/img/cc.jpg"/>
</div>
<div class="admin-group">
<img class="admin-img" src="http://localhost/public/img/aa.jpg"/>
<div class="admin-msg">
<i class="triangle-admin"></i>
<span class="admin-reply">欢迎来抢楼!欢迎来抢楼!欢迎来抢楼!欢迎来抢楼!欢迎来抢楼!欢迎来抢楼!欢迎来抢楼!</span>
</div>
</div>
<div class="user-group">
<div class="user-msg">
<span class="user-reply">我要抢楼我要抢楼我要抢楼。</span>
<i class="triangle-user"></i>
</div>
<img class="user-img" src="img/cc.jpg"/>
</div>
<div class="admin-group">
<img class="admin-img" src="img/aa.jpg"/>
<div class="admin-msg">
<i class="triangle-admin"></i>
<span class="admin-reply">欢迎来抢楼!欢迎来抢楼!欢迎来抢楼!欢迎来抢楼!欢迎来抢楼!欢迎来抢楼!</span>
</div>
</div> </div>
<div>
<ul id="menu">
<li><a href="http://www.baidu.com">Baidu.Com</a></li>
<li><a href="http://www.Code52.Net">Code52.Net</a></li>
<li><a href="http://www.yahoo.com">Yahoo.com</a></li>
<li><a href="http://www.google.com" class="last">Google.com</a></li>
</ul>
</div> </div>
</body> </body>
</html> </html>