PyCharm 无法调试 Qt5 (PySide2) 代码 - 错误 'Shiboken.ObjectType' 对象不可迭代
PyCharm fails to debug Qt5 (PySide2) code - Error 'Shiboken.ObjectType' object is not iterable
我有一些使用 Python 控制台应用程序的经验,现在正尝试从 Python 的 Qt(Qt 5.12、PySide2)开始。事实上,我正在尝试一些基本教程来了解它应该如何工作。
所以,我创建的很简单view.qml:
import QtQuick 2.0
import QtQuick.Controls 2.13
ApplicationWindow {
visible: true
Button {
id: button
text: qsTr("ClickOnMe")
}
Connections {
target: button
onClicked: con.say_hello()
}
}
并具有以下 python 代码来使用它:
from PySide2.QtCore import QObject, Slot
from PySide2.QtGui import QGuiApplication
from PySide2.QtQml import QQmlApplicationEngine
class Bridge(QObject):
@Slot()
def say_hello(context):
print("Button clicked, Hello!", context)
app = QGuiApplication([])
engine = QQmlApplicationEngine()
bridge = Bridge()
context = engine.rootContext()
context.setContextProperty("con", bridge)
engine.load("view.qml")
engine.rootObjects()
exit(app.exec_())
当我简单地 运行 它时它工作正常 - 即我看到一个带有按钮的应用程序 window。我可能会单击一个按钮并在控制台中看到打印的消息。
但是当我尝试调试它时 - 它立即在 class Bridge(QObject):
行停止,但出现以下异常:
<class 'tuple'>: (<class 'TypeError'>, TypeError("'Shiboken.ObjectType' object is not iterable"), <traceback object at 0x7fe195b23680>)
我在 Qt Creator 中尝试了同样的方法 - 工作正常,运行 和调试没有问题(小问题 - Qt Creator 控制台中的消息仅在应用程序终止后出现)。但我更喜欢 PyCharm,所以想了解如何解决这个问题并继续在 Qt 中使用 PyCharm。
如果它很重要 - 我 运行宁 ArchLinux。
几天前,Arch Linux 将其 Python 版本更新为 3.8,但 PySide2 还没有兼容版本,导致您指出的错误。正如他们在这份报告中指出的那样 PYSIDE-1140:
I'm keeping this open, but it will probably be solved for 5.14, since
then Python 3.8 will be introduced as a new compatible Python version.
所以你有两个选择:
等待与Python3.8兼容的PySide2发布。
或从 aur 安装 Python3.7 or an old version(使用 yay),然后使用 pip 安装 PySide2。
这实际上是 Python 使用 Python 3.8 的 Qt 中的一个错误,但是它已经被解决 here。
只需更新您的 qt:
pip install PyQt5
我有一些使用 Python 控制台应用程序的经验,现在正尝试从 Python 的 Qt(Qt 5.12、PySide2)开始。事实上,我正在尝试一些基本教程来了解它应该如何工作。
所以,我创建的很简单view.qml:
import QtQuick 2.0
import QtQuick.Controls 2.13
ApplicationWindow {
visible: true
Button {
id: button
text: qsTr("ClickOnMe")
}
Connections {
target: button
onClicked: con.say_hello()
}
}
并具有以下 python 代码来使用它:
from PySide2.QtCore import QObject, Slot
from PySide2.QtGui import QGuiApplication
from PySide2.QtQml import QQmlApplicationEngine
class Bridge(QObject):
@Slot()
def say_hello(context):
print("Button clicked, Hello!", context)
app = QGuiApplication([])
engine = QQmlApplicationEngine()
bridge = Bridge()
context = engine.rootContext()
context.setContextProperty("con", bridge)
engine.load("view.qml")
engine.rootObjects()
exit(app.exec_())
当我简单地 运行 它时它工作正常 - 即我看到一个带有按钮的应用程序 window。我可能会单击一个按钮并在控制台中看到打印的消息。
但是当我尝试调试它时 - 它立即在 class Bridge(QObject):
行停止,但出现以下异常:
<class 'tuple'>: (<class 'TypeError'>, TypeError("'Shiboken.ObjectType' object is not iterable"), <traceback object at 0x7fe195b23680>)
我在 Qt Creator 中尝试了同样的方法 - 工作正常,运行 和调试没有问题(小问题 - Qt Creator 控制台中的消息仅在应用程序终止后出现)。但我更喜欢 PyCharm,所以想了解如何解决这个问题并继续在 Qt 中使用 PyCharm。 如果它很重要 - 我 运行宁 ArchLinux。
几天前,Arch Linux 将其 Python 版本更新为 3.8,但 PySide2 还没有兼容版本,导致您指出的错误。正如他们在这份报告中指出的那样 PYSIDE-1140:
I'm keeping this open, but it will probably be solved for 5.14, since then Python 3.8 will be introduced as a new compatible Python version.
所以你有两个选择:
等待与Python3.8兼容的PySide2发布。
或从 aur 安装 Python3.7 or an old version(使用 yay),然后使用 pip 安装 PySide2。
这实际上是 Python 使用 Python 3.8 的 Qt 中的一个错误,但是它已经被解决 here。
只需更新您的 qt:
pip install PyQt5