mirror of
https://github.com/LC044/WeChatMsg
synced 2025-02-21 18:12:18 +08:00
支持导出HTML
This commit is contained in:
parent
55425daa44
commit
12b14316ce
@ -4,12 +4,21 @@
|
|||||||
<option name="autoReloadType" value="SELECTIVE" />
|
<option name="autoReloadType" value="SELECTIVE" />
|
||||||
</component>
|
</component>
|
||||||
<component name="ChangeListManager">
|
<component name="ChangeListManager">
|
||||||
<list default="true" id="84e65474-7da9-466d-baf3-cc88dde3ffdd" name="变更" comment="显示聊天图片">
|
<list default="true" id="84e65474-7da9-466d-baf3-cc88dde3ffdd" name="变更" comment="支持显示聊天图片">
|
||||||
<change beforePath="$PROJECT_DIR$/.idea/workspace.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/workspace.xml" afterDir="false" />
|
<change beforePath="$PROJECT_DIR$/.idea/workspace.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/workspace.xml" afterDir="false" />
|
||||||
<change beforePath="$PROJECT_DIR$/app/components/bubble_message.py" beforeDir="false" afterPath="$PROJECT_DIR$/app/components/bubble_message.py" afterDir="false" />
|
<change beforePath="$PROJECT_DIR$/app/DataBase/msg.py" beforeDir="false" afterPath="$PROJECT_DIR$/app/DataBase/msg.py" afterDir="false" />
|
||||||
<change beforePath="$PROJECT_DIR$/app/decrypt/dat2pic.py" beforeDir="false" afterPath="$PROJECT_DIR$/app/decrypt/dat2pic.py" afterDir="false" />
|
<change beforePath="$PROJECT_DIR$/app/DataBase/output_pc.py" beforeDir="false" afterPath="$PROJECT_DIR$/app/DataBase/output_pc.py" afterDir="false" />
|
||||||
<change beforePath="$PROJECT_DIR$/app/ui_pc/tool/pc_decrypt/pc_decrypt.py" beforeDir="false" afterPath="$PROJECT_DIR$/app/ui_pc/tool/pc_decrypt/pc_decrypt.py" afterDir="false" />
|
<change beforePath="$PROJECT_DIR$/app/data/html/0.html" beforeDir="false" />
|
||||||
<change beforePath="$PROJECT_DIR$/app/util/path.py" beforeDir="false" afterPath="$PROJECT_DIR$/app/util/path.py" afterDir="false" />
|
<change beforePath="$PROJECT_DIR$/app/data/html/1.html" beforeDir="false" />
|
||||||
|
<change beforePath="$PROJECT_DIR$/app/data/html/2.html" beforeDir="false" />
|
||||||
|
<change beforePath="$PROJECT_DIR$/app/data/html/3.html" beforeDir="false" />
|
||||||
|
<change beforePath="$PROJECT_DIR$/app/data/html/4.html" beforeDir="false" />
|
||||||
|
<change beforePath="$PROJECT_DIR$/app/data/html/5.html" beforeDir="false" />
|
||||||
|
<change beforePath="$PROJECT_DIR$/app/data/html/6.html" beforeDir="false" />
|
||||||
|
<change beforePath="$PROJECT_DIR$/app/data/html/index.html" beforeDir="false" />
|
||||||
|
<change beforePath="$PROJECT_DIR$/app/person.py" beforeDir="false" afterPath="$PROJECT_DIR$/app/person.py" afterDir="false" />
|
||||||
|
<change beforePath="$PROJECT_DIR$/app/ui_pc/chat/chat_info.py" beforeDir="false" afterPath="$PROJECT_DIR$/app/ui_pc/chat/chat_info.py" afterDir="false" />
|
||||||
|
<change beforePath="$PROJECT_DIR$/app/ui_pc/contact/contactInfo.py" beforeDir="false" afterPath="$PROJECT_DIR$/app/ui_pc/contact/contactInfo.py" afterDir="false" />
|
||||||
</list>
|
</list>
|
||||||
<option name="SHOW_DIALOG" value="false" />
|
<option name="SHOW_DIALOG" value="false" />
|
||||||
<option name="HIGHLIGHT_CONFLICTS" value="true" />
|
<option name="HIGHLIGHT_CONFLICTS" value="true" />
|
||||||
@ -20,8 +29,8 @@
|
|||||||
<option name="RECENT_TEMPLATES">
|
<option name="RECENT_TEMPLATES">
|
||||||
<list>
|
<list>
|
||||||
<option value="Freeze Requirements File" />
|
<option value="Freeze Requirements File" />
|
||||||
<option value="HTML File" />
|
|
||||||
<option value="Python Script" />
|
<option value="Python Script" />
|
||||||
|
<option value="HTML File" />
|
||||||
</list>
|
</list>
|
||||||
</option>
|
</option>
|
||||||
</component>
|
</component>
|
||||||
@ -280,13 +289,6 @@
|
|||||||
<option name="presentableId" value="Default" />
|
<option name="presentableId" value="Default" />
|
||||||
<updated>1672848140146</updated>
|
<updated>1672848140146</updated>
|
||||||
</task>
|
</task>
|
||||||
<task id="LOCAL-00037" summary="用stackedWidget实现导航栏">
|
|
||||||
<created>1698850498765</created>
|
|
||||||
<option name="number" value="00037" />
|
|
||||||
<option name="presentableId" value="LOCAL-00037" />
|
|
||||||
<option name="project" value="LOCAL" />
|
|
||||||
<updated>1698850498765</updated>
|
|
||||||
</task>
|
|
||||||
<task id="LOCAL-00038" summary="修复部分bug">
|
<task id="LOCAL-00038" summary="修复部分bug">
|
||||||
<created>1698853140384</created>
|
<created>1698853140384</created>
|
||||||
<option name="number" value="00038" />
|
<option name="number" value="00038" />
|
||||||
@ -623,7 +625,14 @@
|
|||||||
<option name="project" value="LOCAL" />
|
<option name="project" value="LOCAL" />
|
||||||
<updated>1700492891759</updated>
|
<updated>1700492891759</updated>
|
||||||
</task>
|
</task>
|
||||||
<option name="localTasksCounter" value="86" />
|
<task id="LOCAL-00086" summary="支持显示聊天图片">
|
||||||
|
<created>1700574536723</created>
|
||||||
|
<option name="number" value="00086" />
|
||||||
|
<option name="presentableId" value="LOCAL-00086" />
|
||||||
|
<option name="project" value="LOCAL" />
|
||||||
|
<updated>1700574536724</updated>
|
||||||
|
</task>
|
||||||
|
<option name="localTasksCounter" value="87" />
|
||||||
<servers />
|
<servers />
|
||||||
</component>
|
</component>
|
||||||
<component name="UnknownFeatures">
|
<component name="UnknownFeatures">
|
||||||
@ -659,7 +668,6 @@
|
|||||||
</option>
|
</option>
|
||||||
</component>
|
</component>
|
||||||
<component name="VcsManagerConfiguration">
|
<component name="VcsManagerConfiguration">
|
||||||
<MESSAGE value="修复无法查找wxid的bug" />
|
|
||||||
<MESSAGE value="修改UI" />
|
<MESSAGE value="修改UI" />
|
||||||
<MESSAGE value="新增联系人头像组件" />
|
<MESSAGE value="新增联系人头像组件" />
|
||||||
<MESSAGE value="头像支持显示二进制" />
|
<MESSAGE value="头像支持显示二进制" />
|
||||||
@ -684,7 +692,8 @@
|
|||||||
<MESSAGE value="文字消息设置圆角" />
|
<MESSAGE value="文字消息设置圆角" />
|
||||||
<MESSAGE value="更新wx选择的路径" />
|
<MESSAGE value="更新wx选择的路径" />
|
||||||
<MESSAGE value="显示聊天图片" />
|
<MESSAGE value="显示聊天图片" />
|
||||||
<option name="LAST_COMMIT_MESSAGE" value="显示聊天图片" />
|
<MESSAGE value="支持显示聊天图片" />
|
||||||
|
<option name="LAST_COMMIT_MESSAGE" value="支持显示聊天图片" />
|
||||||
<option name="OPTIMIZE_IMPORTS_BEFORE_PROJECT_COMMIT" value="true" />
|
<option name="OPTIMIZE_IMPORTS_BEFORE_PROJECT_COMMIT" value="true" />
|
||||||
<option name="REFORMAT_BEFORE_PROJECT_COMMIT" value="true" />
|
<option name="REFORMAT_BEFORE_PROJECT_COMMIT" value="true" />
|
||||||
</component>
|
</component>
|
||||||
@ -708,17 +717,17 @@
|
|||||||
</line-breakpoint>
|
</line-breakpoint>
|
||||||
<line-breakpoint enabled="true" suspend="THREAD" type="python-line">
|
<line-breakpoint enabled="true" suspend="THREAD" type="python-line">
|
||||||
<url>file://$PROJECT_DIR$/app/person.py</url>
|
<url>file://$PROJECT_DIR$/app/person.py</url>
|
||||||
<line>100</line>
|
<line>103</line>
|
||||||
<option name="timeStamp" value="10" />
|
<option name="timeStamp" value="10" />
|
||||||
</line-breakpoint>
|
</line-breakpoint>
|
||||||
<line-breakpoint enabled="true" suspend="THREAD" type="python-line">
|
<line-breakpoint enabled="true" suspend="THREAD" type="python-line">
|
||||||
<url>file://$PROJECT_DIR$/app/person.py</url>
|
<url>file://$PROJECT_DIR$/app/person.py</url>
|
||||||
<line>98</line>
|
<line>101</line>
|
||||||
<option name="timeStamp" value="11" />
|
<option name="timeStamp" value="11" />
|
||||||
</line-breakpoint>
|
</line-breakpoint>
|
||||||
<line-breakpoint enabled="true" suspend="THREAD" type="python-line">
|
<line-breakpoint enabled="true" suspend="THREAD" type="python-line">
|
||||||
<url>file://$PROJECT_DIR$/app/person.py</url>
|
<url>file://$PROJECT_DIR$/app/person.py</url>
|
||||||
<line>99</line>
|
<line>102</line>
|
||||||
<option name="timeStamp" value="12" />
|
<option name="timeStamp" value="12" />
|
||||||
</line-breakpoint>
|
</line-breakpoint>
|
||||||
</breakpoints>
|
</breakpoints>
|
||||||
|
@ -49,10 +49,14 @@ def get_messages(username_):
|
|||||||
'''
|
'''
|
||||||
result = []
|
result = []
|
||||||
for cur in cursor:
|
for cur in cursor:
|
||||||
cur.execute(sql, [username_])
|
try:
|
||||||
result_ = cur.fetchall()
|
lock.acquire(True)
|
||||||
# print(len(result))
|
cur.execute(sql, [username_])
|
||||||
result += result_
|
result_ = cur.fetchall()
|
||||||
|
# print(len(result))
|
||||||
|
result += result_
|
||||||
|
finally:
|
||||||
|
lock.release()
|
||||||
result.sort(key=lambda x: x[5])
|
result.sort(key=lambda x: x[5])
|
||||||
return result
|
return result
|
||||||
|
|
||||||
|
@ -5,6 +5,7 @@ from PyQt5.QtCore import pyqtSignal, QThread
|
|||||||
|
|
||||||
from . import msg
|
from . import msg
|
||||||
from ..log import log
|
from ..log import log
|
||||||
|
from ..person import MePC
|
||||||
|
|
||||||
if not os.path.exists('./data/聊天记录'):
|
if not os.path.exists('./data/聊天记录'):
|
||||||
os.mkdir('./data/聊天记录')
|
os.mkdir('./data/聊天记录')
|
||||||
@ -24,6 +25,7 @@ class Output(QThread):
|
|||||||
|
|
||||||
def __init__(self, contact, parent=None, type_=DOCX):
|
def __init__(self, contact, parent=None, type_=DOCX):
|
||||||
super().__init__(parent)
|
super().__init__(parent)
|
||||||
|
self.last_timestamp = 0
|
||||||
self.sec = 2 # 默认1000秒
|
self.sec = 2 # 默认1000秒
|
||||||
self.contact = contact
|
self.contact = contact
|
||||||
self.ta_username = contact.wxid
|
self.ta_username = contact.wxid
|
||||||
@ -51,9 +53,239 @@ class Output(QThread):
|
|||||||
df.to_csv(filename, encoding='utf-8')
|
df.to_csv(filename, encoding='utf-8')
|
||||||
self.okSignal.emit('ok')
|
self.okSignal.emit('ok')
|
||||||
|
|
||||||
|
def to_html(self):
|
||||||
|
origin_docx_path = f"{os.path.abspath('.')}/data/聊天记录/{self.contact.remark}"
|
||||||
|
if not os.path.exists(origin_docx_path):
|
||||||
|
os.mkdir(origin_docx_path)
|
||||||
|
messages = msg.get_messages(self.contact.wxid)
|
||||||
|
filename = f"{os.path.abspath('.')}/data/聊天记录/{self.contact.remark}/{self.contact.remark}.html"
|
||||||
|
f = open(filename, 'w', encoding='utf-8')
|
||||||
|
html_head = '''
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8">
|
||||||
|
<title>Title</title>
|
||||||
|
<style>
|
||||||
|
|
||||||
|
*{
|
||||||
|
padding: 0;
|
||||||
|
margin: 0;
|
||||||
|
}
|
||||||
|
body{
|
||||||
|
height: 100vh;
|
||||||
|
width: 100%;
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
}
|
||||||
|
.container{
|
||||||
|
height: 760px;
|
||||||
|
width: 900px;
|
||||||
|
border-radius: 4px;
|
||||||
|
border: 0.5px solid #e0e0e0;
|
||||||
|
background-color: #f5f5f5;
|
||||||
|
display: flex;
|
||||||
|
flex-flow: column;
|
||||||
|
overflow: hidden;
|
||||||
|
}
|
||||||
|
.content{
|
||||||
|
width: calc(100% - 40px);
|
||||||
|
padding: 20px;
|
||||||
|
overflow-y: scroll;
|
||||||
|
flex: 1;
|
||||||
|
}
|
||||||
|
.content:hover::-webkit-scrollbar-thumb{
|
||||||
|
background:rgba(0,0,0,0.1);
|
||||||
|
}
|
||||||
|
.bubble{
|
||||||
|
max-width: 400px;
|
||||||
|
padding: 10px;
|
||||||
|
border-radius: 5px;
|
||||||
|
position: relative;
|
||||||
|
color: #000;
|
||||||
|
word-wrap:break-word;
|
||||||
|
word-break:normal;
|
||||||
|
}
|
||||||
|
.item-left .bubble{
|
||||||
|
margin-left: 15px;
|
||||||
|
background-color: #fff;
|
||||||
|
}
|
||||||
|
.item-left .bubble:before{
|
||||||
|
content: "";
|
||||||
|
position: absolute;
|
||||||
|
width: 0;
|
||||||
|
height: 0;
|
||||||
|
border-left: 10px solid transparent;
|
||||||
|
border-top: 10px solid transparent;
|
||||||
|
border-right: 10px solid #fff;
|
||||||
|
border-bottom: 10px solid transparent;
|
||||||
|
left: -20px;
|
||||||
|
}
|
||||||
|
.item-right .bubble{
|
||||||
|
margin-right: 15px;
|
||||||
|
background-color: #9eea6a;
|
||||||
|
}
|
||||||
|
.item-right .bubble:before{
|
||||||
|
content: "";
|
||||||
|
position: absolute;
|
||||||
|
width: 0;
|
||||||
|
height: 0;
|
||||||
|
border-left: 10px solid #9eea6a;
|
||||||
|
border-top: 10px solid transparent;
|
||||||
|
border-right: 10px solid transparent;
|
||||||
|
border-bottom: 10px solid transparent;
|
||||||
|
right: -20px;
|
||||||
|
}
|
||||||
|
.item{
|
||||||
|
margin-top: 15px;
|
||||||
|
display: flex;
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
|
.item.item-right{
|
||||||
|
justify-content: flex-end;
|
||||||
|
}
|
||||||
|
.item.item-center{
|
||||||
|
justify-content: center;
|
||||||
|
}
|
||||||
|
.item.item-center span{
|
||||||
|
font-size: 12px;
|
||||||
|
padding: 2px 4px;
|
||||||
|
color: #fff;
|
||||||
|
background-color: #dadada;
|
||||||
|
border-radius: 3px;
|
||||||
|
-moz-user-select:none; /*火狐*/
|
||||||
|
-webkit-user-select:none; /*webkit浏览器*/
|
||||||
|
-ms-user-select:none; /*IE10*/
|
||||||
|
-khtml-user-select:none; /*早期浏览器*/
|
||||||
|
user-select:none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.avatar img{
|
||||||
|
width: 42px;
|
||||||
|
height: 42px;
|
||||||
|
border-radius: 50%;
|
||||||
|
}
|
||||||
|
.input-area{
|
||||||
|
border-top:0.5px solid #e0e0e0;
|
||||||
|
height: 150px;
|
||||||
|
display: flex;
|
||||||
|
flex-flow: column;
|
||||||
|
background-color: #fff;
|
||||||
|
}
|
||||||
|
textarea{
|
||||||
|
flex: 1;
|
||||||
|
padding: 5px;
|
||||||
|
font-size: 14px;
|
||||||
|
border: none;
|
||||||
|
cursor: pointer;
|
||||||
|
overflow-y: auto;
|
||||||
|
overflow-x: hidden;
|
||||||
|
outline:none;
|
||||||
|
resize:none;
|
||||||
|
}
|
||||||
|
.button-area{
|
||||||
|
display: flex;
|
||||||
|
height: 40px;
|
||||||
|
margin-right: 10px;
|
||||||
|
line-height: 40px;
|
||||||
|
padding: 5px;
|
||||||
|
justify-content: flex-end;
|
||||||
|
}
|
||||||
|
.button-area button{
|
||||||
|
width: 80px;
|
||||||
|
border: none;
|
||||||
|
outline: none;
|
||||||
|
border-radius: 4px;
|
||||||
|
float: right;
|
||||||
|
cursor: pointer;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* 设置滚动条的样式 */
|
||||||
|
::-webkit-scrollbar {
|
||||||
|
width:10px;
|
||||||
|
}
|
||||||
|
/* 滚动槽 */
|
||||||
|
::-webkit-scrollbar-track {
|
||||||
|
-webkit-box-shadow:inset006pxrgba(0,0,0,0.3);
|
||||||
|
border-radius:8px;
|
||||||
|
}
|
||||||
|
/* 滚动条滑块 */
|
||||||
|
::-webkit-scrollbar-thumb {
|
||||||
|
border-radius:10px;
|
||||||
|
background:rgba(0,0,0,0);
|
||||||
|
-webkit-box-shadow:inset006pxrgba(0,0,0,0.5);
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<div class="container">
|
||||||
|
<div class="content">
|
||||||
|
'''
|
||||||
|
f.write(html_head)
|
||||||
|
MePC().avatar.save(os.path.join(origin_docx_path, 'myhead.png'))
|
||||||
|
self.contact.avatar.save(os.path.join(origin_docx_path, 'tahead.png'))
|
||||||
|
for message in messages:
|
||||||
|
type_ = message[2]
|
||||||
|
str_content = message[7]
|
||||||
|
str_time = message[8]
|
||||||
|
# print(type_, type(type_))
|
||||||
|
is_send = message[4]
|
||||||
|
avatar = MePC().avatar_path if is_send else self.contact.avatar_path
|
||||||
|
timestamp = message[5]
|
||||||
|
if type_ == 1:
|
||||||
|
if self.is_5_min(timestamp):
|
||||||
|
f.write(
|
||||||
|
f'''
|
||||||
|
<div class="item item-center"><span>{str_time}</span></div>
|
||||||
|
'''
|
||||||
|
)
|
||||||
|
if is_send:
|
||||||
|
f.write(
|
||||||
|
f'''
|
||||||
|
<div class="item item-right">
|
||||||
|
<div class="bubble bubble-right">{str_content}</div>
|
||||||
|
<div class="avatar">
|
||||||
|
<img src="myhead.png" />
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
'''
|
||||||
|
)
|
||||||
|
else:
|
||||||
|
f.write(
|
||||||
|
f'''
|
||||||
|
<div class="item item-left">
|
||||||
|
<div class="avatar">
|
||||||
|
<img src="tahead.png" />
|
||||||
|
</div>
|
||||||
|
<div class="bubble bubble-left">{str_content}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
'''
|
||||||
|
)
|
||||||
|
html_end = '''
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
|
'''
|
||||||
|
f.write(html_end)
|
||||||
|
f.close()
|
||||||
|
self.okSignal.emit('ok')
|
||||||
|
|
||||||
|
def is_5_min(self, timestamp):
|
||||||
|
if abs(timestamp - self.last_timestamp) > 300:
|
||||||
|
self.last_timestamp = timestamp
|
||||||
|
|
||||||
|
return True
|
||||||
|
return False
|
||||||
|
|
||||||
def run(self):
|
def run(self):
|
||||||
if self.output_type == self.DOCX:
|
if self.output_type == self.DOCX:
|
||||||
return
|
return
|
||||||
elif self.output_type == self.CSV:
|
elif self.output_type == self.CSV:
|
||||||
# print("线程导出csv")
|
# print("线程导出csv")
|
||||||
self.to_csv(self.ta_username, "path")
|
self.to_csv(self.ta_username, "path")
|
||||||
|
elif self.output_type == self.HTML:
|
||||||
|
self.to_html()
|
||||||
|
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
1228
app/data/html/2.html
1228
app/data/html/2.html
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
1232
app/data/html/4.html
1232
app/data/html/4.html
File diff suppressed because one or more lines are too long
7567
app/data/html/5.html
7567
app/data/html/5.html
File diff suppressed because one or more lines are too long
1344
app/data/html/6.html
1344
app/data/html/6.html
File diff suppressed because one or more lines are too long
@ -1,252 +0,0 @@
|
|||||||
<!DOCTYPE html>
|
|
||||||
<html>
|
|
||||||
|
|
||||||
<head>
|
|
||||||
<meta charset="utf-8"/>
|
|
||||||
<script src="https://cdn.bootcss.com/jquery/1.10.2/jquery.min.js"></script>
|
|
||||||
<title></title>
|
|
||||||
<!--
|
|
||||||
@time: 2018-08-04
|
|
||||||
@version: 0.0.1
|
|
||||||
@author: Mortal
|
|
||||||
-->
|
|
||||||
<style type="text/css">
|
|
||||||
/*
|
|
||||||
* 说明:
|
|
||||||
* 标注为慎删的属性暂时认定可以删除,即在作者测试的环境下删除暂时没有影响,但不代表所有环境下删除都没有影响
|
|
||||||
* 其他属性一概不可以删除
|
|
||||||
*/
|
|
||||||
|
|
||||||
html,
|
|
||||||
body {
|
|
||||||
height: 100%;
|
|
||||||
}
|
|
||||||
|
|
||||||
body,
|
|
||||||
ul,
|
|
||||||
li,
|
|
||||||
a,
|
|
||||||
p,
|
|
||||||
div {
|
|
||||||
/*慎删*/
|
|
||||||
padding: 0px;
|
|
||||||
margin: 0px;
|
|
||||||
}
|
|
||||||
|
|
||||||
#wrap {
|
|
||||||
overflow: hidden;
|
|
||||||
width: 100%;
|
|
||||||
}
|
|
||||||
|
|
||||||
#main {
|
|
||||||
top: 0;
|
|
||||||
position: relative;
|
|
||||||
}
|
|
||||||
|
|
||||||
.page {
|
|
||||||
/*谨删*/
|
|
||||||
width: 100%;
|
|
||||||
margin: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
#pageUl {
|
|
||||||
position: fixed;
|
|
||||||
right: 10px;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
</style>
|
|
||||||
</head>
|
|
||||||
|
|
||||||
<body>
|
|
||||||
<!--
|
|
||||||
每个全屏页面div的class为page,其中的图片的class为pageImg
|
|
||||||
ul为右侧的导航栏
|
|
||||||
pageUlLi和page的数目必须相等,修改数目时还应修改最下面js鼠标悬停的跳转代码
|
|
||||||
-->
|
|
||||||
<div id="wrap">
|
|
||||||
<div id="main">
|
|
||||||
<ul id="pageUl" type="circle">
|
|
||||||
<li id="pageUlLi1" class="pageUlLi" style="color: red;"> </li>
|
|
||||||
<li id="pageUlLi2" class="pageUlLi"> </li>
|
|
||||||
<li id="pageUlLi3" class="pageUlLi"> </li>
|
|
||||||
<li id="pageUlLi4" class="pageUlLi"> </li>
|
|
||||||
<li id="pageUlLi5" class="pageUlLi"> </li>
|
|
||||||
<li id="pageUlLi6" class="pageUlLi"> </li>
|
|
||||||
<li id="pageUlLi7" class="pageUlLi"> </li>
|
|
||||||
</ul>
|
|
||||||
<div id="page1" class="page">
|
|
||||||
<iframe src="0.html" frameborder="0" height="100%"
|
|
||||||
width="100%"></iframe>
|
|
||||||
</div>
|
|
||||||
<div id="page2" class="page">
|
|
||||||
<iframe src="1.html" frameborder="0" height="100%"
|
|
||||||
width="100%"></iframe>
|
|
||||||
</div>
|
|
||||||
<div style="background-color: #8a6d3b" id="page3" class="page">
|
|
||||||
<iframe src="2.html" frameborder="0" id="iframe0" height="100%"
|
|
||||||
width="100%"></iframe>
|
|
||||||
</div>
|
|
||||||
<div style="background-color: #337ab7" id="page4" class="page">
|
|
||||||
<iframe src="3.html" frameborder="0" id="iframe3" height="100%"
|
|
||||||
width="100%"></iframe>
|
|
||||||
</div>
|
|
||||||
<div style="background-color: #337ab7" id="page5" class="page">
|
|
||||||
<iframe src="4.html" frameborder="0" id="iframe4" height="100%"
|
|
||||||
width="100%"></iframe>
|
|
||||||
</div>
|
|
||||||
<div style="background-color: #337ab7" id="page6" class="page">
|
|
||||||
<iframe src="5.html" frameborder="0" id="iframe5" height="100%"
|
|
||||||
width="100%"></iframe>
|
|
||||||
</div>
|
|
||||||
<div style="background-color: #337ab7" id="page7" class="page">
|
|
||||||
<iframe src="6.html" frameborder="0" id="iframe6" height="100%"
|
|
||||||
width="100%"></iframe>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</body>
|
|
||||||
<script type="text/javascript">
|
|
||||||
//改变窗口大小时调整图片大小
|
|
||||||
window.onload = resizeImages;
|
|
||||||
window.onresize = resizeImages;
|
|
||||||
|
|
||||||
function resizeImages() {
|
|
||||||
$(function (e) {
|
|
||||||
var screenWeight = document.documentElement.clientWidth;
|
|
||||||
var screenHeight = document.documentElement.clientHeight;
|
|
||||||
$("[name=pageImg]").css("width", screenWeight).css("height", screenHeight);
|
|
||||||
$("#pageUl").css("bottom", screenHeight >> 1);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
var index = 1;
|
|
||||||
var curIndex = 1;
|
|
||||||
var wrap = document.getElementById("wrap");
|
|
||||||
var main = document.getElementById("main");
|
|
||||||
var hei = document.body.clientHeight;
|
|
||||||
wrap.style.height = hei + "px";
|
|
||||||
var obj = document.getElementsByTagName("div");
|
|
||||||
for (var i = 0; i < obj.length; i++) {
|
|
||||||
if (obj[i].className == 'page') {
|
|
||||||
obj[i].style.height = hei + "px";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
var pageNum = document.querySelectorAll(".page").length;
|
|
||||||
//如果不加时间控制,滚动会过度灵敏,一次翻好几屏
|
|
||||||
var startTime = 0, //翻屏起始时间
|
|
||||||
endTime = 0,
|
|
||||||
now = 0;
|
|
||||||
//浏览器兼容
|
|
||||||
if ((navigator.userAgent.toLowerCase().indexOf("firefox") != -1)) {
|
|
||||||
document.addEventListener("DOMMouseScroll", scrollFun, false);
|
|
||||||
} else if (document.addEventListener) {
|
|
||||||
document.addEventListener("mousewheel", scrollFun, false);
|
|
||||||
} else if (document.attachEvent) {
|
|
||||||
document.attachEvent("onmousewheel", scrollFun);
|
|
||||||
} else {
|
|
||||||
document.onmousewheel = scrollFun;
|
|
||||||
}
|
|
||||||
|
|
||||||
//滚动事件处理函数
|
|
||||||
function scrollFun(event) {
|
|
||||||
startTime = new Date().getTime();
|
|
||||||
var delta = event.detail || (-event.wheelDelta);
|
|
||||||
//mousewheel事件中的 “event.wheelDelta” 属性值:返回的如果是正值说明滚轮是向上滚动
|
|
||||||
//DOMMouseScroll事件中的 “event.detail” 属性值:返回的如果是负值说明滚轮是向上滚动
|
|
||||||
if ((endTime - startTime) < -1000) {
|
|
||||||
if (delta > 0 && parseInt(main.offsetTop) > -(hei * (pageNum - 1))) {
|
|
||||||
//向下滚动
|
|
||||||
index++;
|
|
||||||
toPage(index);
|
|
||||||
}
|
|
||||||
if (delta < 0 && parseInt(main.offsetTop) < 0) {
|
|
||||||
//向上滚动
|
|
||||||
index--;
|
|
||||||
toPage(index);
|
|
||||||
}
|
|
||||||
endTime = new Date().getTime();
|
|
||||||
} else {
|
|
||||||
event.preventDefault();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
function toPage(idx) {
|
|
||||||
//jquery实现动画效果
|
|
||||||
if(idx!=curIndex){
|
|
||||||
index=idx
|
|
||||||
var delta=idx - curIndex;
|
|
||||||
now = now - delta * hei;
|
|
||||||
$("#main").animate({
|
|
||||||
top: (now + 'px')
|
|
||||||
}, 500);
|
|
||||||
curIndex = idx;
|
|
||||||
//更改列表的选中项
|
|
||||||
$(".pageUlLi").css("color", "black");
|
|
||||||
$("#pageUlLi" + idx).css("color", "red");
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// //鼠标悬停翻页
|
|
||||||
// document.getElementById("pageUlLi1").onmouseover = function () {
|
|
||||||
// toPage(1);
|
|
||||||
// }
|
|
||||||
// document.getElementById("pageUlLi2").onmouseover = function () {
|
|
||||||
// toPage(2);
|
|
||||||
// }
|
|
||||||
// document.getElementById("pageUlLi3").onmouseover = function () {
|
|
||||||
// toPage(3);
|
|
||||||
// }
|
|
||||||
// document.getElementById("pageUlLi4").onmouseover = function () {
|
|
||||||
// toPage(4);
|
|
||||||
// }
|
|
||||||
// document.getElementById("pageUlLi5").onmouseover = function () {
|
|
||||||
// toPage(5);
|
|
||||||
// }
|
|
||||||
//鼠标点击翻页
|
|
||||||
document.getElementById("pageUlLi1").onclick = function () {
|
|
||||||
toPage(1);
|
|
||||||
}
|
|
||||||
document.getElementById("pageUlLi2").onclick = function () {
|
|
||||||
toPage(2);
|
|
||||||
}
|
|
||||||
document.getElementById("pageUlLi3").onclick = function () {
|
|
||||||
toPage(3);
|
|
||||||
}
|
|
||||||
document.getElementById("pageUlLi4").onclick = function () {
|
|
||||||
toPage(4);
|
|
||||||
}
|
|
||||||
document.getElementById("pageUlLi5").onclick = function () {
|
|
||||||
toPage(5);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
</script>
|
|
||||||
|
|
||||||
</html>
|
|
@ -55,6 +55,7 @@ def singleton(cls):
|
|||||||
class MePC:
|
class MePC:
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
self.avatar = QPixmap(Icon.Default_avatar_path)
|
self.avatar = QPixmap(Icon.Default_avatar_path)
|
||||||
|
self.avatar_path = 'D:\Project\Python\WeChatMsg\\app\data\icons\default_avatar.svg'
|
||||||
self.wxid = ''
|
self.wxid = ''
|
||||||
self.wx_dir = ''
|
self.wx_dir = ''
|
||||||
self.name = ''
|
self.name = ''
|
||||||
@ -82,6 +83,7 @@ class ContactPC:
|
|||||||
self.smallHeadImgUrl = contact_info.get('smallHeadImgUrl')
|
self.smallHeadImgUrl = contact_info.get('smallHeadImgUrl')
|
||||||
self.smallHeadImgBLOG = b''
|
self.smallHeadImgBLOG = b''
|
||||||
self.avatar = QPixmap()
|
self.avatar = QPixmap()
|
||||||
|
self.avatar_path = 'D:\Project\Python\WeChatMsg\\app\data\icons\default_avatar.svg'
|
||||||
|
|
||||||
def set_avatar(self, img_bytes):
|
def set_avatar(self, img_bytes):
|
||||||
if not img_bytes:
|
if not img_bytes:
|
||||||
@ -91,6 +93,7 @@ class ContactPC:
|
|||||||
self.avatar.loadFromData(img_bytes, format='PNG')
|
self.avatar.loadFromData(img_bytes, format='PNG')
|
||||||
else:
|
else:
|
||||||
self.avatar.loadFromData(img_bytes, format='jfif')
|
self.avatar.loadFromData(img_bytes, format='jfif')
|
||||||
|
|
||||||
self.avatar.scaled(60, 60, Qt.IgnoreAspectRatio, Qt.SmoothTransformation)
|
self.avatar.scaled(60, 60, Qt.IgnoreAspectRatio, Qt.SmoothTransformation)
|
||||||
|
|
||||||
|
|
||||||
|
@ -100,6 +100,7 @@ class ChatInfo(QWidget):
|
|||||||
)
|
)
|
||||||
self.chat_window.add_message_item(bubble_message, 0)
|
self.chat_window.add_message_item(bubble_message, 0)
|
||||||
elif type_ == 3:
|
elif type_ == 3:
|
||||||
|
return
|
||||||
if self.is_5_min(timestamp):
|
if self.is_5_min(timestamp):
|
||||||
time_message = Notice(self.last_str_time)
|
time_message = Notice(self.last_str_time)
|
||||||
self.last_str_time = str_time
|
self.last_str_time = str_time
|
||||||
|
@ -114,12 +114,13 @@ class ContactInfo(QWidget, Ui_Form):
|
|||||||
self.outputThread = Output(self.contact, type_=Output.CSV)
|
self.outputThread = Output(self.contact, type_=Output.CSV)
|
||||||
print('导出csv')
|
print('导出csv')
|
||||||
elif self.sender() == self.toHtmlAct:
|
elif self.sender() == self.toHtmlAct:
|
||||||
print('功能暂未实现')
|
self.outputThread = Output(self.contact, type_=Output.HTML)
|
||||||
QMessageBox.warning(self,
|
# print('功能暂未实现')
|
||||||
"别急别急",
|
# QMessageBox.warning(self,
|
||||||
"马上就实现该功能"
|
# "别急别急",
|
||||||
)
|
# "马上就实现该功能"
|
||||||
return
|
# )
|
||||||
|
# return
|
||||||
self.outputThread.progressSignal.connect(self.output_progress)
|
self.outputThread.progressSignal.connect(self.output_progress)
|
||||||
self.outputThread.rangeSignal.connect(self.set_progressBar_range)
|
self.outputThread.rangeSignal.connect(self.set_progressBar_range)
|
||||||
self.outputThread.okSignal.connect(self.hide_progress_bar)
|
self.outputThread.okSignal.connect(self.hide_progress_bar)
|
||||||
|
Loading…
Reference in New Issue
Block a user