繁体   English   中英

如何在 PySide2 GUI 上正确嵌入 Vispy canvas?

[英]How to correctly embed a Vispy canvas on a PySide2 GUI?

我正在尝试使用 Vispy 和 PySide2 创建一个 GUI。 我对这些图书馆很陌生。 当我尝试为 Vispy 的 canvas 设置 alignment 时遇到问题。

对于我尝试的任何 alignment 标志,我都会收到此错误消息。 我怀疑 Vispy canvas 嵌入不正确。 有人可以帮忙吗?

   central_layout.addWidget(canvas       , 2,0,1,2 , QtCore.Qt.AlignCenter )

TypeError: 'PySide2.QtWidgets.QGridLayout.addWidget' called with wrong argument types:
 PySide2.QtWidgets.QGridLayout.addWidget(SceneCanvas, int, int, int, int, AlignmentFlag)
Supported signatures:
 PySide2.QtWidgets.QGridLayout.addWidget(PySide2.QtWidgets.QWidget, int, int, PySide2.QtCore.Qt.Alignment = Default(Qt.Alignment))
 PySide2.QtWidgets.QGridLayout.addWidget(PySide2.QtWidgets.QWidget, int, int, int, int, PySide2.QtCore.Qt.Alignment = Default(Qt.Alignment))
 PySide2.QtWidgets.QGridLayout.addWidget(PySide2.QtWidgets.QWidget)

我在 Spyder 上运行 Python 3.8.1、vispy 0.9.3 和 PySide2 5.13.2。

import matplotlib
matplotlib.use('Agg')
import sys
sys.path.append("../../../")


import vispy
import pyglet
vispy.app.use_app('pyglet')
from vispy import color, scene, app

from PySide2.QtWidgets import QApplication, QMainWindow, QWidget, QGridLayout, QComboBox, QHBoxLayout, QPushButton, QCheckBox, QLineEdit, QLabel
from PySide2 import QtCore



if not QApplication.instance():
    app = QApplication(sys.argv)
else:
    app = QApplication.instance()

mw  = QMainWindow()
mw.resize(1900,1000)

# build canvas
canvas = scene.SceneCanvas(keys='interactive', show=False)
# canvas = vispy.app.canvas.Canvas(keys='interactive', show=False)

central_layout = QGridLayout()
central_widget = QWidget()
central_widget.setLayout(central_layout)

mw.setCentralWidget(central_widget)
mw.setWindowTitle('Driving Test (2D/3D)')

configuration_layout      = QHBoxLayout()
debug_layout              = QHBoxLayout()

cmap_attribute            = QComboBox()
cmap_type                 = QComboBox()
cycle_label               = QLabel('Cycle :')
debug_mode_checkbox       = QCheckBox('Debug Mode')
input_cycle               = QLineEdit()
go_to_specific_cycle_btn  = QPushButton('GO')
next_cycle_btn            = QPushButton('Next Cycle')
previous_cycle_btn        = QPushButton('Previous Cycle')
attribute_selected_info   = QLabel()

input_cycle.setPlaceholderText('Enter a spécific cycle and click on (GO)')

input_cycle.setMaximumWidth(250)
go_to_specific_cycle_btn.setMaximumWidth(50)
debug_mode_checkbox.setMaximumWidth(100)
cycle_label.setFixedSize(80, 40)
attribute_selected_info.setFixedSize(500, 40)

cmap_attribute.addItems(['snr','power','rcs','velocity', 'range','detection_confidence','elevation'])
cmap_type.addItems(['jet','viridis'])

configuration_layout.addWidget(cmap_attribute)
configuration_layout.addWidget(cmap_type)

debug_layout.addWidget(debug_mode_checkbox)
debug_layout.addWidget(input_cycle)
debug_layout.addWidget(go_to_specific_cycle_btn)
debug_layout.addWidget(previous_cycle_btn)
debug_layout.addWidget(next_cycle_btn)
debug_layout.addWidget(cycle_label)
debug_layout.addWidget(attribute_selected_info)

central_layout.addLayout(configuration_layout , 0,0,1,2)
central_layout.addLayout(debug_layout         , 1,0,1,2)
central_layout.addWidget(canvas       , 2,0,1,2 , QtCore.Qt.AlignCenter )
top_grid = canvas.central_widget.add_grid()


mw.show()


if __name__ == '__main__':
    import sys
    if (sys.flags.interactive != 1) or not hasattr(QtCore, 'PYQT_VERSION'):
        QApplication.instance().exec_()
```

正如评论中所讨论的,将 vispy Canvas(或 SceneCanvas)object 添加到 GUI 框架的正确方法是将canvas.native添加到 GUI。 canvas.native应该等同于 GUI 后端期望的任何“小部件”。

你的另一个问题原来是你从 Spyder 运行并迫使 vispy 后端到 pyglet。 我对 pyglet 了解不多,所以我不确定是否可以使用 pyglet + pyside2,但如上所述, .native与您选择的后端相关联,因此它必须将 pyglet object 传递给 pyside2。

您在使用 pyside2 并从 spyder 运行程序时提到的最后一个错误可能是从 spyder 中运行其他 GUI 框架之间的不兼容。 至少这是我的猜测。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM