【Electron】使用 Electron + Vue + Antd + Python 构建桌面程序

写在前面 也算是个记录吧,以免以后想写桌面程序又要走一遍弯路。这玩意不难,只是也有些坑,会耗些时间。 前端真没什么好说的,搞框架、搞设计的人很强,但调包这件事,人人都会干。 搭建前端 创建 vue 项目 yarn global add @vue/cli vue create electron-vue 参考:https://cli.vuejs.org/zh/guide/installation.html。 引入 electron 有现成的不用是…… cd electron-vue vue add electron-builder 参考:https://nklayman.github.io/vue-cli-plugin-electron-builder/guide/#installation。 没事儿不要自己瞎折腾,有时候遇上一些奇怪的报错,作为后端开发党,很难解决。 试一试 yarn electron:serve 引入 Antd Vue yarn add ant-design-vue 参考:https://www.antdv.com/docs/vue/getting-started-cn。 这里如果使用 npm 进行安装 npm i --save ant-design-vue,就会报错。——咱也不懂,咱也懒得看。 修改 src/main.js 如下: import { createApp } from 'vue' import App from './App.vue' import Antd from 'ant-design-vue' import 'ant-design-vue/dist/antd.css' createApp(App).use(Antd).mount('#app') 修改 src/components/HelloWorld.vue 如下: <script setup> import {ref} from "vue"; const content = ref('hello electron') function click() { content.value = 'hello vue' } </script> <template> <a-button type="primary" @click="click">click me</a-button> <a-typography-paragraph>{{ content }}</a-typography-paragraph> </template> 搭建后端 后端用什么都行,go、python 都可以。 ...

八月 30, 2022  |  349 字  |  总阅读

【Python】日志 logging

记录 logging 简单用法。 #!/usr/bin/env python # coding=utf-8 import time import logging LOG_PATH = f'./{time.strftime("%Y-%m-%d_%H-%M-%S", time.localtime())}.log' LOG = logging.getLogger(__name__) formatter = logging.Formatter('[%(asctime)s][%(levelname)s][%(filename)s:%(lineno)d][%(threadName)s][%(funcName)s] %(message)s') LOG.setLevel(logging.DEBUG) def init_log(): sh = logging.StreamHandler() sh.setFormatter(formatter) sh.setLevel(logging.DEBUG) fh = logging.FileHandler(LOG_PATH, 'w', encoding='utf-8') fh.setFormatter(formatter) fh.setLevel(logging.DEBUG) LOG.addHandler(sh) LOG.addHandler(fh) init_log() 更多 Formatter 格式配置见 [logging — Python 的日志记录工具 — Python 3.11.1 文档](https://docs.python.org/zh-cn/3/library/logging.html?highlight=logging formatter#logging.LogRecord)。

五月 8, 2022  |  52 字  |  总阅读

【Python】命令行解析器 argparse

记录 argparse 简单用法。 #!/usr/bin/env python # coding=utf-8 import argparse parser = argparse.ArgumentParser() parser.add_argument('-n', '--name', metavar='<NAME>', required=True) parser.add_argument('-a', '--age', metavar='<AGE>', required=True, type=int) args = parser.parse_args() if __name__ == '__main__': print(args) $ ./script.py -n vksir -a 18 Namespace(age=18, name='vksir')

五月 8, 2022  |  37 字  |  总阅读

【Python】Float 运算精度

