本篇不讲什么画UI的代码心得...本来我也不喜欢画ui
也不扯信号与槽那些概念,反正就是讲一下快速上手的方法,如何快速实现想要的功能。
反正正统画UI教程一搜一大堆,比如这里讲的很详细了。
不得不说,pyQt
比C++
的Qt
简单好多...
首先安装,只需要pip install pyqt5
就好,不需要去官网下载什么东西。
不过这样安装完看上面链接教程开始写代码的话,就是走困难模式了。
画UI最方便当然是用控件拖来拖去,用代码多麻烦累死人。
所以暂时不要管上面的链接教程,接下来还需要用pip install pyqt5-tools
下好qtdesigner
,打开进行拖控件的画UI过程。
不要问在哪里,在下好的包文件夹里...找不到就从import pyQt5
的源码里跳转打开pyqt5
的文件夹去再往前找pyqt5-tools
文件夹进去就有这个exe了,什么你用的notepad++
不支持跳转赶紧换vscode或者重量级的pycharm吧。
不过这个软件好像是英文的哎,虽然网上有的是中文可能是另下的...要有起码的英文水平,也不难实在不行就对着查单词。
像什么这个软件似乎做不出来的图标和浮动提示框在上面的教程有可以在后期用代码补一下。
画完左上角保存到桌面或者其他地方后,在那个目录只需要pyuic5 -x untitled.ui -o test.py
就可以生成能直接运行的代码了。不加-x
的话要改成pyuic5 -o test.py untitled.ui
,不过这样的话还不能直接运行,要在下面加好几行代码:
if __name__ == "__main__":
import sys
app = QtWidgets.QApplication(sys.argv)
MainWindow = QtWidgets.QMainWindow()
ui = Ui_MainWindow()
ui.setupUi(MainWindow)
MainWindow.show()
sys.exit(app.exec_())
但是用第一条命令的话,这些代码是自动补上的,所以更方便。
下面总结一下用到的几个控件,注意要对Python
的类与对象有一定了解。
输入框(textEdit)
一般拿来输入当作input
用。也可以用来显示,编辑,再保存。
显示的方法是在当前代码类中定义一个函数
def setTextEdit(self, category: str):
self.textEdit.setText('...测试.......(pyQt的所有显示文字都可以用html语法)')
括号里可以是功能函数的返回值,于是就输出到界面上了。其实连接逻辑实现函数就有信号与槽的概念了...从实际功能转到为它取1个名字比较容易接受。
按钮(pushButton)
点击触发其他函数运行
self.pushButton.clicked.connect()
括号里是要运行的类内函数的名字,就像用多线程threading
等模块一样,不需要带括号。如果那个函数不止self一个参数,就用lambda表达式然后是完整的函数带括号带参数,当然还有别的方法,不过lambda表达式比较直观
self.pushButton.clicked.connect(lambda: self.reloadTextEdit(args1, args2, ...))
文本浏览框(textBrowser)
用来显示文本,不可编辑。
不清空的显示用的比较多,实际上是一个列表持续append
每行数据。也就是说这个列表元素必须是str
类型。
import xxx # 当前目录下的其他.py文件,提供逻辑功能实现
class Ui_MainWindow(object):
def setupUi(self, MainWindow):
pass # 这里就省略了
def func(self):
for i in xxx.afunc(self.textEdit.toPlainText()):
self.textBrowser.append(i)
这个func()
一般就是上面pushButton
的连接函数之一了。
self.textEdit.toPlainText()
相当于input()
。
很多时候其实输入.
之后等ide弹出相关的方法,直接输text
看看还剩下啥就猜得到需要用啥方法了。当然ide一定要有这个功能,虽然我用的vscode还不算ide,嘛vs2017和pycharm也都可以做到。
下拉框(comboBox)
可以直接在初始化时添加一系列元素,使用self.comboBox.additem()
方法,括号内是要添加的元素,或者用self.comboBox.additems()
方法,括号内可以是一个列表,所有列表内的元素都变成下拉选项之一。
每次选定下拉元素后,当前选项是self.comboBox.currentText()
使用self.comboBox.activated.connect()
来激活选项。
class Ui_MainWindow(object):
def setupUi(self, MainWindow):
self.comboBox = QtWidgets.QComboBox(self.centralwidget)
self.comboBox.setGeometry(QtCore.QRect(700, 180, 240, 30))
self.comboBox.setObjectName("comboBox")
self.comboBox.addItems(...) # 里面是一个list
self.comboBox.activated.connect(lambda: self.setTextEdit(self.currentCategory()))
pass # 这里就省略了
def currentCategory(self):
return self.comboBox.currentText()
def setTextEdit(self, category: str):
self.textEdit.setText('...')
图标
上面链接里入门教程就有图标和悬浮提示,后者没啥问题就不写了,前者如果不熟悉类的话可能一下子写不对。
def retranslateUi(self, MainWindow):
pass
MainWindow.setWindowIcon(QtGui.QIcon('icon.png'))
pass
其实大致上的代码是在最下面的retranslateUi
函数(这是ui转化成代码时自动生成的函数)里加一行就行,icon.png
是放在当前目录下的图片文件名。打包后的话要和exe文件放在一个文件夹。
暂时就用到以上这些,像是label
这样超级基础的玩意就算了不写了。
最后,用pyinstaller
打包的话,直接打包由于不认识pyqt
的动态链接库会有一些错误,应该这样
pyinstaller --paths C:\Users\...\AppData\Local\Programs\Python\Python36\Lib\site-packages\PyQt5\Qt\bin -F -w test.py xxx.py
paths
后面的路径是自己电脑里pyqt
的bin
文件夹位置,一般默认只要把上面的省略号换成自己用户名就好了。
多个文件打包只需要空格分开就好。
-F
加上后会只生成一个exe文件,否则会生成很多其他文件。
-w
加上后运行程序不会出现命令行背景。也就是说看不到如果崩溃时的错误信息,只是给用户用的。
好了,以上代码虽然足够随便写一个软件出来...
但是有两个严重问题:
- 逻辑实现和UI实现代码没有分开在不同线程工作,如果逻辑实现运行比较久的话程序就卡住了。再鼠标点击下可能就崩溃了。
- 直接依靠拖动定位的话,在不同分辨率上的显示效果不一样,可能错位或者部分显示被吃了,以及拉伸界面不会自动空间跟着过去。
哎反正我只有三天时间强行做出来的这么一个东西,一开始完全一脸懵比状态啥也不知道,就暂时不要要求太高了。
而且客户端时代早已过去,web才是未来。