Python中pywebview库使用并制作一个时间戳转换工具(附源码+exe)

文摘   科技   2023-12-16 19:08   北京  


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页面,如下:

<!DOCTYPE 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  # csv封装工具类├─data.csv  # 转换历史记录csv文件├─index.html  # 页面└─main.py # 项目主程序```

(左右滑动查看完整代码)


主要代码

csv工具类csv_tools.py

# -*- coding: utf-8 -*-import csvimport 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”即可获取!


     

文章就分享到这儿,喜欢就点个吧!



推荐阅读  点击标题可跳转


ISEE小栈
没有花里胡哨,简单才是王道。
 最新文章