2013-08-12 29 views
7

Sto creando un'applicazione con wxPython e VTK. C'è un pannello di configurazione (wx.Panel) sulla sinistra dello schermo e una finestra VTK sulla destra, anch'essa basata su un wx.Panel. I pannelli sono posizionati nel boxsize di wxFrame e dimensionati utilizzando il dimensionamento proporzionale come definito nell'applicazione wxFormBuilder, che viene quindi utilizzato per generare un file XRC.Finestra VTK che non riempie wx.Panel

enter image description here

Sto avendo un problema molto specifico con alcuni Windows 7 macchine in modo coerente non corretto dimensionamento della parte VTK della finestra - Vedere il bordo bianco intorno alla finestra VTK nello screenshot qui sopra. Sto tentando di rendere questa finestra VTK un fisso 1280x720 - e lo è - ma c'è un problema di dimensionamento con qualche elemento che sta tagliando in basso ea destra della finestra. Questo bug non è presente quando viene eseguito su Ubuntu 10.04, XP o alcuni build di Windows 7 (non sono sicuro di cosa sia unico per quelli che funzionano e quelli che non lo sono ancora).

Quando si verifica questo errore, posso interagire con le porzioni bianche dello schermo: i clic vengono gestiti correttamente tramite l'interactor VTK, quindi è ancora una parte della mia scena VTK.

L'installazione dell'applicazione è la seguente, dove il riquadro VTK a destra è il graphics_panel. Il pannello è impostato con wxEXPAND e nessun altro contrassegno e tutti gli elementi nella mia app sono impostati automaticamente sulle dimensioni (nessuna dimensione min, max o predefinita). L'unica eccezione a questo è bSizer1 (il principale wxFrame sizer) che ha un minimo di larghezza e altezza impostato (non sono sicuro se questo è il modo giusto per andare, ma sembra funzionare bene).

panel setup

ho generare XRC da wxFormBuilder e quindi utilizzare questo nella mia domanda, dove hanno la mia scena VTK impostato come di seguito:

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) 

ho cercato di risolvere i problemi quale elemento ha una dimensione di ciò che utilizzando la funzione on_size per MyScene, ma nulla di seguito risolve il problema. I valori riportati su sia che funzionano correttamente e sistemi errati sono come previsto.

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) 

Su un sistema che funziona correttamente, l'output è:

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

Su un "cattivo" di sistema di Windows 7, come nello screenshot in questa questione, l'output è simile:

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

Quindi, in sintesi, non so quale elemento viene ridimensionato in modo errato. La dimensione del renderer VTK è corretta, poiché l'acquisizione di uno screenshot VTK in file produce un'uscita 1280x720 che mostra l'intera scena senza clipping bianco e, come detto sopra, posso interagire con la scena VTK usando le porzioni bianche dello schermo.

Si tratta di un elemento VTK o WX che non viene ridimensionato correttamente? Qualcuno può darmi qualche consiglio su come risolvere ulteriormente questo problema? Quali altri elementi dovrei guardare alle dimensioni di? Come devo dimensionare il mio pannello grafico su 1280x720 e lasciare che la dimensione del pannello di configurazione sia appropriata?

Il problema si verifica quando si utilizzano Python 2.7.5, VTK 5.10.1 e wxpython 2.8, ma solo su alcune macchine di Windows 7.

+0

riprodurre il problema con uno dei campioni wxWidgets. Avrai molta più interazione. – Tamer

+0

@Tamer c'è un esempio di wxWidgets che riguarda l'utilizzo di una finestra VTK? Sospetto che il problema di dimensionamento sia più correlato al lato VTK delle cose rispetto al lato WX. – jozzas

+0

È possibile creare un campione eseguibile minimo che dimostri il problema? – Fenikso

risposta

1

Come te, sto sviluppando un'applicazione che utilizza vtk e wxpython, questo cocktail è a volte sorprendente! Penso che il tuo problema derivi da un'assenza di sizer. il frammento di sotto di lavoro sia su Linux e Windows (di cui 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() 

speranza che questo vi aiuterà