PyQtClient例子客户端
对本博客所写的项目 PyQt 例子进行一个客户端的编写,客户端主要实现一些动画效果,更换皮肤,运行例子等功能。
# 项目地址
# Windows 客户端下载
包含部分例子
不包含例子
百度网盘 提取码: nadv
# 效果图
PyQt学习心得
在学习 PyQt 的过程中由于资料的缺乏或者没有中文导致大多数人感叹资料太少,学习困难,又或者急于求进,赶鸭子上架的情况,此时有系统的学习方法很重要。每个人都需要有自己的学习方法,别人的学习方法并不一定适合自己但可以采纳一些。笔者在这里列举了一些当初自己自学的一些心得和方法,希望帮助大家建立一套自己的学习 PyQt 的方法,提高自身的学习能力。
# Python 基础
在学习和使用 PyQt 之前需要熟练使用 Python,经过对 QQ 群里经常提问的问题的分析,发现大部分人对 Python 中的基础知识掌握不牢固导致很多基础问题,如果要想更好的使用 Python 以及它的扩展必需要进行系统的学习。这里列举一下常用的知识点。
类 参考资料
类的继承
类的多继承
类方法重写 参考资料
类中的 super 函数 参考资料
函数调用 / 参数类型
对象调用 (参考第 1 点)
必须熟练掌握上面的知识点后入门 PyQt 才比较容易,如果初学者对上面的知识点还不是很了解,本文不适合继续往下阅读。
# 设计师
Qt 设计师除了方便快速设计一些简单的界面外,其实笔者觉 ...
pytest-qt 测试模态窗体.
步骤分别是 :
点击 开始扫描 弹出 选择路径窗口;
勾选路基;
3. 点击确定;
大概想测一下这个界面 :
步骤分别是 :
点击 开始扫描 弹出 选择路径窗口;
勾选路基;
3. 点击确定;
需要测试的函数 :
测试函数 :
可以发现断言失败 .
官方文档:测试模态窗体.
https://pytest-qt.readthedocs.io/en/latest/note_dialogs.html
用的是官方的 monkeypatch 方式 .
大致意思就是替换 FileSelectPathDialog 类的 exec 函数.
如何在Mac M1上快速安装PyQt5
由于官方并没有在 M1 上编译 PyQt 导致安装存在一些问题。
M1 上的 Python 不能直接使用 x64 的 PyQt5。但是 M1 上可以运行 x64 的 Python。所以通过安装 x64 的 Python 然后再安装 PyQt5 即可。
1. 安装 Python
python-3.9.13-macosx10.9.pkg
2. 勾选自定义同时只勾选安装 pip
3. 设置 pip 源
/Library/Frameworks/Python.framework/Versions/3.9/bin/pip3 install pqi
/Library/Frameworks/Python.framework/Versions/3.9/bin/pqi use tuna
4. 安装 PyQt5
/Library/Frameworks/Python.framework/Versions/3.9/bin/pip3 install PyQt5
5. 测试
/Library/Frameworks/Python.framework/Versions/3.9/bin/python3
📢📢� ...
python 判断屏幕等宽字符串的长度
判断屏幕等宽字符串的长度?
判断屏幕等宽字符串的长度?
【新手】重庆 - 搬砖 - NoWait 22:41:50 @北京 - BUG 开发 - 黑择明 求指点
【专家】北京 - BUG 开发 - 黑择明 22:43:04 fontMetrics
【专家】 https://pyqt.site (892768447) 22:43:54 QFontMetrics
【专家】 https://pyqt.site (892768447) 22:44:09 通过 QLabel.font ().fontMetrics () 得到
【新手】重庆 - 搬砖 - NoWait 22:52:00
https://stackoverflow.com/questions/35771863/how-to-calculate-length-of-string-in-pixels-for-specific-font-and-size
【新手】重庆 - 搬砖 - NoWait 22:53:15 感觉和 fontMetrics 应该是差不多的
【专家】北京 - BUG 开发 - 黑择明 ...
修改pyuic代替pyside2-uic.
修改 pyuic 代替 pyside2-uic
修改 pyuic 代替 pyside2-uic.
最近看到挺多人用 pyside2 的 uic 编译 ui 文件有问题 .
写个解决办法.
首先,
pip install qtpy ,
这个是兼容 pyqt5 和 pyside2 的,无缝转换 .
然后,
修改 pyqt5 的 uic ,
最后用 pyuic5 , 生成 Ui_XXX.py 文件 .
python 状态机模块
用状态来取代 if…else 判断。
GUI 涉及到挺多的状态改变,以前一直用 if…else 来判断,最近读了设计模式,发现有个状态模式,随后发现了状态机这个东西 .
python 的状态机模块挺多的,不过好像很多都不更新了.
推荐 2 个状态机模块,但是也没有太深入的使用经验,就跑跑例子,以后有更详细的 pyqt 例子再补上 .
1: pip install python-statemachine
官方例子 : https://github.com/fgmacedo/python-statemachine
2. pip install state_machine
官方例子 : https://github.com/jtushman/state_machine
1 的 最近一次更新在 6 个月以前,使用 类继承 和 mixin 方式,不过有些地方不如 2 个人性化;
2 的设计更人性化一些,包括状态改变 before 和 after , 不过由于是装饰器实现的动态增加属性,有些地方编辑器智能提示可能就靠不上了.
两者实现实现方式不一样,有兴趣可以读读源码 .
qt 内 ...
在pyqt中使用python全局钩子模块
在某些时候需要为自己的软件增加全局键盘监听,比如软件最小化隐藏后可以通过热键唤醒,又或者比如像 QQ 一样可以全局热键截图。这里介绍几个方法实现在 PyQt 中使用 Python 全局钩子模块实现全局热键功能。
pyHook3
安装命令 : pip install pyhook3
https://blog.csdn.net/q871063970/article/details/86648386
似乎将 pyhook 支持 py3 版本的了?没有太多研究.
缺点:只支持 win 平台.
2. keyboard & mouse
安装命令: pip install keyboard mouse
from PyQt5 import QtGui, QtWidgets, QtCore
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
import keyboard
class Window(QWidget):
def __init__(self, ...
像读文章一样读源码
使用 snoop, 像读文章一样读源码。
不得不说 开源项目没有一个提纲 , 看起来太操蛋了。问了作者, 作者说 , 你运行下主函数, 然后慢慢跟 。。。
没有目的地概览 , 不知不觉就追究到细节里面去了。
所以这一篇文章的目地就是 , 如何在没有提纲的情况下 , 能更好的只关注流程 , 而不是细节 。
开始 :
python DEBUG 模块介绍 :
前段时间看过挺多文章提到 pysoonper 这个调试模块,有兴趣的可以百度一下.
个人尝试了一下,篇幅过大的 DEBUG 不适合用 pysoonper , 因为没有缩进!
这几天偶然遇到一个二次封装的模块 snoop, 完美地解决了这个问题.
操作步骤 :
1 . 在 eric6.py 的 main() 函数上加 snoop 装饰器;
2 . 用 vscode 打开 eric6start_.log 文件 (8 层深度 log 文件 34W 行,pycharm 对大文件支持很差);
发现可以折叠 , 但是最大可折叠等级只到 5 级 , 而且无法对对应等级折叠 , 有点遗憾 。也许是.log 格式选得不 ...
python 获取子进程print信息
在 PyQt 中使用子线程读取子进程 Python 脚本的 print 输出流内容。
问题所在:
如果模块都由自己开发, 正常操作
但是因为不能改,所以只能拦截:
代码:
pythonPath = self.pythonPath_cb.currentText()
if suffix == "py":
# 首次
self.pyCommand = [pythonPath, path]
self.modifiedReloadPython(path)
def modifiedReloadPython(self, path_):
os.chdir(os.path.dirname(path_))
# 子进程调用
self.p = subprocess.Popen(self.pyCommand, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
# self.stdoutWorker.p = self.p
self.stdoutWorker = Worker(self.p)
...