2013-08-12 11 views
7

Ich erstelle eine Anwendung mit WxPython und VTK. Es gibt ein Konfigurationsfenster (wx.Panel) auf der linken Seite des Bildschirms und ein VTK-Fenster auf der rechten Seite, ebenfalls basierend auf einem wx.Panel. Die Panels werden in den Boxsizer des wxFrames platziert und mithilfe der proportionalen Skalierung wie in der wxFormBuilder-Anwendung definiert, die dann zum Generieren einer XRC-Datei verwendet wird.VTK-Fenster füllt sich nicht wx.Panel

enter image description here

Ich habe ein sehr spezifisches Problem mit einigen Maschinen Windows 7 nicht konsequent den VTK Teil des Fensters Sizing richtig - Siehe den weißen Rand um das Fenster VTK im Screenshot oben. Ich versuche, dieses VTK-Fenster zu einem festen 1280x720 zu machen - und das ist es - aber es gibt ein Dimensionierungsproblem mit irgendeinem Element, das den unteren und rechten Teil des Fensters zerhackt. Dieser Fehler tritt nicht auf, wenn er unter Ubuntu 10.04, XP oder einigen Builds von Windows 7 ausgeführt wird (ich bin mir nicht sicher, was an denen, die funktionieren und welche noch nicht, einzigartig ist).

Wenn dieser Fehler auftritt, kann ich mit den weißen Bereiche des Bildschirms interagieren - Klicks ordnungsgemäß durch die VTK Interaktorsystem behandelt, es ist also sorten von noch Teil meiner VTK-Szene.

Die Anwendungskonfiguration ist wie folgt, wobei der rechte VTK-Bereich der ist. Das Panel wird mit wxEXPAND und keine anderen Flags gesetzt, und alle Elemente in meiner App werden automatisch auf die Größe eingestellt (keine Mindest-, Höchst- oder Standardgröße). Die einzige Ausnahme ist bSizer1 (der Haupt-WxFrame-Sizer), der eine minimale Breite und Höhe hat (ich bin mir nicht sicher, ob dies der richtige Weg ist, aber es scheint in Ordnung zu sein).

panel setup

I XRC von wxFormBuilder erzeugen und diese dann in meiner Anwendung verwenden, wo meine VTK Szene wie folgt einstellen:

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) 

ich versucht haben, zu beheben, welches Element ist so bemessen, was Verwenden Sie die on_size Funktion für MyScene, aber nichts unter meinem Problem behoben. Die unter sowohl als auch korrekt funktionierenden und fehlerhaften Systeme berichteten Werte sind wie erwartet.

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) 

Auf einem korrekt funktionierenden System, der Ausgang ist:

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

Auf einem "schlechten" Windows 7-System, wie im Screenshot in dieser Frage, der Ausgang ist ähnlich:

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

Also zusammenfassend, ich weiß nicht, welches Element falsch sortiert wird. Die VTK-Renderer-Größe ist korrekt, da die Aufnahme eines VTK-Screenshots in eine Datei eine 1280x720-Ausgabe ergibt, die die gesamte Szene ohne Weißabschneiden zeigt. Wie oben gesagt, kann ich mit der VTK-Szene mit den abgeschnittenen weißen Teilen des Bildschirms interagieren.

Wird ein VTK- oder WX-Element nicht richtig dimensioniert? Kann mir jemand Tipps geben, wie man dieses Problem weiter beheben kann? Auf welche anderen Elemente sollte ich bei den Größen achten? Wie sollte ich mein Grafik-Panel auf 1280x720 skalieren und mein Config-Panel selbst passend dimensionieren lassen? Das Problem tritt auf, wenn Python 2.7.5, VTK 5.10.1 und wxpython 2.8, aber nur unter einige Windows 7-Computer verwendet werden.

+0

Reproduzieren des Problems helfen. Sie werden viel mehr Interaktion bekommen. – Tamer

+0

@Tamer gibt es ein WxWidgets-Beispiel mit einem VTK-Fenster? Ich vermute, dass das Dimensionierungsproblem eher mit der VTK-Seite als mit der WX-Seite zusammenhängt. – jozzas

+0

Können Sie ein minimal ausführbares Beispiel erstellen, das das Problem veranschaulicht? – Fenikso

Antwort

1

Wie Sie, ich entwickle eine Anwendung mit vtk und wxpython, dieser Cocktail ist manchmal überraschend! Ich denke, dein Problem kommt von einem Fehlen von Sizer. das Snippet unten Arbeit sowohl auf Linux und Windows (einschließlich 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() 

hofft, dies werden Sie mit einem der wxWidgets Proben

Verwandte Themen