2016-06-17 4 views
0

Ich bin neu bei Python/Wxpython. Ich habe einen wxpython-Rahmen, der vertikal aufgeteilt ist - 2 Panels anzeigen. Auf der linken Seite habe ich ein Anzeigefenster, in dem ein Bild angezeigt wird, indem der Benutzer nach einer Datei suchen kann, indem er auf eine Schaltfläche auf der rechten Seite klickt. Das Laden des Bildes funktioniert gut, aber ich möchte in der Lage sein, das Bild zu entfernen, indem ich auf eine erstellte 'Entfernen'-Schaltfläche (rechtes Feld) klicke, damit der Benutzer ein anderes Bild laden kann. Ich habe versucht, GetFocusedItem() zu suchen und das Panel auf der linken Seite auszuwählen, aber es gibt einen Fehler zurück '' panelLeft 'Objekt hat kein Attribut' GetFocusedItem '"Entfernen eines Bildes in einem Wx-Python-Panel mit einer Schaltfläche

Irgendwelche Vorschläge, wie Sie das am besten angehen?

Vielen Dank, HP

Sie den Code unten. Das Bild, das ich benutze, ist ein 3D-gerendertes Bild, das interaktiv ist und verschoben werden kann, aber ich möchte in der Lage sein, auf die Ereignisschaltfläche auf dem rechten Panel zu klicken, nämlich 'crops image' oder 'remove' To give you an idea of the display.

Die 'crop image' Schaltfläche hat eine angefügte Zeichenrechteckfunktion, mit der ich das Bild beschneiden und 'Remove' Taste, um das geladene Bild zu entfernen, aber ich kann nicht über die Hürde der rotierenden 3 zu bekommen -D Bild auf der linken Seite (mit der Maus) und nur sperren, wenn ich zuschneiden oder entfernen möchte. Hoffnung, die Sinn macht.

Irgendwelche Vorschläge?

import wx 
import vtk 
from vtk.wx.wxVTKRenderWindowInteractor import wxVTKRenderWindowInteractor 
from wx.lib.dialogs import openFileDialog 
from wx.lib import eventwatcher 


class p1(wx.Panel): 
    def __init__(self,parent): 
     wx.Panel.__init__(self, parent) 

     self.widget = wxVTKRenderWindowInteractor(self, -1) 
     self.widget.Enable(1) 
     self.widget.AddObserver("ExitEvent", lambda o,e,f=self: f.Close()) 
     self.sizer = wx.BoxSizer(wx.VERTICAL) 
     self.sizer.Add(self.widget, 1, wx.EXPAND) 
     self.SetSizer(self.sizer) 
     self.Layout() 
     self.ren = vtk.vtkRenderer() 
     self.filename="" 
     self.isploted = False 


    def renderthis(self): 

      self.widget.GetRenderWindow().AddRenderer(self.ren) 


      openFileDialog = wx.FileDialog(self,"Open STL file", "", self.filename,"*.stl",wx.FD_OPEN | wx.FD_FILE_MUST_EXIST) 

      if openFileDialog.ShowModal() == wx.ID_CANCEL: 
       return 
      self.filename = openFileDialog.GetPath() 

      reader = vtk.vtk.vtkSTLReader() 
      reader.SetFileName(self.filename) 

      normals = vtk.vtkPolyDataNormals() 
      normals.SetInputConnection(reader.GetOutputPort()) 
      normals.Update() 


      mapper = vtk.vtkPolyDataMapper() 
      mapper.SetInputConnection(normals.GetOutputPort()) 

      if self.isploted: 
       actor = self.ren.GetActors().GetlastActor() 
       self.ren.RemoveActor(actor) 
      actor = vtk.vtkActor() 
      actor.SetMapper(mapper) 

      self.ren.AddActor(actor)    

      if not self.isploted: 
       axes = vtk.vtkAxesActor() 
       self.marker = vtk.vtkOrientationMarkerWidget() 
       self.marker.SetInteractor(self.widget._Iren) 
       self.marker.SetOrientationMarker(axes) 
       self.marker.SetViewport(0.75,0,1,0.25) 
       self.marker.SetEnabled(1) 

      self.ren.ResetCamera() 
      self.ren.ResetCameraClippingRange() 
      cam = self.ren.GetActiveCamera() 
      cam.Elevation(10) 
      cam.Azimuth(70) 
      self.isploted = True 
      self.ren.Render() 

