微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何将对象动态添加到wxpython中嵌入的vispy canvas中的场景中

如何解决如何将对象动态添加到wxpython中嵌入的vispy canvas中的场景中

我想在按下按钮时添加一个箭头(某些对象)。该代码是vispy存储库中给出的示例的修改版本。

import wx
from vispy import scene
from vispy.scene.visuals import Arrow

import numpy as np

class Canvas(scene.SceneCanvas):
    def __init__(self,*a,**k):
        sizes = k.pop("sizes",(300,300))  # Default value is (300,300)
        scene.SceneCanvas.__init__(self,**k,size=sizes)
        view = self.central_widget.add_view()
        view.bgcolor = 'sNow'
        view.camera = scene.TurntableCamera(up='+y',azimuth=100,elevation=15,fov=60)
        axis = scene.visuals.XYZAxis(parent=view.scene)
        
        arrow1 = np.array([(0,1,0)])  # Arrow direction,position
        arr = Arrow(pos=np.array([(0,0),(1,0)]),color='teal',method='gl',width=5.,arrows=arrow1,arrow_type="angle_30",arrow_size=5.0,arrow_color='teal',antialias=True,parent=view.scene)
        
        self.show()

class mainFrame ( wx.Frame ):

    def __init__( self,parent ):
        wx.Frame.__init__ ( self,parent,id = wx.ID_ANY,title = "Add Object",pos = wx.DefaultPosition,size = wx.Size( 905,569 ),style = wx.DEFAULT_FRAME_STYLE|wx.TAB_TRAVERSAL )

        self.SetSizeHints( wx.DefaultSize,wx.DefaultSize )

        bSizer1 = wx.BoxSizer( wx.VERTICAL )

        self.panel_vispy = wx.Panel( self,wx.ID_ANY,wx.DefaultPosition,wx.DefaultSize,wx.TAB_TRAVERSAL )
        bSizer1.Add( self.panel_vispy,9,wx.EXPAND |wx.ALL,5 )

        self.panel_Buttons = wx.Panel( self,wx.TAB_TRAVERSAL )
        bSizer2 = wx.BoxSizer( wx.HORIZONTAL )


        bSizer2.Add( ( 0,wx.EXPAND,5 )

        self.button_AddArrow = wx.Button( self.panel_Buttons,u"Add Arrow",0 )
        bSizer2.Add( self.button_AddArrow,wx.ALL|wx.ALIGN_CENTER_VERTICAL,5 )


        bSizer2.Add( ( 0,5 )


        self.panel_Buttons.SetSizer( bSizer2 )
        self.panel_Buttons.Layout()
        bSizer2.Fit( self.panel_Buttons )
        bSizer1.Add( self.panel_Buttons,5 )


        self.SetSizer( bSizer1 )
        self.Layout()

        self.Centre( wx.BOTH )
        
        # Connect Events
        self.button_AddArrow.Bind(wx.EVT_BUTTON,self.button_AddArrow_OnClick)
        
        self.panel_vispy.canvas = Canvas(app="wx",parent=self,sizes=self.panel_vispy.GetSize())
    
    def button_AddArrow_OnClick(self,event):
        print("Adding arrow")
        arrow2 = np.array([(0,color='red',arrows=arrow2,arrow_color='red',antialias=True)#,parent=view.scene) -Unable to access view from the Canvas class


if __name__ == "__main__":
    app = wx.App(False)
    
    GUI = mainFrame(None)
    
    GUI.Show(True)
    
    app.MainLoop()

我已经按照示例中的说明创建了Canvas,并尝试从mainFrame实例化它。将创建__init__类的Canvas中给定的所有对象。如果要在通过单击按钮创建GUI之后添加任何新对象,则无法从view访问Canvas类中的mainFrame。还是有其他方法可以实现这一目标。

更新: 以下是遵循注释中给出的建议的代码

import wx
from vispy import scene,gloo
from vispy.scene.visuals import Arrow

import numpy as np

class Canvas(scene.SceneCanvas):
    def __init__(self,size=sizes)
        self.unfreeze()
        self.view = self.central_widget.add_view()
        self.view.bgcolor = 'sNow'
        self.view.camera = scene.TurntableCamera(up='+y',fov=60)
        axis = scene.visuals.XYZAxis(parent=self.view.scene)
        
        arrow1 = np.array([(0,parent=self.view.scene)
        
        self.show()
    
class mainFrame ( wx.Frame ):

    def __init__( self,parent=self.panel_vispy.canvas.view.scene)
        self.panel_vispy.canvas.update() # Canvas not getting updated


if __name__ == "__main__":
    app = wx.App(False)
    
    GUI = mainFrame(None)
    
    GUI.Show(True)
    
    app.MainLoop()

代码现在可以正确运行,这意味着可能已添加了箭头,但场景未更新。

解决方法

根据@djhoese和@RolfofSaxony的建议,我更新了代码。现在,该代码在单击按钮后成功添加了一个箭头。

import wx
from vispy import scene,gloo
from vispy.scene.visuals import Arrow

import numpy as np

class Canvas(scene.SceneCanvas):
    def __init__(self,*a,**k):
        sizes = k.pop("sizes",(300,300))  # Default value is (300,300)
        scene.SceneCanvas.__init__(self,**k,size=sizes)
        self.unfreeze()
        self.view = self.central_widget.add_view()
        self.view.bgcolor = 'snow'
        self.view.camera = scene.TurntableCamera(up='+y',azimuth=100,elevation=15,fov=60)
        axis = scene.visuals.XYZAxis(parent=self.view.scene)
        
        arrow1 = np.array([(0,1,0)])  # Arrow direction,position
        arr = Arrow(pos=np.array([(0,0),(1,0)]),color='red',method='gl',width=5.,arrows=arrow1,arrow_type="angle_30",arrow_size=5.0,arrow_color='blue',antialias=True,parent=self.view.scene)
        
        self.show()
        
class mainFrame ( wx.Frame ):

    def __init__( self,parent ):
        wx.Frame.__init__ ( self,parent,id = wx.ID_ANY,title = "Add Object",pos = wx.DefaultPosition,size = wx.Size( 905,569 ),style = wx.DEFAULT_FRAME_STYLE|wx.TAB_TRAVERSAL )

        self.SetSizeHints( wx.DefaultSize,wx.DefaultSize )

        bSizer1 = wx.BoxSizer( wx.VERTICAL )

        self.panel_vispy = wx.Panel( self,wx.ID_ANY,wx.DefaultPosition,wx.DefaultSize,wx.TAB_TRAVERSAL )
        bSizer1.Add( self.panel_vispy,9,wx.EXPAND |wx.ALL,5 )

        self.panel_Buttons = wx.Panel( self,wx.TAB_TRAVERSAL )
        bSizer2 = wx.BoxSizer( wx.HORIZONTAL )


        bSizer2.Add( ( 0,wx.EXPAND,5 )

        self.button_AddArrow = wx.Button( self.panel_Buttons,u"Add Arrow",0 )
        bSizer2.Add( self.button_AddArrow,wx.ALL|wx.ALIGN_CENTER_VERTICAL,5 )


        bSizer2.Add( ( 0,5 )


        self.panel_Buttons.SetSizer( bSizer2 )
        self.panel_Buttons.Layout()
        bSizer2.Fit( self.panel_Buttons )
        bSizer1.Add( self.panel_Buttons,5 )


        self.SetSizer( bSizer1 )
        self.Layout()

        self.Centre( wx.BOTH )
        
        # Connect Events
        self.button_AddArrow.Bind(wx.EVT_BUTTON,self.button_AddArrow_OnClick)
        
        self.panel_vispy.canvas = Canvas(app="wx",parent=self,sizes=self.panel_vispy.GetSize())
    
    def button_AddArrow_OnClick(self,event):
        print("Adding arrow")
        arrow2 = np.array([(0,-1,-0.5,1)])  # Arrow direction,(-1,1)]),color='green',arrows=arrow2,parent=self.panel_vispy.canvas.view.scene)


if __name__ == "__main__":
    app = wx.App(False)
    
    GUI = mainFrame(None)
    
    GUI.Show(True)
    
    app.MainLoop()

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。