ISEE小语
《荀子·荣辱》里说:知己者不怨人,知命者不怨天。
回顾上篇
Python中5个超实用的三方库,精简清晰版
ISEE小栈,公众号:ISEE小栈Python中5个超实用的三方库,精简清晰版
开始本篇
pywebview是一个使用Python和本地GUI组件来显示Web内容的跨平台库。它的主要特点是将Web内容嵌入到本地应用程序中,并且不需要依赖于外部浏览器。
在Python应用程序中方便地集成和显示Web内容,提供了一种更加灵活的界面展示方式。
本次通过pywebview库做个[时间戳转换]的小工具。限windows下可用^^
环境:
Pycharm
Python 3.9.16
安装:
pip install pywebview==4.4.1
导入:
import webview
包的名称是pywebview,注意导入的是webview模块
先看实际效果
基本用法
1. 直接将网站嵌入
我们将www.example.com网站,嵌入到本地程序中,如下:
项目中新建main.py程序文件
# -*- coding: utf-8 -*-
import webview
def create_window():
webview.create_window("时间戳转换-ISEE小栈", "https://www.example.com")
webview.start()
if __name__ == '__main__':
create_window()
(左右滑动查看完整代码)
运行,结果:
就这一段代码,其中网站根据自己实际需要可以随便变换,主打就是一个只要是网站,就可以嵌入进来。
2. 将自已设计的页面嵌入
我们这时就要分两步,首先创建一个index.html页面,如下:
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Timestamp Page</title>
<style>
body {
font-family: Arial, sans-serif;
}
.convert-container {
display: flex;
justify-content: center;
align-items: center;
font-size: xx-large;
height: 80vh;
}
.copy-right {
position: absolute;
bottom: 10px;
width: 99%;
text-align: center;
font-size: 13px;
}
</style>
</head>
<body>
<div class="convert-container">pywebview库的基本使用</div>
<div class="copy-right"><p>Copyright © 2023. version is 0.0.1<a target="_blank" href="https://mp.weixin.qq.com/s/7MThrs_J33uX4ySWm5zH9w">阅读来源</a></p></div>
</body>
</html>
(左右滑动查看完整代码)
然后在项目中新建main.py程序文件
# -*- coding: utf-8 -*-
import webview
def create_window():
webview.create_window('时间戳转换-ISEE小栈', 'index.html', width=800, height=600, resizable=False)
webview.start()
def main():
create_window()
if __name__ == '__main__':
main()
(左右滑动查看完整代码)
运行,结果:
3. 小结
a> index.html和我们定义的main.py在同一项目路径下。
b> main函数导入的是webview模块。
c> webview.create_window()是创建窗口,函数主要参数:窗口标题、外部网地址或HTML文件路径(在这里是index.html)、窗口的宽度和高度。其中加了一个参数resizable,是调整窗口大小的作用,False为不能调整,True为可调整。
d> webview.start()来启动pywebview窗口的主循环。
那么接下来就开始做一个时间戳转换小工具的实例吧
实现原理
使用pywebview库制作[时间戳转换]小工具,主要实现步骤:
页面设计:根据时间戳转日期、日期转时间戳以及历史转换信息显示来设计页面,包括布局、样式、交互等。
逻辑处理:python主程序进行时间戳转换的逻辑处理。
信息存储:本次将历史转换信息临时保存在了csv文件中,主要是以前文章中有分享过现成方法,直接使用非常方便。
项目结构
新创建一个timestamp_convert项目,具体结构如下:
```结构
timestamp convert
├─csv_tools.py
├─data.csv
├─index.html
└─main.py
```
(左右滑动查看完整代码)
主要代码
csv工具类csv_tools.py
# -*- coding: utf-8 -*-
import csv
import os
class csv_tools:
def __init__(self, file: str):
self.csv_file = file
def is_file_exists(self) -> bool:
"""
Csv文件是否存在
:return:
"""
has_file = False
if os.path.exists(self.csv_file):
has_file = True
return has_file
def is_header_exists(self) -> bool:
"""
判断是否有表头
:return: bool
"""
has_header = False
with open(self.csv_file, 'r', newline='', encoding='UTF-8') as cf:
reader = csv.reader(cf)
list_header = next(reader, None)
if list_header:
has_header = True
cf.close()
return has_header
def is_data_exists(self, data) -> bool:
"""
判断数据是否存在
:param data: 是一个list
:return: bool
"""
has_data = False
with open(self.csv_file, 'r', newline='', encoding='UFT-8') as cf:
reader = csv.reader(cf)
for row in reader:
if data in row:
has_data = True
cf.close()
return has_data
def write_row(self, headers: list, write_type: str, data: list):
"""
单数据写入
:param headers: 表头
:param write_type: 写入类型,w:写入;a:追加
:param data: 写入数据
:return:
"""
try:
with open(self.csv_file, write_type, newline='', encoding='UTF-8') as cf:
cf_ = csv.writer(cf, delimiter=',', quoting=csv.QUOTE_MINIMAL)
if not self.is_header_exists():
cf_.writerow(headers)
cf_.writerow(data)
cf.close()
result = 'success'
except:
result = 'error'
finally:
cf.close()
return result
# 清空csv文件
def clear(self):
with open(self.csv_file, 'w') as cf:
pass
cf.close()
def read_csv(self):
"""
读取Csv文件中的所有数据
:return:data(csv内的数据); reader(读取对象类)
"""
data = []
with open(self.csv_file, "r", encoding='UTF-8') as cf:
reader = csv.DictReader(cf)
for row in reader:
data.append(row)
cf.close()
return data, reader
(左右滑动查看完整代码)
这个工具类在后面保存历史转换的信息会用到,之所以用csv储存数据完全是由于前面文章有现成的,本次就偷懒了,直接拿过来使用
之前分享快速搜索连接:
python将csv操作独立封装
九月de云,公众号:九月de云python将Mysql查询的数据保存到csv文件中,csv操作独立封装
时间戳转换页面index.html
<body>
<div class="convert-container">
<label class="label-cla">时间:</label>
<input type="text" id="timeInput" class="timestamp-box" placeholder="时间戳">
<button id="convertButton" class="convert-button">转换>></button>
<input type="text" id="timeOutput" class="timestamp-box" placeholder="转换日期结果" readonly>
</div>
<div class="convert-container">
<label class="label-cla">日期:</label>
<input type="text" id="dateInput" class="timestamp-box" placeholder="日期">
<button id="convertButton_2" class="convert-button">转换>></button>
<input type="text" id="dateOutput" class="timestamp-box" placeholder="转换时间戳结果" readonly>
<select id="timestampOptions" class="timestamp-options">
<option value="s">秒(s)</option>
<option value="ms">毫秒(ms)</option>
</select>
</div>
<textarea id="contentBox" class="content-box" readonly></textarea>
<div class="convert-container">
<button id="clearButton" class="clear-button">清空</button>
</div>
<div class="copy-right"><p>Copyright © 2023. version is 0.0.1<a target="_blank" href="#">工具来源</a></p></div>
</body>
(左右滑动查看完整代码)
以上贴出的是页面代码主要结构字段,整个页面代码太多了,就不占用字数了(有兴趣的可以去看源码)
双击打开index.html页面,浏览器下最终效果如下:
其中时间戳转日期是支持秒级和毫秒级转日期的。页面上没有做"秒"和"毫秒"的下拉选择框,主程序的已经逻辑处理。
主程序main.py
class TimeApi:
# 时间戳转日期
def timestamp_convert(self, timestamp):
timestamp = timestamp.replace(" ", "")
timestamp_ = 0
if len(str(timestamp)) == 13:
timestamp_ = int(timestamp) / 1000
elif len(str(timestamp)) == 10:
timestamp_ = timestamp
date = datetime.datetime.fromtimestamp(int(timestamp_)).strftime('%Y-%m-%d %H:%M:%S')
save_date = str(timestamp) + "-->" + date
ct.write_row(['convert_data'], 'a', [save_date])
return date
# 日期转时间戳
def date_convert(self, date, second_):
date = date.strip()
dt = datetime.datetime.strptime(date, "%Y-%m-%d %H:%M:%S")
if second_ == 's':
# 计算秒级时间戳
timestamp = int(dt.timestamp())
else:
# 计算毫秒级时间戳
timestamp = int(dt.timestamp() * 1000)
save_date = date + "-->" + str(timestamp)
ct.write_row(['convert_data'], 'a', [save_date])
return timestamp
# 清空
def content_clear(self):
ct.clear()
def main():
api = TimeApi()
webview.create_window('时间戳转换-ISEE小栈', 'index.html', js_api=api, width=800, height=600, resizable=False)
webview.start()
if __name__ == '__main__':
main()
(左右滑动查看完整代码)
以上贴出的是时间戳转日期和日期转时间戳的主要实现。那么问题来了,前后端如何通信呢?
其实很简单,接着往下看……
我们就拿时间戳转日期为例,在index.html添加
<script>
// 时间戳转日期
document.getElementById('convertButton').onclick = async function () {
const timeInput = document.getElementById('timeInput').value;
document.getElementById('timeOutput').value = await window.pywebview.api.timestamp_convert(timeInput);
};
</script>
(左右滑动查看完整代码)
其中这个地方就是与后端通过的关键所在。直接调用后端时间戳转日期的方法timestamp_convert()即可。
其他日期转时间戳、转换信息显示和清空的功能,调用方式一模一样,这里不多做阐述了。
启动运行
在自己电脑上启动,直接切换到venv下,输入:
python main.py
即可,这时会弹出时间戳转换的窗口,看一下效果:
总结
我们使用pywebview库介绍了外部网站的内嵌和本地页面的内嵌,它使用起来非常的方便,快速构建本地应用具有高效、灵活的特点。
小栈把上面时间戳转换的小工具做成一个exe应用共享,大家平时大多都是使用在线的时间戳转换,这个本地的也可以直接使用。
源码已整理:
有兴趣的朋友点个“赞”和“在看”,谢谢支持~!
后台回复“timestamp”即可获取!
文章就分享到这儿,喜欢就点个赞吧!