标签: pyside2

如何从具有 PySide2 GUI 的 python 脚本构建 mac os 应用程序?

语境:

我正在使用 PySide2 GUI 开发一个简单的 Python 应用程序。它目前在 Windows、Linux 和 Mac 上运行良好。在 Windows 上,我可以使用 PyInstaller 和 InnoSetup 来构建一个简单的安装程序。然后我尝试在 Mac 上做同样的事情。它很快就崩溃了,因为系统拒绝启动 PyInstaller 生成的命令或应用程序,因为它没有正确签名。因为我不是苹果开发者,所以我不能签署任何东西......

经过一番研究,我尝试了 py2app。我可以在这里更进一步。和

python setup.py py2app -A
Run Code Online (Sandbox Code Playgroud)

我可以创建一个可运行的应用程序。显然不能移植到不同的系统,因为它使用我的开发文件夹。如果我使用python setup.py py2app生成的程序无法启动,因为 py2app 没有复制所有必需的 Qt 东西。我试着将缺失的库一一添加,但最后系统找不到插件,我放弃了......

题:

有人可以帮助我使用 Qt GUI 将 python 脚本或包转换为 Mac 上的便携式应用程序吗?理想情况下,配方应该说明如何使用自定义应用程序图标,但这不是必需的。

参考:

  • 蟒蛇 3.8.5
  • macOS 10.15.7 卡特琳娜
  • PySide2 5.15.1
  • PyInstaller 4.0
  • py2app 0.22

由于我的真实包对于 SO 问题来说太大了,因此我将其缩减为最小的可重现示例:

from PySide3.QtWidgets import *
import sys


class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        hello = QLabel('Hello', self)
        hello.move(50, 50)

def run(args):
    app …
Run Code Online (Sandbox Code Playgroud)

python macos pyinstaller py2app pyside2

17
推荐指数
1
解决办法
2377
查看次数

安装PySide for Python-3.6

当我尝试为Python-3.6安装PySide时,它说它只能在Python-3.4之前兼容.是否有任何解决方法为Python-3.6安装它?

似乎只支持这些Python版本:

[(2, 6), (2, 7), (3, 2), (3, 3), (3, 4)].
Run Code Online (Sandbox Code Playgroud)

installation pyside python-3.6 pyside2

13
推荐指数
1
解决办法
1万
查看次数

Windows上的PySide2

有谁知道我在哪里可以找到PySide2的pip-install?

这是2017年,我似乎无法找到包含PySide2二进制文件的pip安装或site-package.我不想处理下载源代码并自行编译,因为这通常会让人头疼,因为它从来都不是一个平滑的过程.也考虑到其他人很可能已经做到了.如果我在这里说实话,如果我试图自己编译并出现错误,我真的不知道从哪里开始解决它们,我也不想花时间去做.

我发现很难相信当VFX行业的很多应用程序都转向PySide2时,我无法在网上或甚至在PIP中找到它.

我希望有人可以帮助我.谢谢

python windows python-3.x pyside2

9
推荐指数
3
解决办法
5276
查看次数

如何在 PySide2 中将 QByteArray 转换为 python 字符串

我有一个PySide2.QtCore.QByteArray对象叫做roleName我编码了一个 python 字符串:

propName = metaProp.name() // this is call of [const char *QMetaProperty::name() ](https://doc.qt.io/qt-5/qmetaproperty.html#name)
// encode the object
roleName = QByteArray(propName.encode())
print(roleName) // this gives b'myname'
// now I would like to get just "myname" without the "b" 
roleString = str(roleName)
print(roleString) // this gives the same output as above
Run Code Online (Sandbox Code Playgroud)

如何取回解码后的字符串?

python string python-3.x qbytearray pyside2

9
推荐指数
1
解决办法
4202
查看次数

从我的脚本创建 pyinstaller,结果中缺少 PySide2.QtXml

我所做的是打电话

pyinstaller example.py
Run Code Online (Sandbox Code Playgroud)

