为GUI开发设置PySide/Qt

3

我一直在尝试为Python3.3设置PySide/Qt。 我已经安装了

PySide-1.2.0.win32-py3.3.exe 

我从这里下载了,并已安装。
qt-win-opensource-4.8.5-vs2010

我从这里下载了相关内容。我使用QtDesigner创建了.ui文件,然后使用pyside-uic.exe按照PySide Wiki中所述处理,生成了.py文件。

在使用Qt5.1/QtCreator时,生成.py文件是有效的。但当我需要使用Qt4.8时(在Qt-forums上解释)就不起作用了。

  • 我想使用PySide开发GUI。
  • 我希望使用QtDesigner进行拖放界面以制作骨架GUI。
  • 我的操作系统是Windows 7。

我想使用cx-freeze将开发的GUI打包成.exe文件。

我的问题简述
使用哪些正确的工具可以制作QtDesigner的.ui文件?如何将它们转换成能够在Python中使用PySide的.py文件?

cx_freeze能够将我的常规文件转换为.exe文件,那么是否可以用它将Qt/PySide制作的GUI转换为.exe文件呢?在分发GUI的.exe时,其他电脑上是否需要Qt,或者它是一个独立的文件呢?


我从

cxfreeze testGUI.py  --include-modules=PySide

制作exe和相关文件。创建了一个名为dist的目录,其中包含许多文件。运行后没有任何反应。因此,我使用命令行查找原因。错误信息如下:

Traceback (most recent call last):
  File "C:\Python33\lib\site-packages\cx_Freeze\initscripts\Console3.py", line 27, in <module>
    exec(code, m.__dict__)
  File "testGUI.py", line 12, in <module>
  File "C:\Python\32-bit\3.3\lib\importlib\_bootstrap.py", line 1558, in _find_and_load
  File "C:\Python\32-bit\3.3\lib\importlib\_bootstrap.py", line 1525, in _find_and_load_unlocked
  File "C:\Python33\lib\site-packages\PySide\__init__.py", line 55, in <module>
    _setupQtDirectories()
  File "C:\Python33\lib\site-packages\PySide\__init__.py", line 11, in _setupQtDirectories
    pysideDir = _utils.get_pyside_dir()
  File "C:\Python33\lib\site-packages\PySide\_utils.py", line 87, in get_pyside_dir
    return _get_win32_case_sensitive_name(os.path.abspath(os.path.dirname(__file__)))
  File "C:\Python33\lib\site-packages\PySide\_utils.py", line 83, in _get_win32_case_sensitive_name
    path = _get_win32_long_name(_get_win32_short_name(s))
  File "C:\Python33\lib\site-packages\PySide\_utils.py", line 58, in _get_win32_short_name
    raise WinError()
FileNotFoundError: [WinError 3] The system cannot find the path specified.

有人知道这个堆栈跟踪是什么意思吗?

这里有很多win32。但我使用的是64位Windows 7。我正在使用32位Python,所有模块都是32位安装的。这会造成问题吗?我不认为应该会,因为其他用于简单Python脚本的exe文件都能正常执行。


你可以使用Qt Creator创建用户界面。 - Reza Ebrahimi
@Reza 但问题是如何正确地使用Python中的.ui文件。我是否需要使用pyside-uic将它们转换为Python类,还是需要动态加载它们?将生成的应用程序转换为可执行的exe需要做什么?我通常使用cxfreeze并且它可以工作,但带有GUI的exe无法正常工作。我很困惑。 - Aseem Bansal
我不确定是什么原因导致了你的错误,但在C++ Qt中,它会生成与UI相关的.cpp文件,然后在项目中进行编译。如果可能的话,请花些时间在Qt文档中查找直接加载.ui文件的方法。 - Reza Ebrahimi
你好奇地问:你是否正在使用和部署自定义小部件? - cfi
1
@cfi 我刚开始学习使用Python中的PySide和GUI,所以还没有。在我尝试使用任何特定工具包之前,我只是想先搞清楚这些细节。 - Aseem Bansal
4个回答

5
这个错误:
FileNotFoundError: [WinError 3] The system cannot find the path specified.

下一个pyside版本(1.2.1)将会修复此问题,并且将在下周发布。

顺便提醒一下:如果您不想生成自定义绑定,您无需安装qt,pyside安装程序包含所有qt库和开发工具。


