从子类函数调用父类_init__;中的函数

2024-06-07 07:34:52 发布

您现在位置:Python中文网/ 问答频道 /正文

我想要这样的东西。若OpenVTK(0)调用,程序启动,若它调用OpenVTK(1),它将重置(但仅重置部分功能)。(elif vect[0]==1:下面代码的一部分没有这些属性)

class MainWindow(QMainWindow, Ui_MainWindow):
    def __init__(self, parent=None):
        super(MainWindow, self).__init__(parent)
        
        
        self.pushButton2.clicked.connect(lambda: self.OpenVTK(0))

    def OpenVTK(self, *vect, clik="", obs=""):

        global pr, aa, i, goster

        class MouseInteractor(vtk.vtkInteractorStyleTrackballCamera):
            def __init__(self, parent=None):

                global ee, dd  # aa

                self.AddObserver("LeftButtonPressEvent", self.leftButtonPressEvent)

            def leftButtonPressEvent(self, obj, event):
                if event == "LeftButtonPressEvent":

                    global bb

                    bb = self.AddObserver("MouseMoveEvent", self.leftButtonPressEvent)

                if event == "LeftButtonReleaseEvent":

                    self.RemoveObserver(bb)

                    def on_press(key):
                        print("{0} pressed".format(key))
                        if key == Key.esc:
                            MouseInteractor.dene(vec)

                    def released(key):
                        listener.stop()

                    # Collect events until released
                with Listener(on_press=on_press, on_release=released) as listener:
                    listener.join()

            def dene(*vecto):
                MainWindow.OpenVTK(self,1)
        if vect[0] == 0:

            i = -1

            etiket.clear()

            vec.clear()

            distp.clear()

            print("you'll see vect: " + str(vect[0]))
            print(vect)

            # print('Uncut Version')

            self.ren = vtk.vtkRenderer()
            #print("self is : "+str(self))

            self.renWin = self.vtkWidget.GetRenderWindow()
            
            self.renWin.AddRenderer(self.ren)

            self.iren = self.renWin.GetInteractor()

            self.iren.SetRenderWindow(self.renWin)
            

            reader = vtk.vtkSTLReader()

            reader.SetFileName(filename[0])

            mapper = vtk.vtkPolyDataMapper()

            mapper.SetInputConnection(reader.GetOutputPort())

            actor = vtk.vtkActor()

            actor.SetMapper(mapper)
            

            style = MouseInteractor()

            style.SetDefaultRenderer(self.ren)

            self.iren.SetInteractorStyle(style)

            axesActor = vtk.vtkAxesActor()

            self.axes = vtk.vtkOrientationMarkerWidget()
            
            self.axes.SetOrientationMarker(axesActor)

            self.axes.SetInteractor(self.iren)

            self.axes.EnabledOn()

            self.axes.InteractiveOn()

            self.ren.AddActor(actor)

            self.ren.ResetCamera()

            self.ren.ResetCameraClippingRange()

            self.frame.setLayout(self.vl)
            

            self.iren.Initialize()

            self.renWin.Render()
            

            self.iren.Start()
        elif(vect[0]==1):
            i = -1

            print("you'll see vect: " + str(vect))
            print(type(vect))

            i = -1

            etiket.clear()

            vec.clear()

            distp.clear()

            print("you'll see vect: " + str(vect[0]))
            print(vect)

            # print('Uncut Version')

            self.ren = vtk.vtkRenderer()
            #print("self is : "+str(self))

            self.renWin = self.vtkWidget.GetRenderWindow()
            
            self.renWin.AddRenderer(self.ren)

            self.iren = self.renWin.GetInteractor()

            self.iren.SetRenderWindow(self.renWin)
            
            reader = vtk.vtkSTLReader()

            reader.SetFileName(filename[0])

            mapper = vtk.vtkPolyDataMapper()

            mapper.SetInputConnection(reader.GetOutputPort())

            actor = vtk.vtkActor()

            actor.SetMapper(mapper)
            

            style = MouseInteractor()

            style.SetDefaultRenderer(self.ren)

            self.iren.SetInteractorStyle(style)

            axesActor = vtk.vtkAxesActor()

            self.axes = vtk.vtkOrientationMarkerWidget()
            

            self.axes.SetOrientationMarker(axesActor)

            self.axes.SetInteractor(self.iren)

            self.axes.EnabledOn()

            self.axes.InteractiveOn()

            self.ren.AddActor(actor)

            self.ren.ResetCamera()

            self.ren.ResetCameraClippingRange()

            self.frame.setLayout(self.vl)
            

            self.iren.Initialize()

            self.renWin.Render()
            
            self.iren.Start()
        else:

            del vect[0][0]

            # print('Cut Version')




但问题是,尽管self.pushButton2.clicked.connect(lambda: self.OpenVTK(0))可以正常工作并正确执行if vect[0] == 0:块,但当我在dene()函数中调用OpenVTK(1)时,它会出现多个错误,如

2021-10-03 15:36:47.806 (1009.163s) [                ]vtkWin32OpenGLRenderWin:217    ERR| vtkWin32OpenGLRenderWindow (000002019A558A50): wglMakeCurrent failed in MakeCurrent(), error: The requested resource is in use.

我理解这个错误是因为我无法释放缓冲区源。但是我把if vect[0] == 0:块的代码复制到了elif vect[0]=1

总的来说,我认为,如果我能从MainWindow__init__调用OpenVTK(),它工作得很好,但我不知道怎么做。 新建编辑:我删除了dene()函数,并尝试从on_press调用OpenVTK()。但在本次编辑中,我犯了以下错误: AttributeError: 'MainWindow' object has no attribute 'vtkWidget'。尽管从上面我们可以看到MainWindow确实具有vtkWidget属性

def leftButtonPressEvent(self, obj, event):

    global data, vec, i, noktagoster, goster, x, y, mousehareket, clickPosold, selet, pointposOld, arb, distp

    if event == "LeftButtonPressEvent":

        global bb

        bb = self.AddObserver("MouseMoveEvent", self.leftButtonPressEvent)

    if event == "LeftButtonReleaseEvent":

        self.RemoveObserver(bb)

        def on_press(key):
            print("{0} pressed".format(key))
            if key == Key.esc:
                #MouseInteractor.dene(vec)
                MainWindow.OpenVTK(MainWindow(),0)

        def released(key):
            listener.stop()

        # Collect events until released
        with Listener(on_press=on_press, on_release=released) as listener:
            listener.join()

Tags: keyselfifondefpressprintvtk
1条回答
网友
1楼 · 发布于 2024-06-07 07:34:52

正如前面提到的错误(AttributeError: 'MainWindow' object has no attribute 'vtkWidget')一样,vtkWidget没有定义。
您正在使用未首先初始化的此属性:

# 1) "vect[0]==0": attribute vtkWidget is not defined
self.renWin = self.vtkWidget.GetRenderWindow()

# 2) "vect[0]==1": attribute vtkWidget is not defined
self.renWin = self.vtkWidget.GetRenderWindow()

初始化self.vtkWidget,然后有望解决错误

相关问题 更多 >