如果有一天,有人告诉你三个 0.1 加起来不等于 0.3 你会不会觉得很惊讶?但事实如此: >>> 0.1 + 0.1 + 0.1 == 0.3 False 这是为什么呢?这就涉及到了浮点运算的精度问题。 Why 计算机一般以二进制存储数据。在十进制里,0.1 是个精确值,但在二进制里,0.1 是一个无限循环小数: a = 0.1 print('0.', end='') for _ in range(50): a *= 2 print(int(a // 1), end='') a -= a // 1 0.00011001100110011001100110011001100110011001100110 所以从存入的那一刻,其数值就已经从精确值变为了不定值。 在某些需要精确计算的场合,这非常致命。 How 如何解决? 其一是使用 decimal 模块,这里也仅介绍 decimal 模块,在我看来,它几乎满足所有要求。 decimal Decimal is based on a floating-point model which was designed with people in mind. 它模仿人类十进制计算方法进行计算: 绝对精确:0.1 + 0.1 + 0.1 = 0.3 有效位保留:0.30 * 0.200 = 0.06000 四舍五入 Decimal class decimal.Decimal(value="0", context=None) value 可以是整数、字符串、浮点数等。 >>> Decimal(1) # 一般用于表示大数字 Decimal(1) >>> Decimal('0.1') # 用于精确表示浮点数 Decimal('0.1') >>> Decimal(0.1) # 一般无用 Decimal('0.1000000000000000055511151231257827021181583404541015625') >>> Decimal('inf') >>> Decimal('-inf') context ...

八月 7, 2021  |  121 字  |  总阅读

【Python】进程管理之 subprocess

非常强大的子进程管理模块,你想要的它都有。 环境:Windows 10 上一篇文章讲的 Pexpect,功能是不错,但它有的 Subprocess 都能做到,且更加完美。 一个好的子进程管理需要满足什么功能需求? 无阻塞 / 阻塞 标准输入 / 输出 信号发送 / kill 其实也不多。 开始 import subprocess proc = subprocess.Popen('ping 127.0.0.1', shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, stdin=subprocess.PIPE) print(proc.stdout.read().decode('gbk')) # 因为是 windows 系统,默认编码是 ‘gbk’ 正在 Ping 127.0.0.1 具有 32 字节的数据: 来自 127.0.0.1 的回复: 字节=32 时间<1ms TTL=128 来自 127.0.0.1 的回复: 字节=32 时间<1ms TTL=128 来自 127.0.0.1 的回复: 字节=32 时间<1ms TTL=128 来自 127.0.0.1 的回复: 字节=32 时间<1ms TTL=128 127.0.0.1 的 Ping 统计信息: 数据包: 已发送 = 4,已接收 = 4,丢失 = 0 (0% 丢失), 往返行程的估计时间(以毫秒为单位): 最短 = 0ms,最长 = 0ms,平均 = 0ms subprocess 主要有两个运行命令的方法: ...

八月 7, 2021  |  786 字  |  总阅读

【Python】进程管理之 pexpect

相对有名的可用于自动化应用程序交互的模块,可用于 ssh、ftp 等程序。 环境:Ubuntu 20.04 LTS 最近想做一个游戏服务器管理器,以 Python 为主语言,对 Linux 上的常驻程序进行管理。需要满足: 无阻塞启动程序 实时读取程序输出 实时进行程序输入 定时进行程序重启 等功能要求。 要求不是很多,也不是很复杂,但 Pexpect 完成得不是很好。 开始 child = pexpect.spawn('ssh uesr@IP') # 执行命令 child.expect('password:') # 期待程序输出 'password:' child.sendline(my_password) # 向程序输入 my_password spawn() pexpect.spawn(command, args=[], timeout=30, maxread=2000, searchwindowsize=None, logfile=None, cwd=None, env=None, ignore_sighup=False, echo=True, preexec_fn=None, encoding=None, codec_errors='strict', dimensions=None, use_poll=False) command # 推荐直接使用命令字符串 child = pexpect.spawn('ls -latr /tmp') # pexpect 不解释 shell 元字符,如重定向、管道或通配符(>,|,*),因此需要如下使用 child = pexpect.spawn('/bin/bash -c "ls -l | grep LOG > logs.txt"') timeout 默认 30s,超时则报错。 logfile wiki: 日志文件成员打开或关闭日志记录。所有输入和输出都将复制到给定的文件对象。将 logfile 设置为 None 以停止记录。这是默认设置。将日志文件设置为 sys.stdout 以将所有内容回显到标准输出。每次写入后都会刷新日志文件。 ...

七月 27, 2021  |  388 字  |  总阅读