参考文章:
python gui 中三大框架tkinter,wxpython, pyqt
PyQt5(designer)入门指引
PyQt5教程 - QtDesigner窗口设计工具的使用
PyQt5简介
pyqt5是一套Python绑定Digia QT5应用的框架。Qt库是最强大的GUI库之一。
pyqt5做为Python的一个模块,它有620多个类和6000个函数和方法。这是一个跨平台的工具包,它可以运行在所有主要的操作系统,包括UNIX,Windows,Mac OS。pyqt5是双重许可。开发者可以在GPL和商业许可之间进行选择。比起Tkinter的UI布局全靠代码实现,只有15种常用部件,显示效果简陋,PyQt5更有优势。
初识Qt Designer
通常来说,编写GUI有两种方法: 第一种就是直接使用方便快捷的Qt Designer。 第二种就是写代码。在有Qt Designer的情况下,是完全不推荐费时费力手写GUI代码的。
Qt Designer中的操作方式十分灵活,其通过拖拽的方式放置控件可以随时查看控件效果。此外,它还实现了视图和逻辑的分离。
Qt Designer可以所见即所得,并且可以方便的修改并做出各种调整,另外我们也可以通过它生成的代码来学习一些窗口控件的用法。
当然,要做出华丽的界面还是要学代码的。
生成Python代码
使用cmd将目录切到文件所在目录并执行下面的命令。请自行将下面命令中的name替换成文件名
pyuic5 -o name.py name.ui
此时尝试运行刚刚生成的“HelloWorld.py”是没用的,因为生成的文件并没有程序入口。(缺少主程序部分)**因此我们在同一个目录下另外创建一个程序叫做“main.py”,并输入如下内容。在本例中,gui_file_name就是HelloWorld,请自行替换。
import sys
from PyQt5.QtWidgets import QApplication, QMainWindow
import gui_file_name
if __name__ == '__main__':
app = QApplication(sys.argv)
MainWindow = QMainWindow()
ui = gui_file_name.Ui_MainWindow()
ui.setupUi(MainWindow)
MainWindow.show()
sys.exit(app.exec_())
然后运行“main.py”,就能看到刚编写的GUI了。
交互
-
1 获取button的 “ID”
“Property Editor”中可以得知一个个按钮的“objectName” -
2 设置触发
回到另外创建的主程序py中,增添代码。
在“main.py”中“MainWindow.show()”的后面加入下面这样的一行代码:ui.pushButton.clicked.connect(click_success)
解释下:
-
pushButton就是刚刚获取的按钮id
-
clicked就是信号,因为是点击,所以我们这里用clicked
-
click_success就是对应要调用的槽,注意这里函数并不写成click_success() !!!
-
既然刚刚设置了button触发并绑定了一个函数click_success,就要在“main.py”中实现它:
def click_success(): print("成功!")
搞定。
从上可以了解到,QT designer设计UI,保存为ui文件。ui文件生成对应代码xx.py,但我们用另创建的main.py来执行程序。 UI跟逻辑分离的好处就在这里,我们这次不用去管“HelloWorld.py”了,直接运行修改完的“main.py”。
传参 (实例:单向汇率转换器)
- 注意,GUI的main程序编写时,不能通过正常的方式进行传参。 对于传参,有两种解决方案,一种是使用lambda,还有一种是使用functool.partial。在接下来的环节中我们会使用partial:
partial(function, arg1, arg2, ......)
要在程序(main.py)的头部加上下面这行:
from functools import partial
把之前按钮触发一行的代码修改为:
ui.pushButton.clicked.connect(partial(convert, ui))
- 编写convert函数(我将其视为逻辑部分)
def convert(ui):
input = ui.lineEdit.text()## lineEdit为输入框的对象名,再用text()方法
result = float(input) * 6.7
ui.lineEdit_2.setText(str(result))## setText()并转换为str
对GUI应用于原有程序的些许思考
首先要明确的是面向对象编程,类要有,一个个类中的函数也要分明。这样便于代码编写、整理、浏览。
那么如何在原有代码基础上用GUI呈现程序呢?
这里似乎又要借鉴平时使用APP的经历。当我们使用APP时,总是在一个又一个图形窗口中进行选择,按下button、输入(搜索)以及进行其他图形界面的交互时,程序便开始执行对应内容。
所以现在的初步想法是 在有关图形界面交互的函数中 嵌套 原有程序的对应执行函数,但等具体操作时才能确认这种做法是否合理。
小结
今天算是小休息,因为对GUI抱有好奇心,便想了解相关知识。QT designer的确方便强大,还能对ui文件自动生成代码,而且外观也挺标致。UI与逻辑分离是Pyqt5的一大特色,逻辑部分的编写还需在实操中不断学习和熟悉。