我正在使用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)
我一直在尝试使用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计算机上。
答案 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()
希望这会对你有所帮助