之前写了两篇GUI的文章,今天继续填坑。
python GUI界面设计的那些事
python GUI界面设计的那些事(二)
GUI程序其实和普通程序其实就是多了一个界面,而最麻烦的就是用代码实现设计的GUI界面。
通常设计界面我们会有如下几个步骤:
1.首先会确定程序的功能。
2.然后确定使用哪些组件
3.之后手绘一个大概的界面布局。
4.完成后可以自己列一个组件清单以及属性设置。
组件类型 | 组件命名 | 属性 | 属性值 |
---|---|---|---|
屏幕 | window | 标题 | 音乐播放器 |
宽高 | 640*480 | ||
背景 | gray | ||
按钮 | button_1 | 文本内容 | 播放 |
滑块 | slider | 最小值 | 0 |
最大值 | 100 |
确定好后基本上就可以去实现了,如果是用tkinter 的话,那么就只能通过代码慢慢写了。
这里我们就不用tkinter了,使用我们的QtCreator 界面设计工具,直接拖拽完成。
预览效果:
设计界面的过程,和程序没有任何关系,完全是按照我们的图纸(界面布局以及组件清单属性)拖拽实现的。
问题来了,这个界面要怎么用呢,怎样和我们的代码结合到一起呢?
这就得介绍上次说的的Qt,PyQt5或者PySide2。
Qt 是由Qt Company开发的跨平台C 图形用户界面应用程序开发框架,实现了一套代码可以在所有操作系统、平台和屏幕类型上部署,从台式机、嵌入式系统到可穿戴设备、移动设备。
比如奔驰的车载信息娱乐系统
LG的WebOS
更多可以看官网介绍:https://www.qt.io/zh-cn/
不过Qt 使用的是C 语言,为了能够让 python 使用上Qt 的强大功能,出现了PyQt5 和 PySide2 ,通过这两个库就能够使用python 调用Qt 的功能了。
因此在python中,它的名字不叫Qt,而是叫做PySide2,但是功能是一样的,当然还有其它公司开发的PyQt5,功能也是一样的。至于为什么会有这么多不同名字和版本,感兴趣的可以自己去了解,我们这里要使用的是PySide2,它是Qt5在python中的版本。
而刚才设计界面的QtCreator 工具其实Qt网站上的一个软件,用来帮助我们可视化的设计界面,省去了手动编写代码实现界面的过程。
在使用前,我们需要先安装pyside2模块,这里有两种方法,直接使用pip install PySide2安装,第二种使用国内的镜像安装,速度会比较快。
首先,我们使用pyside2官方网站上的一个案例程序,看看一个最基本的GUI程序是怎样,这里自己编写的时候一定要注意字母大小写的一个问题。
效果
可以看到,PySide2 和 tkinter 类似,也可以通过代码来实现界面设计,不过那样太麻烦了。
在PySide2中,有一个转换工具,可以将设计好的界面,直接转换成布局的python 代码.
可以在我们安装python环境的地方,看到一个Scripts文件夹,里面有一个pyside2-uic.exe的程序。
接着启动终端,通过调用pyside2-uic 生成我们的一个py文件,具体使用如下,-o 后面接的是我们要生成的文件名字。
运行后,桌面上会有一个py结尾的文件。
打开后确实是python代码
完整代码
代码语言:javascript复制# -*- coding: utf-8 -*-
# Form implementation generated from reading ui file 'music_player.ui',
# licensing of 'music_player.ui' applies.
#
# Created: Tue Apr 6 22:43:12 2021
# by: pyside2-uic running on PySide2 5.13.0
#
# WARNING! All changes made in this file will be lost!
from PySide2 import QtCore, QtGui, QtWidgets
class Ui_MainWindow(object):
def setupUi(self, MainWindow):
MainWindow.setObjectName("MainWindow")
MainWindow.resize(380, 220)
self.centralwidget = QtWidgets.QWidget(MainWindow)
self.centralwidget.setObjectName("centralwidget")
self.listView = QtWidgets.QListView(self.centralwidget)
self.listView.setGeometry(QtCore.QRect(10, 10, 250, 150))
self.listView.setObjectName("listView")
self.label = QtWidgets.QLabel(self.centralwidget)
self.label.setGeometry(QtCore.QRect(10, 170, 60, 25))
font = QtGui.QFont()
font.setPointSize(16)
self.label.setFont(font)
self.label.setAlignment(QtCore.Qt.AlignCenter)
self.label.setObjectName("label")
self.label_2 = QtWidgets.QLabel(self.centralwidget)
self.label_2.setGeometry(QtCore.QRect(180, 170, 60, 25))
font = QtGui.QFont()
font.setPointSize(16)
self.label_2.setFont(font)
self.label_2.setAlignment(QtCore.Qt.AlignCenter)
self.label_2.setObjectName("label_2")
self.horizontalSlider = QtWidgets.QSlider(self.centralwidget)
self.horizontalSlider.setGeometry(QtCore.QRect(75, 170, 100, 25))
font = QtGui.QFont()
font.setPointSize(14)
self.horizontalSlider.setFont(font)
self.horizontalSlider.setOrientation(QtCore.Qt.Horizontal)
self.horizontalSlider.setObjectName("horizontalSlider")
self.pushButton = QtWidgets.QPushButton(self.centralwidget)
self.pushButton.setGeometry(QtCore.QRect(270, 50, 100, 25))
font = QtGui.QFont()
font.setPointSize(12)
self.pushButton.setFont(font)
self.pushButton.setObjectName("pushButton")
self.pushButton_2 = QtWidgets.QPushButton(self.centralwidget)
self.pushButton_2.setGeometry(QtCore.QRect(270, 90, 100, 25))
font = QtGui.QFont()
font.setPointSize(12)
self.pushButton_2.setFont(font)
self.pushButton_2.setObjectName("pushButton_2")
self.pushButton_3 = QtWidgets.QPushButton(self.centralwidget)
self.pushButton_3.setGeometry(QtCore.QRect(270, 10, 100, 25))
font = QtGui.QFont()
font.setPointSize(12)
self.pushButton_3.setFont(font)
self.pushButton_3.setObjectName("pushButton_3")
self.comboBox = QtWidgets.QComboBox(self.centralwidget)
self.comboBox.setGeometry(QtCore.QRect(270, 130, 100, 25))
font = QtGui.QFont()
font.setPointSize(12)
self.comboBox.setFont(font)
self.comboBox.setObjectName("comboBox")
self.comboBox.addItem("")
self.comboBox.addItem("")
self.comboBox.addItem("")
self.pushButton_4 = QtWidgets.QPushButton(self.centralwidget)
self.pushButton_4.setGeometry(QtCore.QRect(270, 170, 100, 25))
font = QtGui.QFont()
font.setPointSize(12)
self.pushButton_4.setFont(font)
self.pushButton_4.setObjectName("pushButton_4")
MainWindow.setCentralWidget(self.centralwidget)
self.statusbar = QtWidgets.QStatusBar(MainWindow)
self.statusbar.setObjectName("statusbar")
MainWindow.setStatusBar(self.statusbar)
self.retranslateUi(MainWindow)
QtCore.QMetaObject.connectSlotsByName(MainWindow)
def retranslateUi(self, MainWindow):
MainWindow.setWindowTitle(QtWidgets.QApplication.translate("MainWindow", "音乐播放器", None, -1))
self.label.setText(QtWidgets.QApplication.translate("MainWindow", "00:00", None, -1))
self.label_2.setText(QtWidgets.QApplication.translate("MainWindow", "00:00", None, -1))
self.pushButton.setText(QtWidgets.QApplication.translate("MainWindow", "上一首", None, -1))
self.pushButton_2.setText(QtWidgets.QApplication.translate("MainWindow", "下一首", None, -1))
self.pushButton_3.setText(QtWidgets.QApplication.translate("MainWindow", "打开文件夹", None, -1))
self.comboBox.setItemText(0, QtWidgets.QApplication.translate("MainWindow", "顺序播放", None, -1))
self.comboBox.setItemText(1, QtWidgets.QApplication.translate("MainWindow", "单曲循环", None, -1))
self.comboBox.setItemText(2, QtWidgets.QApplication.translate("MainWindow", "随机播放", None, -1))
self.pushButton_4.setText(QtWidgets.QApplication.translate("MainWindow", "播放", None, -1))
总结:
通过使用QtCreator界面设计工具可以非常高效的帮助我们设计UI界面,通过转换工具,可以将界面ui文件变成一个py文件,这个文件可以作为一个模块文件导入,从而实现了界面代码和功能代码的分离。
好了,填坑到此结束了,之后具体的PySide2 界面设计以及具体的实践案例将会通过视频的方式发布,这三篇只是让大家对GUI程序有个认知,后面的就是实操部分了。
(全文完)
欢迎转载,转载请注明出处! 欢迎关注公众微信号:叶子陪你玩编程