我也在qt-forums上听说过这个。你能具体说明一下开发工具在哪里吗?我试图找到Qt Designer,但在安装Qt之前没有找到它。我想要一个拖放界面来制作GUI。自定义绑定是什么意思? - Aseem Bansal
1
设计师、语言学家、lrelease、lupdate、pyside-rcc 和 pyside-lupdate 与 PySide 库位于同一文件夹中,在我的系统上,路径为 c:\Python27_64\Lib\site-packages\PySide-1.2.0-py2.7-win-amd64.egg\PySide。当您想要使用 Shiboken 为您的 C++ 类生成 Python 包装器时,就需要进行自定义绑定。 - rlacko
非常感谢这个。我终于找到了设计师、语言学家等人所在的地方。我已经安装和卸载了Qt/PySide三次,以为这只是一个顺序问题。也许一些文件意外地替换了其他文件。我可以等一周。你能告诉我PySide社区通常在哪里吗?我尝试过QtForums,但没有得到太多信息。 - Aseem Bansal
这是 PySide 的主页 http://qt-project.org/wiki/PySide,还有活跃的邮件列表 http://lists.qt-project.org/mailman/listinfo/pyside。 - rlacko
你在哪里看到这个错误将在下一个版本中修复?我试图找到它,但除了在 GitHub 上的问题之外,似乎没有任何这样的消息,而且也没有人在关注。 - Aseem Bansal
你需要在Pyside邮件列表中搜索“cxfreeze和PySide 1.2.0”。这里是J.B.Mohler的修复方法:https://codereview.qt-project.org/#change,60935。我正在GitHub上阅读消息 :) - rlacko

1

我正在做类似的事情(但我正在从PyQt迁移到PySide)。

在使用QtCreator创建UI文件后,您应该使用pyside-uic生成GUI代码(如果这是PyQt,“pyuic gui.ui>gui.py”将生成所需的代码,我认为pyside-uic具有类似的行为)。然后,我会对这个生成的代码进行子类化以自定义用户界面。

是的,您可以在PyQt/PySide中使用cx_freeze,您需要在构建选项的“includes”项目中包含PySide。

是的,您可以创建完全独立的可执行文件-您不需要Python,Qt或其他任何内容。

这是我从我的PySide GUI应用程序使用的构建。

__author__ = 'AlexM'
import sys
from cx_Freeze import setup, Executable
import MyPySideGui
import PySide, os

base = None
if sys.platform == "win32":
    base = "Win32GUI"

QGifRelDir = "imageformats\qgif4.dll"
PySideDir = (os.path.join(os.path.dirname(PySide.__file__),"plugins"))

shortcut_table = [
    ("App Shortcut",                 # Shortcut
     "ProgramMenuFolder",            # Directory_
     "MyPySideGUI",                  # Name
     "TARGETDIR",                    # Component_
     "[TARGETDIR]MyPySideApp.exe",   # Target
     None,                           # Arguments
     None,                           # Description
     None,                           # Hotkey
     None,                           # Icon
     None,                           # IconIndex
     None,                           # ShowCmd
     'TARGETDIR'                     # WkDir
     )
]

build_exe_options = {
    "include_files" : ["documentTemplate.html", "loading.gif", (os.path.join(PySideDir,QGifRelDir), QGifRelDir)],
    "packages" : ["CustomHelperPackage", "AnotherCustomPackage", "MyPySideGui"],
    "includes" : ["PySide"],
    "excludes" : ["tkinter"],
    'optimize': 2,
}

# Now create the table dictionary
msi_data = {"Shortcut": shortcut_table}

# Change some default MSI options and specify the use of the above defined tables
bdist_msi_options = {'data': msi_data}

executables = [ Executable("MyPySideGui.py", base = base) ]

setup(
    name = "MyFirstPySideApplication",
    version = str(MyPySideGui.version),
    description = "MyPySideApp.exe Demonstrates PySide guis.",
    options = {
        "build_exe": build_exe_options,
        "bdist_msi": bdist_msi_options
    },
    executables = executables
)

这个例子可能对你来说有点复杂,但是你可以在cx_freeze项目主页上找到更简单的例子。
我没有遇到你或其他回答中提到的问题,但是我正在使用Python 3.3.1和PySide 1.1.2。

我实际上解决了将.py转换为.ui文件的问题。看起来distribute在安装PySide后会停止工作。您能否举个例子说明如何使用cx_freeze来指定包含项?我一直在使用现有的cx_freeze-quickstart批处理文件。它没有太多选项,而且我无法理解cx_freeze维基的解释。 - Aseem Bansal
更新了问题。我认为这是上次发生的同样问题。 - Aseem Bansal
明天我会发布我使用cx_freeze的构建脚本。 - Alex
使用构建脚本更新了答案。 - Alex

1

关于 FileNotFoundError 错误,我在打包 Python 3 应用程序时遇到了问题。在 Windows 7 64 位系统上,它可以正常工作。但是在 Win7 32 位系统上构建并尝试运行 .exe 文件时,出现了所有这些文件错误。在看到此线程后,我检查了 pyside 的版本。在 win64 上是 1.1.2,在 win32 上是 1.2.0。 我卸载了 Win32 上的 pyside 1.2.0 并下载安装了 1.1.2 版本。现在可以正常工作了。 这可能只是一个权宜之计,直到 1.2.1 版本发布为止。


0

PySide 1.2.1已发布。它修复了错误。我通过安装新版本并使用cx_freeze进行检查。

在Windows 7(64位)上使用Python 3.3.2(32位)和PySide 1.2.1(32位)与cx_freeze 4.3.1(用于Python 3.3的32位版本)打包时没有错误。我使用问题中写的命令进行打包。它成功地工作了。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接