VTK窗口没有填充wx.Panel

时间:2013-08-12 07:05:12

标签: python wxpython wxwidgets vtk

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

enter image description here

我遇到一个非常具体的问题,一些Windows 7机器始终没有正确调整窗口的VTK部分 - 请参阅上面屏幕截图中VTK窗口周围的白色边框。我试图让这个VTK窗口固定为1280x720 - 它是 - 但是有一个尺寸问题,一些元素正在切断窗口的底部和右边。在Ubuntu 10.04,XP或Windows 7的某些版本上运行时,不会出现此错误(我不确定哪些有用,哪些无效)。

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

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

panel setup

我从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)

我一直在尝试使用on_size的{​​{1}}函数来解决使用MyScene函数调整大小的问题,但下面没有任何内容可以解决我的问题。 正确运行和错误系统上报告的值与预期一致。

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场景进行交互。 / p>

这是VTK或WX元素的大小不正确吗?任何人都可以给我任何关于如何进一步解决这个问题的提示吗?我应该考虑哪些其他元素的大小?我应该如何将我的图形面板的尺寸调整到1280x720并让我的配置面板尺寸适当?

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

1 个答案:

答案 0 :(得分:1)

和你一样,我正在使用vtk和wxpython开发一个应用程序,这种鸡尾酒有时令人惊讶! 我认为你的问题来自缺少sizer。下面的代码段在linux和windows(包括7)上都有效:

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() 

希望这会对你有所帮助