Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python VTK窗口未填充wx.面板_Python_Wxpython_Wxwidgets_Vtk - Fatal编程技术网

Python VTK窗口未填充wx.面板

Python VTK窗口未填充wx.面板,python,wxpython,wxwidgets,vtk,Python,Wxpython,Wxwidgets,Vtk,我正在用wxPython和VTK创建一个应用程序。屏幕左侧有一个配置面板(wx.panel),右侧有一个VTK窗口,也基于wx.panel。面板放置在wxFrame的boxsizer中,并使用wxFormBuilder应用程序中定义的比例大小调整大小,然后使用该应用程序生成XRC文件 我遇到了一个非常具体的问题,一些Windows 7机器始终无法正确调整窗口的VTK部分大小-请参见上面屏幕截图中VTK窗口周围的白色边框。我试图使这个VTK窗口成为一个固定的1280x720-事实上是这样-但有一

我正在用wxPython和VTK创建一个应用程序。屏幕左侧有一个配置面板(wx.panel),右侧有一个VTK窗口,也基于wx.panel。面板放置在wxFrame的boxsizer中,并使用wxFormBuilder应用程序中定义的比例大小调整大小,然后使用该应用程序生成XRC文件

我遇到了一个非常具体的问题,一些Windows 7机器始终无法正确调整窗口的VTK部分大小-请参见上面屏幕截图中VTK窗口周围的白色边框。我试图使这个VTK窗口成为一个固定的1280x720-事实上是这样-但有一个大小问题,一些元素是切碎窗口的底部和右侧。当运行在Ubuntu10.04、XP或Windows7的某些版本上时,这个bug并不存在(我不确定那些工作的和那些还没有工作的有什么独特之处)

当遇到这个错误时,我可以与屏幕的白色部分进行交互-通过VTK Interactior可以正确地处理单击,因此它仍然是我的VTK场景的一部分

应用程序设置如下所示,右侧VTK窗格是
图形面板
。面板设置为
wxEXPAND
,没有其他标志,我的应用程序中的所有元素都自动设置为大小(没有最小、最大或默认大小设置)。唯一的例外是bSizer1(主wxFrame尺寸器),它设置了最小宽度和高度(我不确定这是否是正确的方法,但它似乎工作正常)

我从wxFormBuilder生成XRC,然后在我的应用程序中使用它,我的VTK场景设置如下:

class MyScene(wx.Panel):
    def __init__(self, parent):
        wx.Panel.__init__(self, parent, style=wx.NO_BORDER) 
        #'parent' is main_frame (wx.Frame instance)
        self._parent = parent
        self.renderer = vtk.vtkRenderer()

        # I create and add my VTK actors here (SNIPPED)

        self._set_lighting()

        self.widget = VTKWidget(self,-1) #VTKWidget is a wxVTKRenderWindowInteractor
        self.widget.GetRenderWindow().AddRenderer(self.renderer)
        self.widget.Enable(1)
        self.widget.SetDoubleBuffered(True)

        self.Bind(wx.EVT_SIZE, self.on_size)
我一直在尝试使用
MyScene
on_size
功能来解决什么元素的大小是什么的问题,但下面的任何内容都无法解决我的问题。正常运行和错误系统上报告的值与预期值相同

def on_size(self, evt):
    print "---- MyScene on_size ----"
    print "Widget size:", self.widget.GetSize() #wxVTKRenderWindowInteractor
    print "Client size:", self.GetClientSize() #wxPanel.GetClientSize
    print "Parent size:", self._parent.GetSize() #wxFrame
    print "Renderer size:", self.renderer.GetSize() #vtkRenderer
    self.renderer.Clear()
    self.widget.SetSize((1280, 720))
    renWin = self.widget.get_render_window()
    renWin.SetSize(1280, 720)
    self._parent.Layout()
    self.renderer.Clear()
    renWin.SetSize(1280, 720)
在正常运行的系统上,输出为:

---- MyScene on_size ----
Widget size: (1280, 720)
Client size: (1296, 720)
Parent size: (1296, 720)
Renderer size: (1280, 720)
在问题的屏幕截图中显示的“坏”Windows 7系统上,输出类似:

---- MyScene on_size ----
Widget size: (1280, 720)
Client size: (1234, 728)
Parent size: (1234, 728)
Renderer size: (1280, 720) 
总之,我不知道哪个元素的大小不正确。VTK渲染器的大小是正确的,因为将VTK屏幕截图放到文件中会生成一个1280x720输出,显示没有白色剪辑的完整场景,如上所述,我可以使用屏幕的白色“剪辑”部分与VTK场景交互

这是不是VTK或WX元件的尺寸不正确?有人能给我一些关于如何进一步解决这个问题的建议吗?我还应该关注哪些其他元素的大小?我应该如何将图形面板的大小硬调整为1280x720,并使配置面板的大小适当


使用Python 2.7.5、VTK 5.10.1和wxpython 2.8时会出现问题,但仅在某些Windows 7计算机上出现。

与您一样,我正在使用VTK和wxpython开发一个应用程序,这种鸡尾酒有时令人惊讶! 我想你的问题是因为没有施胶剂。下面的代码段适用于linux和windows(包括7个):


希望这将帮助您

重现wxWidgets示例之一的问题。您将获得更多的交互。@Tamer是否有一个使用VTK窗口的wxWidgets示例?我怀疑大小问题与VTK方面的关系比与WX方面的关系更大。您能否构建一个最小的可运行示例来演示这个问题?
class Plotter3d(wx.Panel):

    def __init__(self, parent, *args, **kwargs):
        wx.Panel.__init__(self, parent, *args, **kwargs)      
        self.build_panel()

    def build_panel(self):
        self.viewer = wx.Panel(self)
        self.iren = wxVTKRenderWindowInteractor(self.viewer, -1, size=(500,500), flag=wx.EXPAND)
        self.iren.SetPosition((0,0))

        self.iren.Enable(1)

        # create renderer  
        self.renderer = vtk.vtkRenderer()
        self.iren.GetRenderWindow().AddRenderer(self.renderer)

        Sizer = wx.BoxSizer(wx.VERTICAL)
        Sizer.Add(self.iren, 1, wx.EXPAND, 0)

        self.viewer.SetSizer(Sizer)        
        Sizer.Fit(self.viewer)
        self.viewer.Layout()