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

华为手机配置显示返回键

使用华为Honor V8习惯了Android屏幕最下方的三个操作按键(返回/Home/列表),三个按键所在的位置被称之为"导航栏"。

最近换了华为Honor 30,想要点返回键时,却发现手机屏幕上没有返回键。手势操作非常不方便,经常误操作。而且有些界面适配的很不好,界面上没有设置回退功能。当缺少系统层面的返回按键的时候,只能强制退出应用。

其实这个返回键是在导航键里,需要设置才会显示。下面几个步骤就教你如何设置返回键:

继续阅读华为手机配置显示返回键

Gradle: 一个诡异的问题(ERROR: Failed to parse XML AndroidManifest.xml ParseError at [row,col]:[5,5] Message: expected start or end tag)

今天同事说他下了一个老版本的Android Studio项目死活编不过,我心想不就是一个项目么,编不过要么就是代码有问题,要么就是依赖库不完整这能有什么问题,于是自己在自己电脑试了下,结果自己也中招了:

继续阅读Gradle: 一个诡异的问题(ERROR: Failed to parse XML AndroidManifest.xml ParseError at [row,col]:[5,5] Message: expected start or end tag)