我正在使用 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 上的便携式应用程序吗?理想情况下,配方应该说明如何使用自定义应用程序图标,但这不是必需的。
由于我的真实包对于 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-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) 有谁知道我在哪里可以找到PySide2的pip-install?
这是2017年,我似乎无法找到包含PySide2二进制文件的pip安装或site-package.我不想处理下载源代码并自行编译,因为这通常会让人头疼,因为它从来都不是一个平滑的过程.也考虑到其他人很可能已经做到了.如果我在这里说实话,如果我试图自己编译并出现错误,我真的不知道从哪里开始解决它们,我也不想花时间去做.
我发现很难相信当VFX行业的很多应用程序都转向PySide2时,我无法在网上或甚至在PIP中找到它.
我希望有人可以帮助我.谢谢
我有一个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)
如何取回解码后的字符串?
我所做的是打电话
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)
所以这里有两个问题:
我在我的 python 安装中找不到名为“PySide2.QtXml”的库。所以我假设 .dll 有一个不同的名字?.dll 的真实名称是什么?我找到了Qt5Xml.dll,但我不知道这是否是正确的库。
一旦我有了我的库,我想将它添加到我的 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)
将是要走的路?
提前致谢!
当我运行基本脚本时:
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中得到了同样的错误.
谢谢 !
我曾尝试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) 有没有办法在 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。
我正在尝试创建一个抽象基类,它也继承任意 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) 我想在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) pyside2 ×10
python ×9
python-3.x ×3
pyinstaller ×2
pyside ×2
qt ×2
installation ×1
macos ×1
metaclass ×1
py2app ×1
pyqt ×1
pyqt5 ×1
pyside6 ×1
python-2.7 ×1
python-3.6 ×1
qbytearray ×1
qml ×1
qt-creator ×1
shiboken2 ×1
string ×1
typing ×1
virtualenv ×1
windows ×1