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()