Python 开发图形界面程序

用 Python 语言开发图形界面的程序,有2种选择:

  • Tkinter

    基于Tk的Python库,这是Python官方采用的标准库,优点是作为Python标准库、稳定、发布程序较小,缺点是控件相对较少。

  • PySide2/PySide6

    基于Qt 的Python库,优点是控件比较丰富、跨平台体验好、文档完善、用户多。

    缺点是 库比较大,发布出来的程序比较大。

如果是开发小工具,界面比较简单,可以采用Tkinter。

如果是发布功能比较多的正式产品,采用基于Qt的 PySide2/PySide6 。

本文介绍的是使用 PySide2 开发Python程序的图形界面。

安装 PySide2

javascript 复制代码
pip install pyside2

也可以指定国内的安装源,下载速度更快。

javascript 复制代码
pip install pyside2 -i https://pypi.douban.com/simple/

Python 3.11 不能安装 PySide2,可以安装PySide6;
如果要安装 PySide2,只能使用 Python 3.10 或者更早的 Python版本。

PySide2官方文档 https://doc.qt.io/archives/qtforpython-5.12/PySide2/QtWidgets/index.html#module-PySide2.QtWidgets

一、PySide2安装完成后,在python安装目录下Scripts文件夹,运行pyside2-designer.exe进入图形设计。



保存图形界面生成 login.ui 文件(前缀可以自定义)

二、把 .ui 文件转换成 .py 文件供python程序调用

执行命令: pyside2-uic login.ui > login_ui.py

把UI文件转化为包含界面定义的Python代码文件,具体步骤如下:

  1. 把login.ui文件复制到python目录Scripts文件夹,在空白处按着shift + 右击鼠标,选择【在此处打开命令窗口】。
  1. 运行命令后没有报错,说明正确生成了py文件。
  2. 把login_ui.py文件复制到python项目以方便调用。

三、调用login_ui.py 以及编写逻辑代码

javascript 复制代码
import sys
from PySide2.QtWidgets import QApplication, QMainWindow
# 导入login_ui.py 文件 Ui_MainWindow 类
from login_ui import Ui_MainWindow

# 注意 这里选择的父类 要和你UI文件窗体一样的类型
# 主窗口是 QMainWindow, 表单是 QWidget, 对话框是 QDialog
class MainWindow(QMainWindow):

    def __init__(self):
        super().__init__()
        # 使用ui文件导入定义界面类
        self.ui = Ui_MainWindow()
        # 初始化界面
        self.ui.setupUi(self)
        # 调用自定义方法
        self.ui.pushButton_login.clicked.connect(self.handleCalc)
        self.ui.pushButton_exit.clicked.connect(self.eixtSys)

    def handleCalc(self):
        # 利用lineEdit控件对象text()函数获取界面输入
        username = self.ui.lineEdit_user.text()
        password = self.ui.lineEdit_pwd.text()
        # 利用textEdit控件对象setText()函数设置界面显示
        self.ui.textEdit_list.setText("登录成功!\n" + "用户名是: " + username + "\n密码是: " + password)

    def eixtSys(self):
        sys.exit()


app = QApplication([])
mainw = MainWindow()
# 将窗口控件显示在屏幕上
mainw.show()
# 程序运行,sys.exit方法确保程序完整退出。
sys.exit(app.exec_())



运行代码

四、使用Pyinstaller转换.py文件为.exe可执行程序

pyinstaller其实就是把python解释器和脚本打包成一个可执行文件,和编译成真正的机器码是完全两回事。所以打包不一定会提高运行效率,可能会降低运行效率,但是好处是在运行者机器上不用安装python和脚本所依赖的库。

输入指定的脚本后,首先pyinstaller会分析该脚本所依赖的其他依赖,然后进行查找、复制,把所有相关的依赖都收集起来并惊醒加密处理,包括python解释器,最后把这些文件放在一个目录下,或者打包到一个可执行文件。然后就可以直接运行所生成的可执行文件。

使用pyinstaller打包生成的可执行文件,只能在和打包机器系统相同的环境下运行。32位python环境打包的程序可以运行在32/64位windows系统上。64位python环境打包的程序只能运行在64位windows系统上。所以如果想打包程序的话,建议使用32位python环境打包。

注意事项

1、待转换的.py文件绝对路径最好不要包含中文字符,不然容易出现一些莫名其妙的问题。

2、python中需要有.py文件中用到的第三方库。否则在转换后的.exe文件中会出现不符合预期的结果。

安装pyinstaller库,打开cmd命令行窗口,输入:pip install pyinstaller

where pyinstaller 命令查看安装路径

在项目内打开CMD ,运行命令 pyinstaller -F QT2.py -w

可执行文件在 dist 目录

pyinstaller 实例说明

javascript 复制代码
pyinstaller -F myScript.py -w

参数区分大小写

html 复制代码
-F 表示生成单个可执行文件,常用。
-w 小写 表示去掉控制台窗口,这在GUI界面时非常有用。不过如果是命令行程序的话那就把这个选项删除吧!
-p 小写 表示你自己自定义需要加载的类路径,一般情况下用不到。
-i 表示可执行文件的图标。注意:图片后缀必须是.ico-c,console,-nowindowed:使用控制台,无窗口(默认)
-D 创建一个目录,包含EXE文件,但会依赖很多文件(默认选项)。

使用问题:

1、如果Python脚本使用到了第三方库,如何打包?

python 复制代码
 方法一:将第三方库对应的包复制到待打包python脚本的同目录下,再执行打包命令。
 方法二:pyinstaller -F  路径\文件名.py 路径\文件名.py 

2、我的python脚本主要是命令行输出,但是程序执行完就退出无法查看相关信息,如何处理?

python 复制代码
在python脚本最后一行添加命令:
os.system('pause') 或者 raw_input('Press enter any key to exit...')

3、 我想给我的打包后的执行程序换个图标,如何处理?

python 复制代码
  使用参数-i :  pyinstaller -F -i tupian\qq.ico myScript.py 
  图标文件后缀名必须是.ico

4、程序运行出现CMD窗口,如何去除?

python 复制代码
  带上参数-w : pyinstaller -F myScript -w 
相关推荐
凤枭香9 分钟前
Python OpenCV 傅里叶变换
开发语言·图像处理·python·opencv
测试杂货铺16 分钟前
外包干了2年,快要废了。。
自动化测试·软件测试·python·功能测试·测试工具·面试·职场和发展
艾派森21 分钟前
大数据分析案例-基于随机森林算法的智能手机价格预测模型
人工智能·python·随机森林·机器学习·数据挖掘
小码的头发丝、1 小时前
Django中ListView 和 DetailView类的区别
数据库·python·django
Chef_Chen2 小时前
从0开始机器学习--Day17--神经网络反向传播作业
python·神经网络·机器学习
千澜空2 小时前
celery在django项目中实现并发任务和定时任务
python·django·celery·定时任务·异步任务
斯凯利.瑞恩2 小时前
Python决策树、随机森林、朴素贝叶斯、KNN(K-最近邻居)分类分析银行拉新活动挖掘潜在贷款客户附数据代码
python·决策树·随机森林
yannan201903132 小时前
【算法】(Python)动态规划
python·算法·动态规划
蒙娜丽宁3 小时前
《Python OpenCV从菜鸟到高手》——零基础进阶,开启图像处理与计算机视觉的大门!
python·opencv·计算机视觉
光芒再现dev3 小时前
已解决,部署GPTSoVITS报错‘AsyncRequest‘ object has no attribute ‘_json_response_data‘
运维·python·gpt·语言模型·自然语言处理