pyinstaller 为我的脚本获取所有重要的库。值得一提的是,我正在 Windows 机器上工作。但是当我运行结果时,它告诉我:

? .\example.exe
Traceback (most recent call last):
  File "example.py", line 6, in <module>
  File "c:\applications\anaconda\lib\site-packages\PyInstaller\loader\pyimod03_importers.py", line 714, in load_module

    module = loader.load_module(fullname)
ImportError: could not import module 'PySide2.QtXml'
[7684] Failed to execute script example
Run Code Online (Sandbox Code Playgroud)

所以这里有两个问题:

  1. 我在我的 python 安装中找不到名为“PySide2.QtXml”的库。所以我假设 .dll 有一个不同的名字?.dll 的真实名称是什么?我找到了Qt5Xml.dll,但我不知道这是否是正确的库。

  2. 一旦我有了我的库,我想将它添加到我的 example.spec 文件中。文档说它必须看起来像这样:

    binaries=[ ( '/usr/lib/libiodbc.2.dylib', 'libiodbc.dylib' ) ],
    
    Run Code Online (Sandbox Code Playgroud)

    但我不确定如何将它应用到我目前缺少的库中。我假设

    binaries=[ ( 'C:\somepath\Qt5Xml.dll', 'Qt5Xml.dll' ) ],
    
    Run Code Online (Sandbox Code Playgroud)

    将是要走的路?

提前致谢!

python qt pyinstaller pyside2

7
推荐指数
1
解决办法
2853
查看次数

PySide2没有正确关闭基本示例

当我运行基本脚本时:

import sys
from PySide2.QtWidgets import QApplication, QLabel

app = QApplication(sys.argv)
label = QLabel("Hello World")
label.show()
app.exec_()
Run Code Online (Sandbox Code Playgroud)

这是第一次一切正常.但是,如果我第二次运行它,我得到:

File "../script.py", line 17, in <module>
app = QApplication(sys.argv)

RuntimeError: Please destroy the QApplication singleton before creating a new QApplication instance.
Run Code Online (Sandbox Code Playgroud)

我在Ubuntu机器上运行脚本.我在python2和python3中得到了同样的错误.

谢谢 !

python python-2.7 python-3.x pyside2

7
推荐指数
1
解决办法
573
查看次数

如何在没有元类冲突的情况下对PyQt子类使用泛型类型?

我曾尝试abc.ABCMeta使用sip包装器类型,并且在子类使用时效果很好abc.ABC.

class QABCMeta(wrappertype, ABCMeta):
    pass

class WidgetBase(QWidget, metaclass=QABCMeta):
    ...

class InterfaceWidget(WidgetBase, ABC):
    ...

class MainWidget(InterfaceWidget):
    ...
Run Code Online (Sandbox Code Playgroud)

但它不起作用typing.Generic.

class QGenericMeta(wrappertype, GenericMeta):
    pass

class WidgetBase(QWidget, Generic[T], metaclass=QGenericMeta):
    ...

class GenericWidget(WidgetBase[float]):
    ...
Run Code Online (Sandbox Code Playgroud)

它提出:

line 980, in __new__
    self if not origin else origin._gorg)
TypeError: can't apply this __setattr__ to sip.wrappertype object
Run Code Online (Sandbox Code Playgroud)

我希望它像往常一样使用泛型子类:

class TableBase(QTableWidget, Generic[T]):
    @abstractmethod
    def raw_item(self, row: int) -> T:
        ...
    def data(self) -> Iterator[T]:
        yield from (self.raw_item(row) for row in range(self.rowCount()))

class MainTable(TableBase[float]):
    def …
Run Code Online (Sandbox Code Playgroud)

python metaclass typing pyqt5 pyside2

7
推荐指数
1
解决办法
192
查看次数

我们如何在 Qt Creator 中激活 virtualenv

有没有办法在 Qt Creator 中激活 Python 虚拟环境,即确保 Qt Creator 发出的准备/分析/构建当前项目的所有不同命令都在特定的 virtualenv 中运行?

