2013-08-12 98 views
7

我使用wxPython和VTK創建應用程序。屏幕左側有一個配置面板(wx.Panel),右側有一個VTK窗口,也是基於wx.Panel。面板放置在wxFrame的boxsizer中,並使用wxFormBuilder應用程序中定義的比例大小來確定大小,然後用於生成XRC文件。VTK窗口不填充wx.Panel

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) 

我一直在試圖解決什麼元素的大小是什麼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計算機上出現此問題。

+0

與wxWidgets的樣本之一重現問題。你會得到更多的互動。 – Tamer

+0

@Tamer是否有涉及使用VTK窗口的wxWidgets示例?我懷疑大小問題比WX方面更關係到VTK方面。 – jozzas

+0

你可以建立一個最小的可運行示例來演示這個問題嗎? – Fenikso

回答

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

希望這將幫助你