class VTKFrame(wx.Frame): 
    pos1 = None 
    pos2 = None 
    def __init__(self,parent,title): 
     wx.Frame.__init__(self,parent,title=title,size=(1050,600), style=wx.MINIMIZE_BOX|wx.SYSTEM_MENU| 
        wx.CAPTION|wx.CLOSE_BOX|wx.CLIP_CHILDREN) 


     self.sp = wx.SplitterWindow(self) 
     self.p1 = p1(self.sp) 
     self.p2 = wx.Panel(self.sp,style=wx.SUNKEN_BORDER) 

     self.sp.SplitVertically(self.p1,self.p2,870) 

     self.statusbar = self.CreateStatusBar() 
     self.statusbar.SetStatusText("Click to load a STL file") 

     self.plotbut = wx.Button(self.p2,-1,"Browse for STL file ", size=(120,20),pos=(10,10)) 
     self.plotbut.Bind(wx.EVT_BUTTON, self.plot) 

     self.Box = wx.BoxSizer(wx.VERTICAL) 

     self.button1 = wx.Button(self.p2,2, "Crop image ", size=(120,20),pos=(10,35)) 
     self.button1.Bind(wx.EVT_BUTTON,self.OnPaint) 

     self.button2 = wx.Button(self.p2,3, "Remove", size=(120,20),pos=(10,60)) 
     self.button2.Bind(wx.EVT_BUTTON, self.OnButton2) 


     self.button3 = wx.Button(self.p2,4,"Close", size=(120,20),pos=(10,85)) 
     self.button3.Bind(wx.EVT_BUTTON, self.OnButton3) 


    def plot(self,event): 
     self.p1.renderthis() 
     self.SetTitle("STL File Viewer: "+self.p1.filename) 



    def OnButton2(self,event): 
     wx.EmptyImage(self.p1) 


    def OnButton3(self,event): 
     self.Close() 


    def OnPaint(self,event): 
     if self.pos1 is None or self.pos2 is None: return 

     dc = wx.PaintDC(self.p1) 
     dc.SetPen(wx.Pen('White', 1)) 
     dc.SetBrush(wx.Brush(wx.Color(0,0,0), wx.RED)) 

     dc.DrawRectangle(self.pos1.x, self.pos1.y, self.pos2.x - self.pos1.x, self.pos2.y -self.pos2.y) 

     def PrintPos(self,position): 
      return str(position.x) + "" + str(position.y)   



app = wx.App(redirect=False) 
frame = VTKFrame(None,"STL File Viewer") 
frame.Show() 
app.MainLoop() 

Antwort

0

Sie sollten einen Griff auf dem wx.StaticBitmap Widget haben, dass Sie das Bild anzuzeigen, verwenden. Sie können dieses Widget einfach ausblenden oder auf wx.EmptyImage setzen.

Ich schrieb eine einfache Bildbetrachter-Anwendung, die Sie auschecken können. Es könnte Ihnen dabei helfen herauszufinden:

import os 
import wx 

class PhotoCtrl(wx.App): 
    def __init__(self, redirect=False, filename=None): 
     wx.App.__init__(self, redirect, filename) 
     self.frame = wx.Frame(None, title='Photo Control') 

     self.panel = wx.Panel(self.frame) 

     self.PhotoMaxSize = 240 

     self.createWidgets() 
     self.frame.Show() 

    def createWidgets(self): 
     instructions = 'Browse for an image' 
     img = wx.EmptyImage(240,240) 
     self.imageCtrl = wx.StaticBitmap(self.panel, wx.ID_ANY, 
             wx.BitmapFromImage(img)) 

     instructLbl = wx.StaticText(self.panel, label=instructions) 
     self.photoTxt = wx.TextCtrl(self.panel, size=(200,-1)) 
     browseBtn = wx.Button(self.panel, label='Browse') 
     browseBtn.Bind(wx.EVT_BUTTON, self.onBrowse) 

     self.mainSizer = wx.BoxSizer(wx.VERTICAL) 
     self.sizer = wx.BoxSizer(wx.HORIZONTAL) 

     self.mainSizer.Add(wx.StaticLine(self.panel, wx.ID_ANY), 
          0, wx.ALL|wx.EXPAND, 5) 
     self.mainSizer.Add(instructLbl, 0, wx.ALL, 5) 
     self.mainSizer.Add(self.imageCtrl, 0, wx.ALL, 5) 
     self.sizer.Add(self.photoTxt, 0, wx.ALL, 5) 
     self.sizer.Add(browseBtn, 0, wx.ALL, 5)   
     self.mainSizer.Add(self.sizer, 0, wx.ALL, 5) 

     self.panel.SetSizer(self.mainSizer) 
     self.mainSizer.Fit(self.frame) 

     self.panel.Layout() 

    def onBrowse(self, event): 
     """ 
     Browse for file 
     """ 
     wildcard = "JPEG files (*.jpg)|*.jpg" 
     dialog = wx.FileDialog(None, "Choose a file", 
           wildcard=wildcard, 
           style=wx.OPEN) 
     if dialog.ShowModal() == wx.ID_OK: 
      self.photoTxt.SetValue(dialog.GetPath()) 
     dialog.Destroy() 
     self.onView() 

    def onView(self): 
     filepath = self.photoTxt.GetValue() 
     img = wx.Image(filepath, wx.BITMAP_TYPE_ANY) 
     # scale the image, preserving the aspect ratio 
     W = img.GetWidth() 
     H = img.GetHeight() 
     if W > H: 
      NewW = self.PhotoMaxSize 
      NewH = self.PhotoMaxSize * H/W 
     else: 
      NewH = self.PhotoMaxSize 
      NewW = self.PhotoMaxSize * W/H 
     img = img.Scale(NewW,NewH) 

     self.imageCtrl.SetBitmap(wx.BitmapFromImage(img)) 
     self.panel.Refresh() 

if __name__ == '__main__': 
    app = PhotoCtrl() 
    app.MainLoop() 

Sie mehr darüber lesen können here

Verwandte Themen