我如何让我的 PyQt5、Python33 Windows7x64 在 virtualenv 中工作:
首先,确保您已匹配所有内容的 64 位或 32 位版本。我正在 64 位平台上开发并使用 64 位版本。我没有用 32 位完全测试这个。请仔细阅读。
- 使用 Windows 安装程序二进制文件安装了 Python33 x64。
- 使用 MSI 安装程序从河岸安装 PyQt5 x64 到默认的Python33。PIP 将不起作用。
- 使用 Python33 作为基础创建一个 virtualenv,没有站点包。
- 将 PyQt5 文件夹从 Python33/Lib/site-packages/ 复制到您的 virtualenv/Lib/site-packages。
- 不要删除 PyQT5 文件夹!
确保 PyQt5 在基础 Python33 安装上工作:
from PyQt5 import QtCore, QtGui, QtWidgets
创建一个主窗口并启动它。如果使用 PyQt4 代码进行测试,则会交换一些类。(例如在 QtGui 和 QtWidgets 中)
从 PyQt5 导入 QtGui、QtWidgets、QtCore
class Main(QtWidgets.QMainWindow):
def __init__(self):
print("Main __init__ fired")
QtWidgets.QMainWindow.__init__(self)
#Setup the UI
print("Setting up UI")
self.ui = Ui_MainWindow()
self.ui.setupUi(self)
def main():
print("fired main()")
#Setup the main application object
app = QtWidgets.QApplication(sys.argv)
window = Main()
window.show()
sys.exit(app.exec_())
#Run GUI
if __name__ == "__main__":
main()
如果您收到此错误“..failed to start, could not find or load the Qt platform plugin "windows."(或类似的),您必须更新您的 DirectX。通过 Microsoft 执行此操作。
一旦你完全确定 PyQt5 在 Windows 中工作,然后继续。
- 激活您将 PyQt5 文件夹复制到的 virtualenv
确保可以从您的 virtualenv 中导入 PyQt5。您可能需要根据您使用的 IDE 来操作路径。在您的 virtualenv 中运行导入
从 PyQt5 导入 QtCore、QtGui、QtWidgets
尝试从这个 virtualenv 中再次运行相同的应用程序
不好了!dll的另一个错误! 是什么赋予了?在 virtualenv 中 QT dll 库的路径是错误的。即使您告诉 PyQt5 直接安装到您的 virtualenv 也会发生这种情况。在创建 QApplication 对象之前,您必须将路径添加到 libraryPaths。这是一个解决方案(将venv替换为您的 virtualenv 路径):
def main():
print("fired main()")
#ADD THE FOLLOWING BEFORE CREATING A QApplication()
QtCore.QCoreApplication.setLibraryPaths(['C:/venv/Lib/site-packages/PyQt5/plugins'])
#Ensure path was added and correct
print(QtCore.QCoreApplication.libraryPaths())
#Setup the main application object
app = QtWidgets.QApplication(sys.argv)
#See what the paths were
print(app.libraryPaths())
window = Main()
window.show()
sys.exit(app.exec_())
现在代码应该在你的 virtualenv 中运行。您可以从基本安装中删除 PyQt5 目录,或者如果您将来需要它,将其移动到另一个地方。
很可能有一种方法可以以相对方式对路径进行样板化,但这可能会导致 cx-freeze 出现问题。说到这。
现在你已经完成了,你可以将你的 PyQt5 应用程序 cx-freeze 为一个不错的 exe。你去运行它,哦,不!更多的dll麻烦。
您可以手动将libEGL.dll从 site-packages/PyQt5 复制到应用程序的根构建文件夹,或者将以下行添加到 setup.py 文件中以进行 cx-freeze:
import sys
from cx_Freeze import setup, Executable
#ADD THIS MUST INCLUDE FOR Windows 7.
include_files = [('c:/venv/Lib/site-packages/PyQt5/libEGL.dll', 'libEGL.dll')]
setup(
name="My App",
version="0.1",
description="PyQt5 App.",
#ADD THIS
options={'build_exe': {'include_files': include_files}},
executables=[Executable("c:/venv/src/myApp_main.py",
base="Win32GUI",
targetName="MyApp.exe")])