近段时间在学习Python GUI 编程, 由于视频里用的是 Qt5.4或者甚至之前一点的版本, 而我使用的是Qt5.9版本, 加上视频录制的时间大概是两年前,因而视频里使用的 PyQt5 的版本和我的 PyQT5 版本会不一样,都是 pip install xxx 下载, 不指定版本,就会下载当前最新的库,从而一些 api 使用的参数都不会不一样了.因而, 对于新人来说, 有时候真的不知道哪里出错,想解决又不知道从而解决.

学习的思路

我个人一直认为看视频学习, 比看书本学习要有效率.除非你天资充盈, 一目十行, 举一反三,一点即通,否则还是看视频学习比较好.优质的视频里, 老师会把知识点嚼烂了告诉你, 你只需要听懂了, 自己去多练练, 把它真正的吸收了即可.学习要有一套自己的方法, 怎么样能够保证自己可以真正听懂了,融会贯通了? 还是那句话, 书读百遍,其义自见.因而要学会做笔记, 当学过的知识,后面重新要用的时候,就可以回头看看. 很多当时自己觉得学会了的知识点, 当一年半载后, 遇到与之相关联的知识点时,会让自己重新学习一次这个知识点,恍然间发现自己当时理解错了的一些观念或者没有深入了解的观念等等.
当我们建立起自己的一套学习方法之后, 就可以靠自己去解决大部分学习上的问题了. 我们在网上搜索到的很多学习的视频, 如果是免费的, 一般都会是起码一年多之前的视频了.毕竟人家培训机构也是要吃饭的, 总不可能免费给你最新的视频, 只会把两年前的一些优质视频放出来.此时就会有一些新手在学习的时候, 会遇到版本变更, 库的兼容性问题, 如果你又没有独立解决的能力, 就会放弃,获取想要购买付费视频加问题辅导了.因此, 要做一个白嫖怪, 也是要点技术和耐心的.

Python GUI 编程

什么是 GUI 编程? 可以简单理解为可视化编程, 做出一些图形工具, 比如我们 电脑上的一些桌面软件, 我们常用的 Navicat , QQ, 微信, jemeter 这些都是.
我们学习了 GUI 编程之后, 就可以自己开发一些小软件来玩玩了. 在GUI 开发中, qt5 是比较出名的, 开源,简单好上手, 而 pyqt5 只是通过 python来实现了 qt5, 连api 文档都是通用的.
这里给大家推荐一个我正在看的 PyQt5 视频, 如果你也想学习 python gui 编程的话, 你对着里面学习的时候, 或许遇到的一些问题,就是我已经踩坑和解决了的问题了, 这样解决起来就可以节省一些时间了.
python gui 学习
Qt5 下载
Qt5 安装
这个视频里使用到的环境, Qt5.4 或者更早一点的版本, 视频里是通过安装 anoconda 来安装集成的 python 环境, 而我是使用虚拟环境.
本套课程使用的是 python3.7.0 , 我自己使用的是 3.7.2 .
如果是新手, 还不知道虚拟环境和本地环境的区别的 , 请按照视频里安装, 也许你安装和视频里一样的环境, 就少遇见一些我所碰见的问题.

pyqt designer下没有 QWebview控件

视频里看到有, 但是我的 QtDesigner 里没有? 这是为什么呢?
因为QT5.5 以后已经取消了QWebview控件, 如果要使用, 需要自己去官网下载源码来自己编译,或者安装 多个QT版本, 安装一个QT5.4极其以下的版本.
因此, 就可以知道视频里的Qt5的版本低于5.4 , 而我自己使用的 Qt5 版本是5.9的, 所以才会出现这种问题.

如果QtDesigner里没有QWebView这个主键,但是自己又很想用

首先, 在 Python中安装 PyQtWebEngine, 用 pip 安装(在旧版本里, pyqt5 使用 QtWebKitWidgets 的,但是现在已经弃用这个包了,使用PyQtWebEngine了 )

在 .ui 文件转换后的 .py 文件中, 如下使用

1
2
3
4
5
#创建浏览器控制对象
self.webView=QWebEngineView(self.centralwidget)
self.webView.setGeometry(QtCore.QRect(300,300,451,241)) // 这个坐标可以自行指定
self.webView.setUrl(QtCore.QUrl("https://geekori.com/")) //这个 url 可以自行指定
self.webView.setObjectName("webView")

随后就是建立一个脚本文件, 加载这个 写了有 ui的 py 文件即可.

QLable 的基本使用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
# QVBoxLayout 是垂直布局
from PyQt5.QtWidgets import QApplication,QVBoxLayout,QLabel,QMainWindow,QWidget
# QPixmap 用于Picture, QPalette 是调色板
from PyQt5.QtGui import QPixmap, QPalette
# 很多QT的基本功能, 包括颜色等
from PyQt5.QtCore import Qt
import sys

class QlableDemoUse(QMainWindow):
def __init__(self):
super().__init__()
self.setUi()

def setUi(self):
self.setWindowTitle("Qlable使用")
self.resize(500, 600)
lable1 = QLabel(self)
lable2 = QLabel(self)
lable3 = QLabel(self)
lable4 = QLabel(self)

lable1.setText("<font color=yellow>文本标签</font>")
# 允许设置背景颜色
lable1.setAutoFillBackground(True)
# 创建一个调色板
palette = QPalette()
# # 设置lable的背景颜色
# palette.setColor(QPalette.window, Qt.blue) 视频里旧版本的用法,现在的pyqt5版本用不了
# PyQt55.15.2 这是我使用的版本
palette.setColor(QPalette.Background, Qt.blue)
lable1.setPalette(palette)
# 设置文本的对齐样式
lable1.setAlignment(Qt.AlignCenter)
# 不设置文本对齐样式,就是默认从左边对齐
lable2.setText("<a href= '#'>欢迎使用python GUI</a>")
lable2.setAlignment(Qt.AlignLeft)
# label3 设置添加图片
lable3.setPixmap(QPixmap("../images/python.jpg"))
lable3.setAlignment(Qt.AlignCenter)
# 当为True的时候, 就只会打开浏览器去到对应的链接,不会再触发槽
# 默认是False, 不设置就是False, 就会触发槽, 打开浏览器和触发槽只能触发一个
lable4.setOpenExternalLinks(True)
lable4.setText("<a href='https://123.twinkstar.cn/'>看看百度</a>")
lable4.setAlignment(Qt.AlignRight)
lable4.setToolTip("这是一个超链接")
# 绑定信号与槽
lable2.linkHovered.connect(self.linkHovered)
lable4.linkActivated.connect(self.linkClicked)
# 设置垂直布局
vbox = QVBoxLayout()
vbox.addWidget(lable1)
vbox.addWidget(lable2)
vbox.addWidget(lable3)
vbox.addWidget(lable4)
# 创建一个主框架
mainFrame = QWidget()
# 往主框架里添加布局
mainFrame.setLayout(vbox)
# 充满整个屏幕
self.setCentralWidget(mainFrame)

def linkHovered(self):
print("当鼠标划过lable2的时候")

def linkClicked(self):
print("当鼠标点击lable4标签的时候")

if __name__ == '__main__':
app = QApplication(sys.argv)
window = QlableDemoUse()
window.show()
sys.exit(app.exec_())

其实就是 调色板设置背景颜色的那个api 变了, 其他并无变化.