mirror of
https://github.com/LC044/WeChatMsg
synced 2025-02-21 01:52:35 +08:00
修复部分bug
This commit is contained in:
parent
aeefce19b5
commit
5faa0cb1e6
61
TEST.py
61
TEST.py
@ -1,25 +1,40 @@
|
||||
import os
|
||||
import openai
|
||||
import json
|
||||
|
||||
print("欢迎使用ChatGPT智能问答,请在Q:后面输入你的问题,输入quit退出!")
|
||||
openai.api_key = '''eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCIsImtpZCI6Ik1UaEVOVUpHTkVNMVFURTRNMEZCTWpkQ05UZzVNRFUxUlRVd1FVSkRNRU13UmtGRVFrRXpSZyJ9.eyJodHRwczovL2FwaS5vcGVuYWkuY29tL3Byb2ZpbGUiOnsiZW1haWwiOiI4NjM5MDk2OTRAcXEuY29tIiwiZW1haWxfdmVyaWZpZWQiOnRydWUsImdlb2lwX2NvdW50cnkiOiJVUyJ9LCJodHRwczovL2FwaS5vcGVuYWkuY29tL2F1dGgiOnsidXNlcl9pZCI6InVzZXItdmdiMG1IeU5MQUNHRG1qRndrekVMNVM3In0sImlzcyI6Imh0dHBzOi8vYXV0aDAub3BlbmFpLmNvbS8iLCJzdWIiOiJhdXRoMHw2M2RjYmNiZWRiNzFkNmVhMzA5YmEzYzciLCJhdWQiOlsiaHR0cHM6Ly9hcGkub3BlbmFpLmNvbS92MSIsImh0dHBzOi8vb3BlbmFpLm9wZW5haS5hdXRoMGFwcC5jb20vdXNlcmluZm8iXSwiaWF0IjoxNjc1NDEyNTg2LCJleHAiOjE2NzYwMTczODYsImF6cCI6IlRkSkljYmUxNldvVEh0Tjk1bnl5d2g1RTR5T282SXRHIiwic2NvcGUiOiJvcGVuaWQgcHJvZmlsZSBlbWFpbCBtb2RlbC5yZWFkIG1vZGVsLnJlcXVlc3Qgb3JnYW5pemF0aW9uLnJlYWQgb2ZmbGluZV9hY2Nlc3MifQ.dlTy6oc0eIDIJg0AqlFdarXWh7h-n7C6id3Kv5-uOrASoYB3qtfhPMuj15yV0VOOmFyj_L7v3MCpPEnsJp08NJo1Jn32jKtCkKD-sy8DpT5rafj_B6TKNvEBsqdXgDENg0ly9KiAjS-HDlCmQoBEqg-kc2VaqlpPIfk-164WI2SCTgQb50GNKWu0jwG-lx8BHnY8gUqC7sGVx4Hg9sLHccyAL93kMu4NS-S9CsqNefYAolLbqQLPBOG9MFaTD1jvyZpuqwm3eiv7HwgHempVWAfCK9sfGBblExHRT5zi0oSGwwBGmi2EnBHjEX185RRqtuH_uKRwp47m0TcHulJsfQ'''
|
||||
from pyecharts import options as opts
|
||||
from pyecharts.charts import Graph
|
||||
|
||||
start_sequence = "\nA:"
|
||||
restart_sequence = "\nQ: "
|
||||
while True:
|
||||
prompt = input(restart_sequence)
|
||||
if prompt == 'quit':
|
||||
break
|
||||
else:
|
||||
try:
|
||||
response = openai.Completion.create(
|
||||
model="text-davinci-003", # 这里我们使用的是davinci-003的模型,准确度更高。
|
||||
prompt=prompt,
|
||||
temperature=1,
|
||||
max_tokens=2000, # 这里限制的是回答的长度,你可以可以限制字数,如:写一个300字作文等。
|
||||
frequency_penalty=0,
|
||||
presence_penalty=0
|
||||
)
|
||||
print(start_sequence, response["choices"][0]["text"].strip())
|
||||
except Exception as exc: # 捕获异常后打印出来
|
||||
print(exc)
|
||||
with open(r'data/npmdepgraph.min10.json', 'r') as f:
|
||||
data = json.load(f)
|
||||
|
||||
nodes = [
|
||||
{
|
||||
'x': node['x'],
|
||||
'y': node['y'],
|
||||
'name': node['label'],
|
||||
'symbolSize': node['size'],
|
||||
'itemStyle': {'color': node['color']}
|
||||
}
|
||||
for node in data['nodes']
|
||||
]
|
||||
|
||||
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)
|
||||
)
|
||||
G.set_global_opts(title_opts=opts.TitleOpts(title='NPM Dependencies'))
|
||||
G.render('npm_dependencies.html')
|
||||
|
@ -11,6 +11,7 @@ import hashlib
|
||||
import os
|
||||
import sqlite3
|
||||
import time
|
||||
|
||||
import requests
|
||||
|
||||
DB = None
|
||||
@ -66,6 +67,7 @@ def mkdir(path):
|
||||
return True
|
||||
|
||||
|
||||
mkdir(os.path.abspath('.') + '/app/DataBase')
|
||||
mkdir(os.path.abspath('.') + '/app/data/emoji')
|
||||
if os.path.exists('./app/DataBase/Msg.db'):
|
||||
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'):
|
||||
print('/app/DataBase/Msg.db 已经存在')
|
||||
return True
|
||||
cmd = '/sqlcipher-3.0.1/bin/sqlcipher-shell32.exe'
|
||||
cmd = './sqlcipher-3.0.1/bin/sqlcipher-shell32.exe'
|
||||
print(os.path.abspath('.'))
|
||||
param = f"""
|
||||
PRAGMA key = '{key}';
|
||||
@ -105,9 +107,10 @@ def decrypt(db, key):
|
||||
SELECT sqlcipher_export('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)
|
||||
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 cursor
|
||||
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=?'
|
||||
cursor.execute(sql, [username])
|
||||
result = cursor.fetchone()
|
||||
if result[0]:
|
||||
return result[0]
|
||||
else:
|
||||
return result[1]
|
||||
if result:
|
||||
if result[0]:
|
||||
return result[0]
|
||||
else:
|
||||
return result[1]
|
||||
return False
|
||||
|
||||
|
||||
def get_nickname(username):
|
||||
@ -260,9 +265,14 @@ def get_emoji(imgPath):
|
||||
|
||||
|
||||
def download_emoji(imgPath, url):
|
||||
resp = requests.get(url)
|
||||
with open(imgPath, 'wb') as f:
|
||||
f.write(resp.content)
|
||||
if not url:
|
||||
return False
|
||||
try:
|
||||
resp = requests.get(url)
|
||||
with open(imgPath, 'wb') as f:
|
||||
f.write(resp.content)
|
||||
except:
|
||||
return False
|
||||
return imgPath
|
||||
|
||||
|
||||
@ -308,6 +318,15 @@ def recv_nums(username):
|
||||
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):
|
||||
sql = '''
|
||||
select content from message
|
||||
@ -330,7 +349,7 @@ def msg_type_num(username):
|
||||
|
||||
def get_msg_start_time(username):
|
||||
sql = '''
|
||||
select createTime from message
|
||||
select strftime('%Y-%m-%d %H:%M:%S',createTime/1000,'unixepoch','localtime') from message
|
||||
where talker = ?
|
||||
order by msgId
|
||||
limit 1
|
||||
@ -341,7 +360,7 @@ def get_msg_start_time(username):
|
||||
|
||||
def get_msg_end_time(username):
|
||||
sql = '''
|
||||
select createTime from message
|
||||
select strftime('%Y-%m-%d %H:%M:%S',createTime/1000,'unixepoch','localtime') from message
|
||||
where talker = ?
|
||||
order by msgId desc
|
||||
limit 1
|
||||
@ -365,6 +384,18 @@ def get_msg_by_days(username, year='2022'):
|
||||
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'):
|
||||
sql = '''
|
||||
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
|
||||
|
||||
|
||||
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__':
|
||||
# rconversation = get_rconversation()
|
||||
# for i in rconversation:
|
||||
@ -385,14 +662,23 @@ if __name__ == '__main__':
|
||||
# for contact in contacts:
|
||||
# print(contact)
|
||||
# [(177325,)] (73546,) (103770,)
|
||||
print(search_send_message(1, 1))
|
||||
print(send_nums('wxid_vqave8lcp49r22'))
|
||||
print(recv_nums('wxid_vqave8lcp49r22'))
|
||||
# for t in get_text('wxid_vqave8lcp49r22'):
|
||||
# print(t)
|
||||
print(msg_type_num('wxid_vqave8lcp49r22'))
|
||||
st = get_msg_start_time('wxid_vqave8lcp49r22')
|
||||
print(st, timestamp2str(st))
|
||||
st = get_msg_end_time('wxid_vqave8lcp49r22')
|
||||
print(st, timestamp2str(st))
|
||||
print(get_msg_by_month('wxid_8piw6sb4hvfm22', year='2022'))
|
||||
# print(search_send_message(1, 1))
|
||||
# print(send_nums('wxid_vqave8lcp49r22'))
|
||||
# print(recv_nums('wxid_vqave8lcp49r22'))
|
||||
# # for t in get_text('wxid_vqave8lcp49r22'):
|
||||
# # print(t)
|
||||
# print(msg_type_num('wxid_vqave8lcp49r22'))
|
||||
# st = get_msg_start_time('wxid_vqave8lcp49r22')
|
||||
# print(st, timestamp2str(st))
|
||||
# st = get_msg_end_time('wxid_vqave8lcp49r22')
|
||||
# print(st, timestamp2str(st))
|
||||
# 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')
|
||||
|
@ -1,13 +1,15 @@
|
||||
import os
|
||||
import re
|
||||
import time
|
||||
|
||||
import docx
|
||||
import xmltodict
|
||||
from PyQt5.QtCore import *
|
||||
from docx import shared
|
||||
from docx.enum.table import WD_ALIGN_VERTICAL
|
||||
from docx.enum.text import WD_COLOR_INDEX, WD_PARAGRAPH_ALIGNMENT
|
||||
from docxcompose.composer import Composer
|
||||
from PyQt5.QtCore import *
|
||||
|
||||
from . import data
|
||||
|
||||
|
||||
@ -79,7 +81,7 @@ class Output(QThread):
|
||||
if self.i == self.total_num:
|
||||
QThread.sleep(1)
|
||||
conRemark = data.get_conRemark(self.ta_username)
|
||||
self.progressSignal.emit(self.total_num-1)
|
||||
self.progressSignal.emit(self.total_num - 1)
|
||||
self.merge_docx(conRemark, self.n)
|
||||
print('ok')
|
||||
self.progressSignal.emit(self.total_num)
|
||||
@ -103,7 +105,7 @@ class Output(QThread):
|
||||
p = l
|
||||
len_data = messages[q:p]
|
||||
# self.to_docx(len_data, i, conRemark)
|
||||
self.Child[i] = ChildThread(self.Me, self.ta_username, len_data, conRemark,i)
|
||||
self.Child[i] = ChildThread(self.Me, self.ta_username, len_data, conRemark, i)
|
||||
self.Child[i].progressSignal.connect(self.progress)
|
||||
self.Child[i].start()
|
||||
|
||||
@ -116,7 +118,7 @@ class ChildThread(QThread):
|
||||
rangeSignal = pyqtSignal(int)
|
||||
i = 1
|
||||
|
||||
def __init__(self, Me, ta_u, message, conRemark,num, parent=None):
|
||||
def __init__(self, Me, ta_u, message, conRemark, num, parent=None):
|
||||
super().__init__(parent)
|
||||
self.Me = Me
|
||||
self.sec = 2 # 默认1000秒
|
||||
@ -301,16 +303,20 @@ class ChildThread(QThread):
|
||||
:param status:
|
||||
:return:
|
||||
'''
|
||||
pat_data = xmltodict.parse(content)
|
||||
pat_data = pat_data['msg']['appmsg']['patMsg']['records']['record']
|
||||
fromUser = pat_data['fromUser']
|
||||
pattedUser = pat_data['pattedUser']
|
||||
template = pat_data['template']
|
||||
template = ''.join(template.split('${pattedusername@textstatusicon}'))
|
||||
template = ''.join(template.split('${fromusername@textstatusicon}'))
|
||||
template = template.replace(f'${{{fromUser}}}', data.get_conRemark(fromUser))
|
||||
template = template.replace(f'${{{pattedUser}}}', data.get_conRemark(pattedUser))
|
||||
print(template)
|
||||
try:
|
||||
pat_data = xmltodict.parse(content)
|
||||
pat_data = pat_data['msg']['appmsg']['patMsg']['records']['record']
|
||||
fromUser = pat_data['fromUser']
|
||||
pattedUser = pat_data['pattedUser']
|
||||
template = pat_data['template']
|
||||
template = ''.join(template.split('${pattedusername@textstatusicon}'))
|
||||
template = ''.join(template.split('${fromusername@textstatusicon}'))
|
||||
template = template.replace(f'${{{fromUser}}}', data.get_conRemark(fromUser))
|
||||
template = template.replace(f'${{{pattedUser}}}', data.get_conRemark(pattedUser))
|
||||
print(template)
|
||||
except Exception as e:
|
||||
print(e)
|
||||
template = '糟糕!出错了。'
|
||||
p = doc.add_paragraph()
|
||||
run = p.add_run(template)
|
||||
p.paragraph_format.alignment = WD_PARAGRAPH_ALIGNMENT.CENTER
|
||||
|
@ -12,9 +12,10 @@ import time
|
||||
|
||||
import xmltodict
|
||||
from PIL import Image
|
||||
from PyQt5.QtWidgets import *
|
||||
from PyQt5.QtCore import *
|
||||
from PyQt5.QtGui import *
|
||||
from PyQt5.QtWidgets import *
|
||||
|
||||
from .chatUi import *
|
||||
from ...DataBase import data
|
||||
from ...ImageBox.ui import MainDemo
|
||||
@ -225,16 +226,21 @@ class ChatController(QWidget, Ui_Dialog):
|
||||
# self.message.moveCursor(self.message.textCursor().End)
|
||||
|
||||
def pat_a_pat(self, content):
|
||||
pat_data = xmltodict.parse(content)
|
||||
pat_data = pat_data['msg']['appmsg']['patMsg']['records']['record']
|
||||
fromUser = pat_data['fromUser']
|
||||
pattedUser = pat_data['pattedUser']
|
||||
template = pat_data['template']
|
||||
template = ''.join(template.split('${pattedusername@textstatusicon}'))
|
||||
template = ''.join(template.split('${fromusername@textstatusicon}'))
|
||||
template = template.replace(f'${{{fromUser}}}', data.get_conRemark(fromUser))
|
||||
template = template.replace(f'${{{pattedUser}}}', data.get_conRemark(pattedUser))
|
||||
print(template)
|
||||
try:
|
||||
pat_data = xmltodict.parse(content)
|
||||
pat_data = pat_data['msg']['appmsg']['patMsg']['records']['record']
|
||||
fromUser = pat_data['fromUser']
|
||||
pattedUser = pat_data['pattedUser']
|
||||
template = pat_data['template']
|
||||
template = ''.join(template.split('${pattedusername@textstatusicon}'))
|
||||
template = ''.join(template.split('${fromusername@textstatusicon}'))
|
||||
template = template.replace(f'${{{fromUser}}}', data.get_conRemark(fromUser))
|
||||
template = template.replace(f'${{{pattedUser}}}', data.get_conRemark(pattedUser))
|
||||
print(template)
|
||||
except Exception as e:
|
||||
print(e)
|
||||
template = '糟糕!出错了。'
|
||||
|
||||
html = '''
|
||||
<table align="center" style="vertical-align: middle;">
|
||||
<tbody>
|
||||
@ -258,6 +264,8 @@ class ChatController(QWidget, Ui_Dialog):
|
||||
|
||||
def show_emoji(self, isSend, imagePath, content):
|
||||
imgPath = data.get_emoji(imagePath)
|
||||
if not imgPath:
|
||||
return False
|
||||
image = Image.open(imgPath)
|
||||
imagePixmap = image.size # 宽高像素
|
||||
# 设置最大宽度
|
||||
@ -281,12 +289,13 @@ class ChatController(QWidget, Ui_Dialog):
|
||||
|
||||
def show_img(self, isSend, imgPath, content):
|
||||
'THUMBNAIL_DIRPATH://th_29cd0f0ca87652943be9ede365aabeaa'
|
||||
imgPath = imgPath.split('th_')[1]
|
||||
imgPath = f'./app/data/image2/{imgPath[0:2]}/{imgPath[2:4]}/th_{imgPath}'
|
||||
# imgPath = imgPath.split('th_')[1]
|
||||
imgPath = data.get_imgPath(imgPath)
|
||||
imgPath = f'./app/data/image2/{imgPath[0:2]}/{imgPath[2:4]}/{imgPath}'
|
||||
html = '''
|
||||
<td style="border: 1px #000000 solid">
|
||||
<a href="%s" target="_blank">
|
||||
<img herf= "baidu.com" align="right" src="%s"/>
|
||||
<td style="border: 1px #000000 solid;" height="150">
|
||||
<a href="%s" target="_blank" height="150">
|
||||
<img herf= "baidu.com" align="right" src="%s" style="max-height:100%%" height="200">
|
||||
</a>
|
||||
</td>
|
||||
''' % (imgPath, imgPath)
|
||||
|
@ -1,9 +1,10 @@
|
||||
import sys
|
||||
|
||||
from PyQt5.QtWebEngineWidgets import QWebEngineView
|
||||
from PyQt5.QtWidgets import *
|
||||
from PyQt5.QtCore import *
|
||||
from PyQt5.QtGui import *
|
||||
from PyQt5.QtWebEngineWidgets import QWebEngineView
|
||||
from PyQt5.QtWidgets import *
|
||||
|
||||
from . import charts
|
||||
|
||||
|
||||
@ -14,7 +15,8 @@ class AnalysisController(QWidget):
|
||||
self.setWindowTitle('数据分析')
|
||||
self.setWindowIcon(QIcon('./app/data/icon.png'))
|
||||
# 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.center()
|
||||
self.setAttribute(Qt.WA_AttributeCount)
|
||||
@ -40,16 +42,14 @@ class AnalysisController(QWidget):
|
||||
|
||||
def m_movie(self):
|
||||
movie = QMovie("./app/data/bg.gif")
|
||||
|
||||
self.label.setMovie(movie)
|
||||
|
||||
movie.start()
|
||||
|
||||
def initUI(self):
|
||||
self.label.setVisible(False)
|
||||
main_box = QHBoxLayout(self)
|
||||
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.setFrameShape(QFrame.StyledPanel)
|
||||
# self.layoutWidget = QtWidgets.QWidget(self.browser1)
|
||||
@ -67,13 +67,13 @@ class AnalysisController(QWidget):
|
||||
self.browser2 = QWebEngineView()
|
||||
self.browser2.load(QUrl('file:///data/聊天统计/wordcloud.html'))
|
||||
self.browser3 = QWebEngineView()
|
||||
self.browser3.load(QUrl('http://www.baidu.com'))
|
||||
self.browser3.load(QUrl('file:///data/聊天统计/time.html'))
|
||||
self.browser4 = QWebEngineView()
|
||||
self.browser4.load(QUrl('http://www.baidu.com'))
|
||||
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.load(QUrl('http://www.baidu.com'))
|
||||
self.browser6.load(QUrl('file:///data/聊天统计/sports.html'))
|
||||
self.browser7 = QWebEngineView()
|
||||
self.browser7.load(QUrl('file:///data/聊天统计/month_num.html'))
|
||||
self.browser8 = QWebEngineView()
|
||||
@ -95,7 +95,7 @@ class AnalysisController(QWidget):
|
||||
|
||||
splitter1.addWidget(self.browser1)
|
||||
splitter1.addWidget(splitter2)
|
||||
splitter1.setSizes([1, 5])
|
||||
splitter1.setSizes([1, 8])
|
||||
|
||||
splitter2.addWidget(splitter6)
|
||||
splitter2.addWidget(splitter3)
|
||||
@ -107,10 +107,10 @@ class AnalysisController(QWidget):
|
||||
|
||||
splitter4.addWidget(splitter5)
|
||||
splitter4.addWidget(self.browser2)
|
||||
splitter4.setSizes([1, 3])
|
||||
splitter4.setSizes([1, 5])
|
||||
|
||||
splitter5.addWidget(self.browser3)
|
||||
splitter5.addWidget(self.browser4)
|
||||
# splitter5.addWidget(self.browser4)
|
||||
|
||||
splitter6.addWidget(self.browser5)
|
||||
splitter6.addWidget(splitter7)
|
||||
@ -144,16 +144,20 @@ class LoadData(QThread):
|
||||
"""
|
||||
okSignal = pyqtSignal(int)
|
||||
|
||||
def __init__(self,ta_u, parent=None):
|
||||
def __init__(self, ta_u, parent=None):
|
||||
super().__init__(parent)
|
||||
self.ta_username = ta_u
|
||||
|
||||
def run(self):
|
||||
charts.chat_start_endTime(self.ta_username)
|
||||
charts.title(self.ta_username)
|
||||
charts.send_recv_rate(self.ta_username)
|
||||
charts.message_word_cloud(self.ta_username)
|
||||
charts.msg_type_rate(self.ta_username)
|
||||
charts.calendar_chart(self.ta_username)
|
||||
charts.month_num(self.ta_username)
|
||||
charts.sport(self.ta_username)
|
||||
charts.chat_session(self.ta_username)
|
||||
self.okSignal.emit(10)
|
||||
|
||||
|
||||
|
@ -1,9 +1,15 @@
|
||||
import os
|
||||
|
||||
import jieba
|
||||
import pandas as pd
|
||||
import xmltodict
|
||||
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 app.DataBase import data
|
||||
|
||||
data.mkdir(os.path.abspath('.') + '/data/聊天统计')
|
||||
|
||||
Type = {
|
||||
@ -34,7 +40,7 @@ def send_recv_rate(username):
|
||||
total_num = send_num + recv_num
|
||||
print(send_num, recv_num)
|
||||
c = (
|
||||
Pie(init_opts=opts.InitOpts(width="460px", height="240px"))
|
||||
Pie(init_opts=opts.InitOpts(width="463px", height="243px"))
|
||||
.add(
|
||||
"",
|
||||
[
|
||||
@ -43,7 +49,7 @@ def send_recv_rate(username):
|
||||
center=["40%", "50%"],
|
||||
)
|
||||
.set_global_opts(
|
||||
title_opts=opts.TitleOpts(title=f"信息发送接收",subtitle=f"总计:{total_num}条消息", pos_bottom="0%"),
|
||||
title_opts=opts.TitleOpts(title=f"信息发送接收", subtitle=f"总计:{total_num}条消息", pos_bottom="0%"),
|
||||
legend_opts=opts.LegendOpts(type_="scroll", pos_left="80%", orient="vertical"),
|
||||
)
|
||||
.set_series_opts(
|
||||
@ -104,7 +110,7 @@ def message_word_cloud(username):
|
||||
text_data = text_data[:100]
|
||||
# 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])
|
||||
.set_global_opts(
|
||||
title_opts=opts.TitleOpts(
|
||||
@ -112,17 +118,18 @@ def message_word_cloud(username):
|
||||
title_textstyle_opts=opts.TextStyleOpts(font_size=23)
|
||||
),
|
||||
tooltip_opts=opts.TooltipOpts(is_show=True),
|
||||
legend_opts=opts.LegendOpts(is_show=False)
|
||||
)
|
||||
.render("./data/聊天统计/wordcloud.html")
|
||||
)
|
||||
|
||||
|
||||
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))
|
||||
max_ = max(map(lambda x: x[1], msg_data))
|
||||
c = (
|
||||
Calendar(init_opts=opts.InitOpts(width="460px", height="255px"))
|
||||
Calendar(init_opts=opts.InitOpts(width="460px", height="270px"))
|
||||
.add(
|
||||
"",
|
||||
msg_data,
|
||||
@ -139,6 +146,7 @@ def calendar_chart(username):
|
||||
pos_bottom="0px",
|
||||
pos_left="0px",
|
||||
),
|
||||
legend_opts=opts.LegendOpts(is_show=False)
|
||||
)
|
||||
.render("./data/聊天统计/calendar.html")
|
||||
)
|
||||
@ -152,10 +160,9 @@ def month_num(username):
|
||||
y_data = list(map(lambda x: x[1], msg_data))
|
||||
x_axis = list(map(lambda x: x[0], msg_data))
|
||||
c = (
|
||||
Bar(init_opts=opts.InitOpts(width="440px", height="245px"))
|
||||
Bar(init_opts=opts.InitOpts(width="440px", height="265px"))
|
||||
.add_xaxis(x_axis)
|
||||
.add_yaxis("消息数量", y_data)
|
||||
# .add_yaxis("商家B", Faker.values())
|
||||
.set_global_opts(
|
||||
title_opts=opts.TitleOpts(title="逐月聊天统计", subtitle=None),
|
||||
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__':
|
||||
send_recv_rate('wxid_wt2vsktnu4z022')
|
||||
# send_recv_rate('wxid_wt2vsktnu4z022')
|
||||
sport('wxid_wt2vsktnu4z022')
|
||||
|
@ -10,13 +10,14 @@
|
||||
import hashlib
|
||||
import os
|
||||
import time
|
||||
import xml.etree.ElementTree as ET
|
||||
|
||||
from PyQt5.QtCore import *
|
||||
from PyQt5.QtGui import *
|
||||
from PyQt5.QtWidgets import *
|
||||
from PyQt5.QtCore import *
|
||||
|
||||
from . import decryptUi
|
||||
from ...DataBase import data
|
||||
import xml.etree.ElementTree as ET
|
||||
|
||||
|
||||
class DecryptControl(QWidget, decryptUi.Ui_Dialog):
|
||||
@ -103,7 +104,7 @@ class DecryptControl(QWidget, decryptUi.Ui_Dialog):
|
||||
print("enter clicked")
|
||||
# 中间可以添加处理逻辑
|
||||
self.DecryptSignal.emit('ok')
|
||||
self.close()
|
||||
# self.close()
|
||||
|
||||
def progressBar_view(self, value):
|
||||
"""
|
||||
@ -120,7 +121,7 @@ class DecryptControl(QWidget, decryptUi.Ui_Dialog):
|
||||
|
||||
def btnExitClicked(self):
|
||||
print("Exit clicked")
|
||||
self.close()
|
||||
# self.close()
|
||||
|
||||
|
||||
class DecryptThread(QThread):
|
||||
|
@ -8,13 +8,14 @@
|
||||
@comment : 主窗口
|
||||
"""
|
||||
|
||||
from PyQt5.QtWidgets import *
|
||||
from PyQt5.QtCore import *
|
||||
from PyQt5.QtGui import *
|
||||
from .mainviewUi import *
|
||||
from PyQt5.QtWidgets import *
|
||||
|
||||
from app.DataBase import data
|
||||
from .chat import chat
|
||||
from .contact import contact
|
||||
from .mainviewUi import *
|
||||
|
||||
|
||||
class MainWinController(QMainWindow, Ui_Dialog):
|
||||
@ -31,9 +32,11 @@ class MainWinController(QMainWindow, Ui_Dialog):
|
||||
self.chatView.setVisible(False)
|
||||
self.contactView = contact.ContactController(self.Me, parent=self.frame_main)
|
||||
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_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.now_btn = self.btn_chat
|
||||
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);}"
|
||||
"QPushButton:hover{background-color: rgb(209,209,209);}\n")
|
||||
self.last_btn = self.now_btn
|
||||
self.setviewVisible(self.myinfoView)
|
||||
|
||||
def about(self):
|
||||
"""
|
||||
|
@ -47,18 +47,6 @@ class Ui_Dialog(object):
|
||||
"QPushButton:hover{background-color: rgb(209,209,209);}")
|
||||
self.btn_contact.setObjectName("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.setMinimumSize(QtCore.QSize(100, 80))
|
||||
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.setStretch(0, 1)
|
||||
self.verticalLayout_2.setStretch(2, 1)
|
||||
self.verticalLayout_2.setStretch(4, 1)
|
||||
self.myavatar = QtWidgets.QLabel(self.frame_info)
|
||||
self.myavatar.setGeometry(QtCore.QRect(30, 50, 100, 100))
|
||||
self.myavatar.setObjectName("myavatar")
|
||||
@ -92,8 +79,6 @@ class Ui_Dialog(object):
|
||||
Dialog.setWindowTitle(_translate("Dialog", "Dialog"))
|
||||
self.btn_chat.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_about.setText(_translate("Dialog", "关于"))
|
||||
self.myavatar.setText(_translate("Dialog", "avatar"))
|
||||
|
@ -1,216 +1,186 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<ui version="4.0">
|
||||
<class>Dialog</class>
|
||||
<widget class="QDialog" name="Dialog">
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>1280</width>
|
||||
<height>720</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="cursor">
|
||||
<cursorShape>ArrowCursor</cursorShape>
|
||||
</property>
|
||||
<property name="windowTitle">
|
||||
<string>Dialog</string>
|
||||
</property>
|
||||
<property name="autoFillBackground">
|
||||
<bool>false</bool>
|
||||
</property>
|
||||
<widget class="QFrame" name="frame_main">
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>160</x>
|
||||
<y>0</y>
|
||||
<width>1120</width>
|
||||
<height>720</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="frameShape">
|
||||
<enum>QFrame::StyledPanel</enum>
|
||||
</property>
|
||||
<property name="frameShadow">
|
||||
<enum>QFrame::Raised</enum>
|
||||
</property>
|
||||
</widget>
|
||||
<widget class="QFrame" name="frame_info">
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>161</width>
|
||||
<height>721</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="styleSheet">
|
||||
<string notr="true">background-color:rgb(240,240,240)</string>
|
||||
</property>
|
||||
<property name="frameShape">
|
||||
<enum>QFrame::StyledPanel</enum>
|
||||
</property>
|
||||
<property name="frameShadow">
|
||||
<enum>QFrame::Sunken</enum>
|
||||
</property>
|
||||
<widget class="QWidget" name="verticalLayoutWidget">
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>20</x>
|
||||
<y>190</y>
|
||||
<width>111</width>
|
||||
<height>501</height>
|
||||
</rect>
|
||||
</property>
|
||||
<layout class="QVBoxLayout" name="verticalLayout_2" stretch="1,0,1,0,1,0">
|
||||
<property name="spacing">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<item>
|
||||
<widget class="QPushButton" name="btn_chat">
|
||||
<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_contact">
|
||||
<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_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>
|
||||
<widget class="QPushButton" name="btn_myinfo">
|
||||
<property name="minimumSize">
|
||||
<size>
|
||||
<width>100</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_about">
|
||||
<property name="minimumSize">
|
||||
<size>
|
||||
<width>100</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>
|
||||
</layout>
|
||||
</widget>
|
||||
<widget class="QLabel" name="myavatar">
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>30</x>
|
||||
<y>50</y>
|
||||
<width>100</width>
|
||||
<height>100</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>avatar</string>
|
||||
</property>
|
||||
</widget>
|
||||
<widget class="QPushButton" name="sign_up">
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>71</width>
|
||||
<height>28</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>退出登录</string>
|
||||
</property>
|
||||
</widget>
|
||||
<widget class="QPushButton" name="btn_destroy">
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>80</x>
|
||||
<y>0</y>
|
||||
<width>71</width>
|
||||
<height>28</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>注销账户</string>
|
||||
</property>
|
||||
</widget>
|
||||
</widget>
|
||||
</widget>
|
||||
<resources/>
|
||||
<connections/>
|
||||
<class>Dialog</class>
|
||||
<widget class="QDialog" name="Dialog">
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>1280</width>
|
||||
<height>720</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="cursor">
|
||||
<cursorShape>ArrowCursor</cursorShape>
|
||||
</property>
|
||||
<property name="windowTitle">
|
||||
<string>Dialog</string>
|
||||
</property>
|
||||
<property name="autoFillBackground">
|
||||
<bool>false</bool>
|
||||
</property>
|
||||
<widget class="QFrame" name="frame_main">
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>160</x>
|
||||
<y>0</y>
|
||||
<width>1120</width>
|
||||
<height>720</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="frameShape">
|
||||
<enum>QFrame::StyledPanel</enum>
|
||||
</property>
|
||||
<property name="frameShadow">
|
||||
<enum>QFrame::Raised</enum>
|
||||
</property>
|
||||
</widget>
|
||||
<widget class="QFrame" name="frame_info">
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>161</width>
|
||||
<height>721</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="styleSheet">
|
||||
<string notr="true">background-color:rgb(240,240,240)</string>
|
||||
</property>
|
||||
<property name="frameShape">
|
||||
<enum>QFrame::StyledPanel</enum>
|
||||
</property>
|
||||
<property name="frameShadow">
|
||||
<enum>QFrame::Sunken</enum>
|
||||
</property>
|
||||
<widget class="QWidget" name="verticalLayoutWidget">
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>20</x>
|
||||
<y>190</y>
|
||||
<width>111</width>
|
||||
<height>501</height>
|
||||
</rect>
|
||||
</property>
|
||||
<layout class="QVBoxLayout" name="verticalLayout_2" stretch="1,0,1,0">
|
||||
<property name="spacing">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<item>
|
||||
<widget class="QPushButton" name="btn_chat">
|
||||
<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_contact">
|
||||
<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_myinfo">
|
||||
<property name="minimumSize">
|
||||
<size>
|
||||
<width>100</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_about">
|
||||
<property name="minimumSize">
|
||||
<size>
|
||||
<width>100</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>
|
||||
</layout>
|
||||
</widget>
|
||||
<widget class="QLabel" name="myavatar">
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>30</x>
|
||||
<y>50</y>
|
||||
<width>100</width>
|
||||
<height>100</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>avatar</string>
|
||||
</property>
|
||||
</widget>
|
||||
<widget class="QPushButton" name="sign_up">
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>71</width>
|
||||
<height>28</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>退出登录</string>
|
||||
</property>
|
||||
</widget>
|
||||
<widget class="QPushButton" name="btn_destroy">
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>80</x>
|
||||
<y>0</y>
|
||||
<width>71</width>
|
||||
<height>28</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>注销账户</string>
|
||||
</property>
|
||||
</widget>
|
||||
</widget>
|
||||
</widget>
|
||||
<resources/>
|
||||
<connections/>
|
||||
</ui>
|
||||
|
Binary file not shown.
Before Width: | Height: | Size: 18 KiB After Width: | Height: | Size: 910 B |
17
main.py
17
main.py
@ -1,7 +1,7 @@
|
||||
from PyQt5.QtWidgets import *
|
||||
from PyQt5.QtCore import *
|
||||
from PyQt5.QtGui import *
|
||||
import sys
|
||||
|
||||
from PyQt5.QtWidgets import *
|
||||
|
||||
from app.Ui import *
|
||||
|
||||
|
||||
@ -23,9 +23,10 @@ class ViewController:
|
||||
注册界面
|
||||
:return:
|
||||
"""
|
||||
self.viewDecrypt = register.registerControl() # 需要将viewlogin设为成员变量
|
||||
self.viewDecrypt.DecryptSignal.connect(self.loadDecryptView)
|
||||
self.viewDecrypt.show()
|
||||
pass
|
||||
# self.viewDecrypt = register.registerControl() # 需要将viewlogin设为成员变量
|
||||
# self.viewDecrypt.DecryptSignal.connect(self.loadDecryptView)
|
||||
# self.viewDecrypt.show()
|
||||
|
||||
def loadMainWinView(self, username):
|
||||
"""
|
||||
@ -46,6 +47,6 @@ class ViewController:
|
||||
if __name__ == '__main__':
|
||||
app = QApplication(sys.argv)
|
||||
view = ViewController()
|
||||
# view.loadDecryptView() # 进入登录界面,如果viewlogin不是成员变量,则离开作用域后失效。
|
||||
view.loadMainWinView('102')
|
||||
view.loadDecryptView() # 进入登录界面,如果viewlogin不是成员变量,则离开作用域后失效。
|
||||
# view.loadMainWinView('102')
|
||||
sys.exit(app.exec_())
|
||||
|
129
test.html
129
test.html
@ -3,8 +3,7 @@
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<title>Title</title>
|
||||
</head>
|
||||
<style type="text/css">
|
||||
<style type="text/css">
|
||||
.mobile-page .admin-reply{
|
||||
box-shadow: 0px 0px 2px #ddd;
|
||||
}
|
||||
@ -12,70 +11,84 @@
|
||||
width: 75%;
|
||||
position: relative;
|
||||
}
|
||||
</style>
|
||||
<body>
|
||||
<div>
|
||||
<table align="right" style="vertical-align: middle;">
|
||||
<tbody>
|
||||
<tr>
|
||||
<td>
|
||||
%s 13245:
|
||||
</td>
|
||||
<td></td>
|
||||
<td rowspan="2" style="border: 1px #000000 solid">
|
||||
<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"/>
|
||||
</a>
|
||||
|
||||
</td>
|
||||
<td rowspan="2">ADC</td>
|
||||
</tr>>
|
||||
<tr>
|
||||
<td style="background-color: #9EEA6A;right: 4px;border-radius: 4px;">
|
||||
%s 13245:
|
||||
</td>
|
||||
<td width="55" style=""> </td>
|
||||
<!-- <td style="border: 1px #000000 solid"><img align="right" src="./app/data/avatar/2a/42/user_2a427a26f96058921da245444ab542f5.png" width="45" height="45"/></td>-->
|
||||
<td width="15"></td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
</style>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<div>
|
||||
<table align="right" style="vertical-align: middle;">
|
||||
<tbody>
|
||||
<tr>
|
||||
<td style="border: 1px #000000 solid;" height="150">
|
||||
<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 rowspan="2" style="border: 1px #000000 solid">
|
||||
<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"/>
|
||||
</a>
|
||||
|
||||
</td>
|
||||
<td rowspan="2">ADC</td>
|
||||
</tr>
|
||||
>
|
||||
<tr>
|
||||
<td style="background-color: #9EEA6A;right: 4px;border-radius: 4px;">
|
||||
%s 13245:
|
||||
</td>
|
||||
<td width="55" style=""></td>
|
||||
<!-- <td style="border: 1px #000000 solid"><img align="right" src="./app/data/avatar/2a/42/user_2a427a26f96058921da245444ab542f5.png" width="45" height="45"/></td>-->
|
||||
<td width="15"></td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</body>
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<title>Document</title>
|
||||
<meta charset="UTF-8">
|
||||
<title>Document</title>
|
||||
</head>
|
||||
<body>
|
||||
<table height="300" width="300" border="1" >
|
||||
<caption>我是标题</caption>
|
||||
<thead>
|
||||
<tr>
|
||||
<th>英雄</th>
|
||||
<th>性别</th>
|
||||
<th>职业</th>
|
||||
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td>亚索</td>
|
||||
<td>男</td>
|
||||
<td >中单</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>卡莎</td>
|
||||
<td>女</td>
|
||||
<td rowspan="2">ADC</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>寒冰</td>
|
||||
<td>女</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
<table height="300" width="300" border="1">
|
||||
<caption>我是标题</caption>
|
||||
<thead>
|
||||
<tr>
|
||||
<th>英雄</th>
|
||||
<th>性别</th>
|
||||
<th>职业</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td>亚索</td>
|
||||
<td>男</td>
|
||||
<td>中单</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>卡莎</td>
|
||||
<td>女</td>
|
||||
<td rowspan="2">ADC</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>寒冰</td>
|
||||
<td>女</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
|
203
wechat.html
203
wechat.html
@ -1,168 +1,55 @@
|
||||
<!doctype html>
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<meta name="aplus-terminal" content="1">
|
||||
<meta name="apple-mobile-web-app-title" content="">
|
||||
<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>
|
||||
<meta charset="UTF-8">
|
||||
<title>聊天时间</title>
|
||||
<style>
|
||||
<style type="text/css">
|
||||
/*公共样式*/
|
||||
body,h1,h2,h3,h4,p,ul,ol,li,form,button,input,textarea,th,td {
|
||||
margin:0;
|
||||
padding:0
|
||||
}
|
||||
body,button,input,select,textarea {
|
||||
font:12px/1.5 Microsoft YaHei UI Light,tahoma,arial,"\5b8b\4f53";
|
||||
*line-height:1.5;
|
||||
-ms-overflow-style:scrollbar
|
||||
}
|
||||
h1,h2,h3,h4{
|
||||
font-size:100%
|
||||
}
|
||||
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
|
||||
}
|
||||
#nav {
|
||||
height: 40px;
|
||||
margin-top: 50px;
|
||||
background-color: #690;
|
||||
}
|
||||
#nav ul {
|
||||
list-style: none;
|
||||
margin-left: 50px;
|
||||
}
|
||||
#nav li {
|
||||
display: block;
|
||||
float: left;
|
||||
}
|
||||
#nav a {
|
||||
line-height: 40px;
|
||||
display: block;
|
||||
color: #fff;
|
||||
text-decoration: none;
|
||||
padding: 0 20px;
|
||||
}
|
||||
#nav a:hover {
|
||||
background-color: #060;
|
||||
}
|
||||
#menu li {
|
||||
float:left; /* 往左浮动 */
|
||||
}
|
||||
|
||||
/*rem*/
|
||||
html {
|
||||
font-size:62.5%;
|
||||
}
|
||||
body {
|
||||
font:16px/1.5 "microsoft yahei", 'tahoma';
|
||||
}
|
||||
body .mobile-page {
|
||||
font-size: 1.6rem;
|
||||
}
|
||||
|
||||
/*浮动*/
|
||||
.fl{
|
||||
float: left;
|
||||
}
|
||||
.fr{
|
||||
float: right;
|
||||
}
|
||||
.clearfix:after{
|
||||
content: '';
|
||||
display: block;
|
||||
height: 0;
|
||||
clear: both;
|
||||
visibility: hidden;
|
||||
}
|
||||
|
||||
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>
|
||||
<body>
|
||||
<div class="mobile-page">
|
||||
<div class="user-group">
|
||||
<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>
|
||||
你好
|
||||
</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>
|
||||
</body>
|
||||
</html>
|
||||
|
Loading…
Reference in New Issue
Block a user