当前位置:   article > 正文

《快速掌握PyQt5》第二十五章 Pyinstaller打包_codeformer-gui

codeformer-gui

第二十五章 Pyinstaller打包

25.1 下载Pyinstaller

25.2 了解Pyinstaller命令参数

25.3 打包示例

25.4 小结


《快速掌握PyQt5》专栏已整理成书出版,书名为《PyQt编程快速上手》,详情请见该链接。感谢大家一直以来的支持!祝大家PyQt用得越来越顺!

写完的程序如果要发给别人使用,但对方并没有安装python环境,也没有安装PyQt5库时怎么办呢?最好的解决办法就是将程序打包成可执行文件,这样就算在一台没有安装python环境和PyQt5库的电脑上也可以使用,非常方便。

注:看完本章,如果想要更加深入了解PyInstaller的话,可以去看下笔者的《PyInstaller打包实战指南》

25.1 下载Pyinstaller

windows上下载:

pip install pyinstaller

Linux上下载:

pip3 install pyinstaller

MacOS上下载:

pip3 install pyinstaller

下载完后我们打开终端,输入pyinstaller,若显示如下,则表示安装成功:

25.2 了解Pyinstaller命令参数

这里我们只需要了解几个常用命令即可,详细用法请参考Pyinstaller手册

参数用处
-F将程序打包成一个文件
-w去除黑框
-i添加程序图标

25.3 打包示例

我们就将第五章的登录框小程序拿过来打包作为示例好了,该程序的代码如下:

  1. import sys
  2. from PyQt5.QtWidgets import QApplication, QWidget, QDialog, QLabel, QLineEdit, QPushButton, \
  3. QGridLayout, QVBoxLayout, QHBoxLayout, QMessageBox
  4. USER_PWD = {
  5. 'la_vie': 'password'
  6. }
  7. class Demo(QWidget):
  8. def __init__(self):
  9. super(Demo, self).__init__()
  10. self.resize(300, 100)
  11. self.user_label = QLabel('Username:', self)
  12. self.pwd_label = QLabel('Password:', self)
  13. self.user_line = QLineEdit(self)
  14. self.pwd_line = QLineEdit(self)
  15. self.login_button = QPushButton('Log in', self)
  16. self.signin_button = QPushButton('Sign in', self)
  17. self.grid_layout = QGridLayout()
  18. self.h_layout = QHBoxLayout()
  19. self.v_layout = QVBoxLayout()
  20. self.lineedit_init()
  21. self.pushbutton_init()
  22. self.layout_init()
  23. self.signin_page = SigninPage() # 实例化SigninPage()
  24. def layout_init(self):
  25. self.grid_layout.addWidget(self.user_label, 0, 0, 1, 1)
  26. self.grid_layout.addWidget(self.user_line, 0, 1, 1, 1)
  27. self.grid_layout.addWidget(self.pwd_label, 1, 0, 1, 1)
  28. self.grid_layout.addWidget(self.pwd_line, 1, 1, 1, 1)
  29. self.h_layout.addWidget(self.login_button)
  30. self.h_layout.addWidget(self.signin_button)
  31. self.v_layout.addLayout(self.grid_layout)
  32. self.v_layout.addLayout(self.h_layout)
  33. self.setLayout(self.v_layout)
  34. def lineedit_init(self):
  35. self.user_line.setPlaceholderText('Please enter your username')
  36. self.pwd_line.setPlaceholderText('Please enter your password')
  37. self.pwd_line.setEchoMode(QLineEdit.Password)
  38. self.user_line.textChanged.connect(self.check_input_func)
  39. self.pwd_line.textChanged.connect(self.check_input_func)
  40. def pushbutton_init(self):
  41. self.login_button.setEnabled(False)
  42. self.login_button.clicked.connect(self.check_login_func)
  43. self.signin_button.clicked.connect(self.show_signin_page_func)
  44. def check_login_func(self):
  45. if USER_PWD.get(self.user_line.text()) == self.pwd_line.text():
  46. QMessageBox.information(self, 'Information', 'Log in Successfully!')
  47. else:
  48. QMessageBox.critical(self, 'Wrong', 'Wrong Username or Password!')
  49. self.user_line.clear()
  50. self.pwd_line.clear()
  51. def show_signin_page_func(self):
  52. self.signin_page.exec_()
  53. def check_input_func(self):
  54. if self.user_line.text() and self.pwd_line.text():
  55. self.login_button.setEnabled(True)
  56. else:
  57. self.login_button.setEnabled(False)
  58. class SigninPage(QDialog):
  59. def __init__(self):
  60. super(SigninPage, self).__init__()
  61. self.signin_user_label = QLabel('Username:')
  62. self.signin_pwd_label = QLabel('Password:')
  63. self.signin_pwd2_label = QLabel('Password:')
  64. self.signin_user_line = QLineEdit()
  65. self.signin_pwd_line = QLineEdit()
  66. self.signin_pwd2_line = QLineEdit()
  67. self.signin_button = QPushButton('Sign in')
  68. self.user_h_layout = QHBoxLayout()
  69. self.pwd_h_layout = QHBoxLayout()
  70. self.pwd2_h_layout = QHBoxLayout()
  71. self.all_v_layout = QVBoxLayout()
  72. self.lineedit_init()
  73. self.pushbutton_init()
  74. self.layout_init()
  75. def layout_init(self):
  76. self.user_h_layout.addWidget(self.signin_user_label)
  77. self.user_h_layout.addWidget(self.signin_user_line)
  78. self.pwd_h_layout.addWidget(self.signin_pwd_label)
  79. self.pwd_h_layout.addWidget(self.signin_pwd_line)
  80. self.pwd2_h_layout.addWidget(self.signin_pwd2_label)
  81. self.pwd2_h_layout.addWidget(self.signin_pwd2_line)
  82. self.all_v_layout.addLayout(self.user_h_layout)
  83. self.all_v_layout.addLayout(self.pwd_h_layout)
  84. self.all_v_layout.addLayout(self.pwd2_h_layout)
  85. self.all_v_layout.addWidget(self.signin_button)
  86. self.setLayout(self.all_v_layout)
  87. def lineedit_init(self):
  88. self.signin_pwd_line.setEchoMode(QLineEdit.Password)
  89. self.signin_pwd2_line.setEchoMode(QLineEdit.Password)
  90. self.signin_user_line.textChanged.connect(self.check_input_func)
  91. self.signin_pwd_line.textChanged.connect(self.check_input_func)
  92. self.signin_pwd2_line.textChanged.connect(self.check_input_func)
  93. def pushbutton_init(self):
  94. self.signin_button.setEnabled(False)
  95. self.signin_button.clicked.connect(self.check_signin_func)
  96. def check_input_func(self):
  97. if self.signin_user_line.text() and self.signin_pwd_line.text() and self.signin_pwd2_line.text():
  98. self.signin_button.setEnabled(True)
  99. else:
  100. self.signin_button.setEnabled(False)
  101. def check_signin_func(self):
  102. if self.signin_pwd_line.text() != self.signin_pwd2_line.text():
  103. QMessageBox.critical(self, 'Wrong', 'Two Passwords Typed Are Not Same!')
  104. elif self.signin_user_line.text() not in USER_PWD:
  105. USER_PWD[self.signin_user_line.text()] = self.signin_pwd_line.text()
  106. QMessageBox.information(self, 'Information', 'Register Successfully')
  107. self.close()
  108. else:
  109. QMessageBox.critical(self, 'Wrong', 'This Username Has Been Registered!')
  110. self.signin_user_line.clear()
  111. self.signin_pwd_line.clear()
  112. self.signin_pwd2_line.clear()
  113. if __name__ == '__main__':
  114. app = QApplication(sys.argv)
  115. demo = Demo()
  116. demo.show()
  117. sys.exit(app.exec_())

