VTK窗口没有填充wx.Panel

Joh*_*yon 7 python wxwidgets wxpython vtk

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

在此输入图像描述

我有一个非常具体的问题,一些Windows 7机器一直没有正确调整窗口的VTK部分 - 请参阅上面屏幕截图中VTK窗口周围的白色边框.我试图让这个VTK窗口固定为1280x720 - 它是 - 但是有一个尺寸问题,一些元素正在切断窗口的底部和右边.在Ubuntu 10.04,XP或Windows 7的某些版本上运行时,此错误不存在(我不确定那些有效的和那些尚未有效的内容是什么).

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

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

面板设置

我从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)
Run Code Online (Sandbox Code Playgroud)

我一直在尝试解决使用该on_size函数的元素大小的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)
Run Code Online (Sandbox Code Playgroud)

在功能正常的系统上,输出为:

---- MyScene on_size ----
Widget size: (1280, 720)
Client size: (1296, 720)
Parent size: (1296, 720)
Renderer size: (1280, 720)
Run Code Online (Sandbox Code Playgroud)

在一个"坏"的Windows 7系统上,如本问题的屏幕截图所示,输出类似:

---- MyScene on_size ----
Widget size: (1280, 720)
Client size: (1234, 728)
Parent size: (1234, 728)
Renderer size: (1280, 720) 
Run Code Online (Sandbox Code Playgroud)

总而言之,我不知道哪个元素的大小不正确.VTK渲染器大小是正确的,因为将VTK屏幕截图设置为文件会产生1280x720输出,显示没有白色剪辑的完整场景,如上所述,我可以使用屏幕的白色"剪切"部分与VTK场景进行交互.

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

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

小智 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() 
Run Code Online (Sandbox Code Playgroud)

希望对你有帮助