PyQt WebEngineView interferes with MainMenu

I'm trying to create an application that contains a web browser within it, but when I add the web browser my menu bar visually disappears but functionally remains in place. The following are two images, one showing the "self.centralWidget(self.web_widget)" commented out, and the other allows that line to run. If you run the example code, you will also see that while visually the entire web page appears as if the menu bar wasn't present, you have to click slightly below each entry field and button in order to activate it, behaving as if the menu bar was in fact present.

继续阅读PyQt WebEngineView interferes with MainMenu

macOS Catalina(10.15.4)下PyQt5图标Icon无法显示的问题

macOS下,刚学习PyQt5遇到图标无法显示问题. 先上代码,看下代码就明白了。

setWindowIconQApplication的方法,而不是QWidget的,所以使用app.setWindowIcon设置是对的。

注意在macOS下,图标是显示在程序坞中的!!!

参考链接


MAC下PyQt5图标Icon无法显示的问题

Python+WebKit+HTML开发桌面应用程序

前言

几天前写了一个备份的小工具,用Python写个脚本,也就花个一天的时间搞定,给客户用了一下,对功能很满意,但对界面不满足,想要一个图形界面来管理;
一个备份脚本,有必要整成这样子吗?没办法,谁让是上帝的要求呢,就研究一下;先后找了python的tkinter、pyqt,尝试着画一些界面,虽然功能可以实现,但界面很难看;恰好,在查看pyqt的API文档的时候 ,发现了QWebView组件,据介绍可以实现一个浏览器,并且浏览器中的JS可以与Python代码进行交互。忽然眼前一亮,我不正是我想要的吗!
抽几天时间把工具写完了,目前运行良好;想写篇博客做个记录,也想给需要进行此类开发的朋友做个示例,就把这个工具最核心的内容做了一个DEMO。现在,就把这个小DEMO的开发过程做个说明;

功能简介

这个小DEMO用于显示计算机上的一些信息,显示内容不是主要的,主要为了体现如何用python+HTML开发桌面应用程序。

最终实现的主界面如下:

准备材料

开发工具:Visual Studio Code
开发语言:python 2.7/python 3.7
界面工具包:PyQT4/PyQT5

目录结构


说明:
demoUI.py : python主体程序 ,主要实现窗口创建,加载index.html页面,python与JS的交互;
views/index.html : 主要进行数据展示,及与python交互的js程序

demoUI.py开发

引入的包

前四行代码,主要是引入Qt相关的包,这里使用的PyQt4;
后三行代码,主要是为了处理中文问题,可以忽略,但遇到中文乱码的时候,想起来这句话,把它加上就行了

DemoWin类

DemoWin是整个应用的核心类,主要实现窗体创建,关联与JS交互的槽函数等;

像标题所说,我们将使用WebKit作为页面展示,所以这里的主页面是以QtWebKit.QWebView作为基类

设置窗口大小为800*600,并且加载index.html进行显示

获取网页主框架,按照QT官方文档解释:QWebFrame代表一个网页框架,每一个QWebFrame至少包含一个主框架,使用QWebFrame.mainFrame()获取。
这是进行后续各类操作的基础,类似于JS中只有获取到网页的dom对象,才可以对其中的元素操作一样;

这段代码是关键中的关键!
WinObj类:是封装后用于js调用的槽函数类,后续再详细介绍
addToJavaScriptWindowObject类:第一个参数是对象在javascript里的名字, 可以自由命名, 第二个参数是对应的QObject实例指针。 这样在javascript里就可以直接访问WinObj对象拉, 是不是看上去超级简单?但是这个函数的调用时机是有讲究的,按照官方文档的推荐,是需要在javaScriptWindowObjectCleared信号的槽里调用,才有了以上的代码;里面用了lambda表达式,纯粹是为了减少一个槽函数的定义,你如果觉得不好看或不喜欢,完全可以定义一个槽函数;

WinObj类

下面来重点介绍WinObj类,类型定义如下:

该类封装了JS可直接调用的方法,有一些区别于普通类的地方要注意;

该类必须继承自QObject,而不能是object。

构造函数将mainFrame传进来,主要用于调用js函数(后面将有示例介绍)

getInfo()实现了一个供JS调用的方法,有几下几点要注意:
(1)@QtCore.pyqtSlot(result=”QString”) 用于将python方法转换为供js用的函数,括号里写明数据类型及返回类型;如果没有声明result,则不能返回数据;
(2)self.mainFrame.evaluateJavaScript(‘%s(%s)’ % (‘onGetInfo’,json.dumps(dic_info)))
调用页面中用JS声明的onGetInfo函数(这里仅作一个示例,将查询到的数据进行回调返回)

demoUI.py完整代码下:

index.html

Python 3.7/PyQT5下需要安装 pyQt5