当尝试在 Qt Creator 中使用 Shiboken 和 PySide 时会出现此问题。例如,可以使用 CMake 在 Pyside(跨 Windows、OSX 和 Linux)中成功编译并运行“scriptableapplication”示例。但是,在同一系统上工作时,无法使用 Qt Creator 和 qmake 来执行此操作,因为 virtualenv 未激活。在 Qt Creator 中打开 scriptableapplication.pro 项目时,会显示以下消息:

Unable to locate shiboken2-generator. Did you forget to activate your virtualenv?
Run Code Online (Sandbox Code Playgroud)

这确实是事实,Qt Creator 发出的 shell 命令没有激活 virtualenv。

python virtualenv qt-creator pyside2 shiboken2

7
推荐指数
2
解决办法
4255
查看次数

尝试创建同时子类化 PySide6 类的 Python 抽象类时,元类发生冲突

我正在尝试创建一个抽象基类,它也继承任意 PySide6 类。但是,以下会产生错误TypeError: metaclass conflict: the metaclass of a derived class must be a (non-strict) subclass of the metaclasses of all its bases

from abc import ABC, abstractmethod

from PySide6.QtWidgets import QApplication, QWidget


class MyBaseWidget(QWidget, ABC):

    def __init__(self, parent=None):
        super().__init__(parent=parent)
    
    @abstractmethod
    def foo(self):
        pass


class MyConcreteWidget(MyBaseWidget):

    def __init__(self, parent=None):
        super().__init__(parent=parent)


app = QApplication([])
widget = MyConcreteWidget()
widget.show()
app.exec_()
Run Code Online (Sandbox Code Playgroud)

我尝试使用下面看到的解决方案来解决这个问题(灵感来自解决元类冲突http://www.phyast.pitt.edu/~micheles/python/metatype.html多重继承元类冲突等)。

class MyMeta(ABCMeta, type(QWidget)): pass


class MyBaseWidget(QWidget, metaclass=MyMeta):

    def __init__(self, parent=None):
        super().__init__(parent=parent)
    
    @abstractmethod
    def …
Run Code Online (Sandbox Code Playgroud)

python pyqt pyside pyside2 pyside6

7
推荐指数
1
解决办法
1722
查看次数

如何通过PySide2连接Python和QML?

我想在Ubuntu上编写一个简单的桌面应用程序,我认为一种简单的方法是将Qt与QML用作GUI,将Python用作逻辑语言,因为我对Python有点熟悉。

现在,我花了几个小时尝试以某种方式连接GUI和逻辑,但是它不起作用。我管理连接QML-> Python,但没有其他方法。我有代表我的数据模型的Python类,并添加了JSON编码和解码功能。因此,目前尚不涉及SQL数据库。但是,也许QML视图和某些数据库之间的直接连接会使事情变得更容易?

所以现在一些代码。

QML-> Python

QML文件:

ApplicationWindow {

// main window
id: mainWindow
title: qsTr("Test")
width: 640
height: 480

signal tmsPrint(string text)

Page {
    id: mainView

    ColumnLayout {
        id: mainLayout

        Button {
            text: qsTr("Say Hello!")
            onClicked: tmsPrint("Hello!")
        }
    }
}    
}
Run Code Online (Sandbox Code Playgroud)

然后我有我的slot.py:

from PySide2.QtCore import Slot

def connect_slots(win):
    win.tmsPrint.connect(say_hello)

@Slot(str)
def say_hello(text):
    print(text)
Run Code Online (Sandbox Code Playgroud)

最后是我的main.py:

import sys
from controller.slots import connect_slots

from PySide2.QtWidgets import QApplication
from PySide2.QtQml import QQmlApplicationEngine 

if __name__ == '__main__':
    app = QApplication(sys.argv)

    engine = QQmlApplicationEngine()
    engine.load('view/main.qml') …
Run Code Online (Sandbox Code Playgroud)

python qt qml pyside2

6
推荐指数
1
解决办法
5678
查看次数