我们将这个py文件命名为test.py,并将文件放到桌面上,之后打开命令行窗口,cd到桌面目录,输入pyinstaller -F -w test.py

点击回车,开始打包:

结束后我们会发现在桌面上多了两个文件夹和一个spec文件:

而我们想要的可执行程序就在dist文件夹中,双击打开就是我们的程序了:

 

现在你完全可以就将这个test可执行文件放到其他电脑上去运行。

上面打包的可执行文件使用的是默认的图标,我们接下来打包时添加-i参数来给程序加个图标(请注意该用法只对Windows系统有效):

【更新】并不是只对windows系统有效,如果要在mac上面设置图标,图标文件要为icns格式

图标下载:https://www.easyicon.net/download/ico/1210123/64/

将该图标命名为login.ico并放在桌面,跟test.py同路径。同样打开命令行窗口,cd到桌面,输入pyinstaller -F -w -i login.ico test.py 按回车开始打包:

然后在dist文件夹中就可以找到我们打包好的可执行文件:

25.4 小结

1. 打包时可能会出现各种各样的问题,但大部分问题其实只要仔细阅读报错内容就可以解决,不要慌;

2. 笔者汇总了一些用Pyinstaller打包时出现的问题,详情请见:Pyinstaller打包问题之解决方案汇总

欢迎关注我的微信公众号,发现更多有趣内容:

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小丑西瓜9/article/detail/680163
推荐阅读
相关标签
  

闽ICP备14008679号