Python 3.7/PyQT5下的代码(注意,Python 2.7/PyQT4是的交互是同步调用的,但是Python 3.7/PyQT5通过QtWebChannel交互是异步的)如下:

index.html

qwebchannel.js

参考链接


PyQt5出现ImportError cannot import name 'QtWebEngineWidgets' from 'PyQt5' 问题解决

今天想在macOS Catalina(10.15.4)系统上,测试一下Python下的QT界面操作,结果在执行

的时候,报告如下错误:

也有可能报告:

查了好久才在Stack Overflow上找到一个回答,说是这个模块被PyQt5移除了,需要单独安装。

安装命令为:

参考链接


Python-PyQt5-PyQtWebEngine采坑记录-- No module named PyQt5.QtWebEngineWidgets

PyQt5出现No module named 'PyQt5.sip'问题解决

今天想在macOS Catalina(10.15.4)系统上,测试一下Python下的QT界面操作,结果在执行

的时候报告错误:

解决方法如下:

参考链接


No module named 'pip._internal.cli.main'

今天,在macOS Catalina (10.15.4)系统上执行升级pip的命令

之后,执行更新命令,报告错误。如下:

解决方法为重新升级安装一次 pip,如下:

参考链接


解决 ModuleNotFoundError: No module named 'pip._internal'

pip批量更新过期的python库

今天看了下系统环境,不少python库都有了更新,再用旧版本库可能已经不适合了,就想把所有的库都更新到最新版本。

查看系统里过期的python库,可以用pip命令

对于列出的过期库,pip也提供了更新的命令

但此命令不支持全局全部库升级。

在stackoverflow上有人提供了批量更新的办法,一个循环就搞定(注意--upgrade后面的空格)

另外的也有人提到用 pip-review ,不想安装就没用

参考链接


pip --upgrade批量更新过期的python库

openpyxl - A Python library to read/write Excel 2010 xlsx/xlsm files


openpyxl特点

  openpyxl(可读写excel表)专门处理Excel2007及以上版本产生的xlsx文件,xls和xlsx之间转换容易 注意:如果文字编码是“gb2312” 读取后就会显示乱码,请先转成Unicode

继续阅读openpyxl - A Python library to read/write Excel 2010 xlsx/xlsm files

使用Python Openssl库解析X509证书信息

X.509 证书结构描述

常见的X.509证书格式包括:

后缀 作用
cer/crt 用于存放证书,它是2进制形式存放的,不含私钥
pem 以Ascii来表示,可以用于存放证书或私钥。
pfx/p12 用于存放个人证书/私钥,他通常包含保护密码,2进制方式。
p10 证书请求
p7r CA对证书请求的回复,只用于导入
p7b 以树状展示证书链(certificate chain),同时也支持单个证书,不含私钥。

对于常见的https证书 一般是用crt或者pem来保存, http证书可点击网页前的锁按钮得到, 并且进行导出

继续阅读使用Python Openssl库解析X509证书信息

OCR-文本图像合成工具

1. Text Recognition Data Generator

Github地址: https://github.com/Belval/TextRecognitionDataGenerator

官方文档:https://textrecognitiondatagenerator.readthedocs.io/en/latest/index.html

安装:

以下根据个人需要:

git clone 解压后进入 /trdg/bin 安装目录:

  • pictures/ 文件夹内存放背景图,可以多添加一些图片用于丰富生成的合成图片;
  • fonts/ 文件夹内 cn/ en/分别存放中、英文字体文件(.ttf格式),可以自己在网上下载不同ttf文件放入文件夹内;
  • string_generator.py 定义了图片上的文本如何选取,可以自行定义(博主在Centos7服务器上中文好像一直有乱码问题,只能修改string 的编码)
  • data_generator.py 是按照给定参数生成图片,最好在里面加上 try / except,大规模合成数据万一有一个case报错就要重新生成,很麻烦,相应的在 bin/trdg 文件中修改相应的生成 labels.txt 的代码,保证一致(这里也可能涉及到保存的中文文本乱码,如果是的话也要修改string的编解码)

生成命令(示例,具体见官方文档):

  • -l cn: language 为中文
  • -c 1000000: 生成1000000张图
  • -d 1: 文字按正弦函数曲线分布(0为不弯曲,1为sin,2为cos)
  • -rs: 图片文字随机选取;
  • -b 3: 背景图像从pictures文件夹中的图像上随机截取(0为高斯白噪声背景,1为白色背景,2为quasicrystal,3为自定义图片)
  • -bl 1 -rbl: 随机模糊,1为模糊的kernel size
  • -tc '#000000, #888888': 颜色变化区间
  • -f 64: 水平分布文字图像的高(像素64)
  • --output_dir 'sin-100w': 输出文件夹

2. Text Render

Github地址:https://github.com/Sanster/text_renderer

参见 github 的 README.md.

3. SynthText

Github地址: https://github.com/ankush-me/SynthText

参考链接