【问题标题】:VTK window not filling wx.PanelVTK 窗口未填充 wx.Panel
【发布时间】:2013-08-13 10:12:07
【问题描述】:

我正在使用 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 函数对 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 场景进行交互。

这是一个未正确调整大小的 VTK 或 WX 元素吗?谁能给我有关如何进一步解决此问题的任何提示?我应该查看哪些其他元素的大小?我应该如何将我的图形面板硬调整为 1280x720 并让我的配置面板自行调整大小?

使用 Python 2.7.5、VTK 5.10.1 和 wxpython 2.8 时会出现此问题,但仅限于一些 Windows 7 机器。

【问题讨论】:

  • 使用 wxWidgets 示例之一重现问题。您将获得更多互动。
  • @Tamer 是否有涉及使用 VTK 窗口的 wxWidgets 示例?我怀疑尺寸问题与 VTK 方面的关系比 WX 方面更重要。
  • 您能否构建一个最小的可运行示例来演示该问题?

标签: python wxpython wxwidgets vtk


【解决方案1】:

和你一样,我正在使用 vtk 和 wxpython 开发一个应用程序,这种鸡尾酒有时令人惊讶! 我认为你的问题来自没有sizer。下面的 sn-p 可以在 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() 

希望对你有帮助

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-01-09
    • 2013-07-19
    • 1970-01-01
    • 2021-12-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多