pyqt y VTK: problema para conectar el control deslizante al objeto vtk

Estoy lidiando con algunos problemas, usando vtk en PyQt5. El problema es que tengo una esfera vtk con un valor de radio inicial y algunos controles deslizantes para conectar a la esfera en números QLCD. De hecho, lo que quiero es tener uno de los controles deslizantes establecido en 128 en los primeros dans cuando el usuario deslice para cambiar el valor, este valor se mostrará en el QLCDNumber y se tomará el valor actual del control deslizante para cambiar el Radio de la esfera VTK.

Aquí está mi código:

import sys from PyQt5.QtWidgets import QApplication, QWidget, QSlider, QLCDNumber from PyQt5.QtWidgets import (QApplication, QCheckBox, QGridLayout, QGroupBox, QMenu, QPushButton, QRadioButton, QVBoxLayout, QWidget, QSlider,QLineEdit,QLabel) from PyQt5.QtCore import * from PyQt5.QtGui import * from PyQt5 import * import vtk from vtk.qt.QVTKRenderWindowInteractor import QVTKRenderWindowInteractor from PyQt5 import Qt def window(): source = vtk.vtkSphereSource() source.SetCenter(0, 0, 0) source.SetRadius(5.0) app = QApplication(sys.argv) win = QWidget() Display_1 = QLCDNumber(3) Display_2 = QLCDNumber(3) Display_3 = QLCDNumber(3) Display_1.setSegmentStyle(QLCDNumber.Flat) Display_2.setSegmentStyle(QLCDNumber.Flat) Display_3.setSegmentStyle(QLCDNumber.Flat) Display_1.display(128) Display_2.display(128) Display_3.display(128) Slider_1 = QSlider(QtCore.Qt.Horizontal) Slider_1.setMinimum(0) Slider_1.setMaximum(255) Slider_1.setValue(128) Slider_1.valueChanged.connect(Display_1.display) Slider_1.valueChanged.connect(changevalue(Slider_1,source)) Slider_2 = QSlider(QtCore.Qt.Horizontal) Slider_2.setMinimum(0) Slider_2.setMaximum(255) Slider_2.setValue(128) Slider_2.valueChanged.connect(Display_2.display) Slider_3 = QSlider(QtCore.Qt.Horizontal) Slider_3.setMinimum(0) Slider_3.setMaximum(255) Slider_3.setValue(128) Slider_3.valueChanged.connect(Display_3.display) label_1 = QLabel("Label_1") label_1.setAlignment(QtCore.Qt.AlignCenter) label_2 = QLabel("Label_2") label_2.setAlignment(QtCore.Qt.AlignCenter) label_3 = QLabel("Label_3") label_3.setAlignment(QtCore.Qt.AlignCenter) vbox = QtWidgets.QVBoxLayout() vbox.addWidget(label_1) vbox.addWidget(Display_1) vbox.addWidget(Slider_1) vbox.addWidget(label_2) vbox.addWidget(Display_2) vbox.addWidget(Slider_2) vbox.addWidget(label_3) vbox.addWidget(Display_3) vbox.addWidget(Slider_3) vbox.addStretch() hbox = QtWidgets.QHBoxLayout() frame = QtWidgets.QFrame() frame.setFrameShape(QtWidgets.QFrame.StyledPanel) frame.setFrameShape(QtWidgets.QFrame.StyledPanel) # Application de la forme frame.setFrameShadow(QtWidgets.QFrame.Raised) # application d'une ombre frame.setObjectName("frame") # Appellation du cadre #b3 = QtWidgets.QPushButton("Button3") #b4 = QtWidgets.QPushButton("Button4") hbox.addWidget(frame) hbox.addStretch() #hbox.addWidget(b4) vbox.addStretch() hbox.addLayout(vbox) win.setLayout(hbox) vtkWidget = QVTKRenderWindowInteractor(frame) vl = Qt.QVBoxLayout() vl.addWidget(vtkWidget) ren = vtk.vtkRenderer() vtkWidget.GetRenderWindow().AddRenderer(ren) iren = vtkWidget.GetRenderWindow().GetInteractor() # Create a mapper mapper = vtk.vtkPolyDataMapper() mapper.SetInputConnection(source.GetOutputPort()) # Create an actor actor = vtk.vtkActor() actor.SetMapper(mapper) ren.AddActor(actor) ren.ResetCamera() frame.setLayout(vl) #setCentralWidget(self.frame) #show() iren.Initialize() iren.Start() win.setWindowTitle("PyQt") win.resize(743, 430) win.show() sys.exit(app.exec_()) def changevalue(slider,source): value = slider.value() source.SetRadius(int(value)) if __name__ == '__main__': window() 

Cuando bash usar el código, Python me devuelve el siguiente error: “Archivo” window.py “, línea 38, en la ventana Slider_1.valueChanged.connect (changevalue (Slider_1, source)) TypeError: el argumento 1 tiene un tipo inesperado ‘NoneType ”

Alguna idea ?

Gracias por adelantado

El método de connect en PyQt está esperando un objeto de función. En su lugar, estás llamando a una función:

changevalue(Slider_1,source)

La función changevalue no devuelve nada. En otras palabras, devuelve None .

Entonces, cuando llamas a la línea:

Slider_1.valueChanged.connect(changevalue(Slider_1,source))

lo que realmente está haciendo es llamar a connect con None como el argumento porque esto es lo que está devolviendo su llamada a la función changevalue . En su lugar, debe pasarle la función changevalue , pero como necesita llamar a esa función con argumentos, deberá hacer algo como esto:

 ... Slider_1 = QSlider(QtCore.Qt.Horizontal) Slider_1.setMinimum(0) Slider_1.setMaximum(255) Slider_1.setValue(128) def handler(): changevalue(Slider_1, source) Slider_1.valueChanged.connect(Display_1.display) Slider_1.valueChanged.connect(handler) ... 

Corrí tu código con esta modificación y la esfera se muestra. Sin embargo, hay otro problema y es que cuando mueves los controles deslizantes, tu esfera no se actualiza. Para lograr que el renderizador VTK se actualice, deberá averiguar cómo llamar a iren.reinitialize() en su controlador changevalue , o algo parecido. La llamada de reinicialización hará que la ventana de renderización se actualice en respuesta al movimiento del control deslizante.