2013-08-12 22 views
7

Tôi đang tạo một ứng dụng với wxPython và VTK. Có một bảng cấu hình (wx.Panel) ở bên trái màn hình và một cửa sổ VTK ở bên phải, cũng dựa trên một wx.Panel. Các bảng này được đặt trong bộ đóng hộp của wxFrame và có kích thước bằng cách sử dụng kích thước tỷ lệ như được định nghĩa trong ứng dụng wxFormBuilder, sau đó được sử dụng để tạo ra một tệp XRC.Cửa sổ VTK không điền wx.Panel

enter image description here

Tôi gặp một vấn đề rất cụ thể với một số Windows 7 máy liên tục không kích thước phần VTK của cửa sổ một cách chính xác - Xem đường viền màu trắng xung quanh cửa sổ VTK trong hình trên. Tôi đang cố gắng để làm cho cửa sổ VTK này một cố định 1280x720 - và nó là - nhưng có một vấn đề kích thước với một số yếu tố đó là cắt của dưới cùng và bên phải của cửa sổ. Lỗi này không hiện diện khi chạy trên Ubuntu 10.04, XP hoặc một số bản dựng của Windows 7 (Tôi không chắc chắn những gì là duy nhất về những người làm việc và những người chưa làm).

Khi gặp lỗi này, tôi có thể tương tác với các phần màu trắng của màn hình - lần nhấp được xử lý chính xác thông qua bộ tương tác VTK, vì vậy nó vẫn là một phần của cảnh VTK của tôi.

Thiết lập ứng dụng như sau, trong đó ngăn VTK bên phải là graphics_panel. Bảng điều khiển được đặt bằng wxEXPAND và không có cờ nào khác và tất cả các yếu tố trong ứng dụng của tôi được đặt thành kích thước tự động (không có kích thước tối thiểu, tối đa hoặc kích thước mặc định). Ngoại lệ duy nhất cho điều này là bSizer1 (bộ chỉnh sửa wxFrame chính) có chiều rộng và chiều cao tối thiểu (Tôi không chắc đây có phải là cách đi đúng không, nhưng có vẻ như nó hoạt động tốt).

panel setup

tôi tạo XRC từ wxFormBuilder và sau đó sử dụng này trong ứng dụng của tôi, nơi đã cảnh VTK tôi thiết lập như sau:

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) 

Tôi đã cố gắng để khắc phục những gì yếu tố có kích thước gì sử dụng hàm on_size cho MyScene, nhưng không có gì dưới đây khắc phục được sự cố của tôi. Các giá trị được báo cáo trên cả hai các hệ thống hoạt động đúng và sai đều như mong đợi.

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) 

Trên một hệ thống hoạt động một cách chính xác, sản lượng là:

---- MyScene on_size ---- 
Widget size: (1280, 720) 
Client size: (1296, 720) 
Parent size: (1296, 720) 
Renderer size: (1280, 720) 

Trên một "xấu" Windows 7 hệ thống như trong ảnh chụp màn hình trong câu hỏi này, đầu ra tương tự:

---- MyScene on_size ---- 
Widget size: (1280, 720) 
Client size: (1234, 728) 
Parent size: (1234, 728) 
Renderer size: (1280, 720) 

Vì vậy, tóm lại, tôi không biết yếu tố nào đang được định kích thước không chính xác. Kích thước render của VTK là chính xác, khi chụp một ảnh chụp màn hình VTK để tạo ra một đầu ra 1280x720 cho thấy cảnh đầy đủ mà không cắt trắng, và như đã nói ở trên, tôi có thể tương tác với cảnh VTK bằng cách sử dụng các phần 'cắt bớt' màu trắng của màn hình.

Đây có phải là phần tử VTK hoặc WX không được định kích thước chính xác không? Bất cứ ai có thể cho tôi bất kỳ lời khuyên về cách khắc phục vấn đề này hơn nữa? Tôi nên xem xét các yếu tố nào khác ở kích thước? Làm thế nào tôi nên cứng kích thước của bảng điều khiển đồ họa của tôi đến 1280x720 và để kích thước bảng cấu hình của tôi chính nó một cách thích hợp?

Sự cố xảy ra khi sử dụng Python 2.7.5, VTK 5.10.1 và wxpython 2.8, nhưng chỉ trên một số máy Windows 7.

+0

tạo lại vấn đề với một trong những mẫu wxWidgets. Bạn sẽ nhận được nhiều tương tác hơn. – Tamer

+0

@Tamer có ví dụ về wxWidgets liên quan đến việc sử dụng cửa sổ VTK không? Tôi nghi ngờ vấn đề kích thước có liên quan nhiều hơn đến bên VTK của sự vật hơn so với phía WX. – jozzas

+0

Bạn có thể xây dựng một mẫu runnable tối thiểu thể hiện được vấn đề không? – Fenikso

Trả lời

1

Giống như bạn, tôi đang phát triển một ứng dụng sử dụng vtk và wxpython, cocktail này đôi khi đáng ngạc nhiên! Tôi nghĩ rằng vấn đề của bạn đến từ sự vắng mặt của sizer. đoạn dưới đây làm việc cả trên Linux và Windows (bao gồm 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() 

hy vọng điều này sẽ giúp bạn

Các vấn đề liên quan