¿Cómo optimizar una GUI de wxpython (preferiblemente sin subprocesos)? sugerencias para el código a continuación?

Mi GUI con el siguiente código no tiene subprocesos. La pantalla de imagen ocupa mucha memoria y la GUI está bloqueada, y solo puedo llamar a una función a la vez. Sugiera trucos simples para hacer que la GUI sea más rápida. De todos modos, las tareas de procesamiento de imágenes como La agrupación tarda de 5 a 6 minutos.

import wx
import sys
import os
import matplotlib
import OpenGL
import PIL
import time
from spectral.graphics.hypercube import hypercube
from spectral import *
init_graphics()

class RedirectText(object):
 def __init__(self,awxTextCtrl):
    self.out=awxTextCtrl

def write(self,string):
    self.out.WriteText(string)            


 class Frame(wx.Frame):
def __init__(self, title,*args,**kwargs):
    wx.Frame.__init__(self, None, title=title, size=       (1000,85),style=wx.MINIMIZE_BOX|wx.CLOSE_BOX|wx.RESIZE_BORDER|wx.SYSTEM_MENU|wx.CAPTION|wx.CLIP_CHILDREN)
    self.Bind(wx.EVT_CLOSE, self.OnClose)
    panel=wx.Panel(self,-1)
    self.button=wx.Button(panel,label="Open",pos=(0,0),size=(50,30))
    self.button1=wx.Button(panel,label="Save",pos=(51,0),size=(50,30))
    self.button2=wx.Button(panel,label="ROI",pos=(102,0),size=(50,30))
    self.button3=wx.Button(panel,label="Tone",pos=(153,0),size=(50,30))
    self.slider=wx.Slider(panel,pos=(204,0))
    self.button4=wx.Button(panel,label="Header",pos=(305,0),size=(50,30))
    self.button5=wx.Button(panel,label="Cluster",pos=(356,0),size=(50,30))
    self.button6=wx.Button(panel,label="Cube",pos=(407,0),size=(50,30))
    self.button7=wx.Button(panel,label="Gaussian",pos=(458,0),size=(50,30))
    self.Bind(wx.EVT_BUTTON, self.OnCubeClick,self.button5)
    self.Bind(wx.EVT_BUTTON, self.OnHeadClick,self.button4)
    self.Bind(wx.EVT_BUTTON, self.OnSaveClick,self.button1)
    self.Bind(wx.EVT_BUTTON, self.OnButtonClick,self.button)
    self.Bind(wx.EVT_BUTTON, self.OnCClick,self.button6)
    self.Bind(wx.EVT_BUTTON, self.OnGClick,self.button7)
    #self.std=wx.TextCtrl(panel,pos=(0,31), size=(500,-1))
    self.loc=wx.TextCtrl(panel,pos=(700,0), size=(300,-1))
    self.status = wx.TextCtrl(panel,-1,'Choose file',pos=(800,22),size=(200,-1))
    #redir=RedirectText(self.std)
    #sys.stdout=redir


def OnButtonClick(self,event):
    wild="HSi Files|*.lan*|All Files|*.*"
    dlg=wx.FileDialog(self,message="Choose a File",wildcard=wild,style=wx.FD_OPEN)
    if dlg.ShowModal() == wx.ID_OK:
        time.sleep(0.5)
        self.loc.SetValue(dlg.GetPath())
        dlg.Destroy()
        self.Onview()

def Onview(self):
    filepath=self.loc.GetValue()
    img=image(filepath)
    time.sleep(1)
    view(img)
    time.sleep(1)
    self.status.SetValue('View Ready')



def OnHeadClick(self,event):

    filepath=self.loc.GetValue()
    img=image(filepath)
    self.status.SetValue(img.shape)

def OnCubeClick(self,event):
    time.sleep(0.2)
    self.status.SetValue('Clustering')
    filepath=self.loc.GetValue()
    img= image(filepath).load()
    (m, c) = cluster(img, 20)
    view_indexed(m)
    self.status.SetValue('Clustering View Ready')

def OnCClick(self,event):
    self.status.SetValue('Cube view')
    time.sleep(5)
    filepath=self.loc.GetValue()
    img= image(filepath).load()
    hypercube(img, bands=[29, 19, 9])

def OnGClick(self,event):
    self.status.SetValue('Gaussian procesing')
    time.sleep(30)
    filepath=self.loc.GetValue()
    gt=image(filepath).read_band(0)
    img=image(filepath)
    classes = create_training_classes(img,gt)
    gmlc = GaussianClassifier(classes)
    clMap = gmlc.classify_image(img)
    view_indexed(clMap)
    self.status.SetLabel('Gaussian Ready')


def OnSaveClick(self,event):
    self.status.SetValue('Save File')
    wild="HSi Files|*.lan*|All Files|*.*"
    dlg=wx.FileDialog(self,message="Save AS",wildcard=wild,style=wx.FD_SAVE|wx.FD_OVERWRITE_PROMPT)
    if dlg.ShowModal() == wx.ID_OK:
        path=dlg.GetPath()
        self.Save(path)
        self.file=path
        dlg.Destroy()


def OnClose(self, event):
    dlg = wx.MessageDialog(self, 
        "Do you really want to close BBvw ?",
        "Confirm Exit", wx.OK|wx.CANCEL|wx.ICON_QUESTION)
    result = dlg.ShowModal()
    dlg.Destroy()
    if result == wx.ID_OK:
        self.Destroy()




  app = wx.App(redirect=False)
  top = Frame("BBvw")
  top.Show()
  app.MainLoop()

preguntado el 03 de mayo de 12 a las 10:05

1 Respuestas

Los procesos de ejecución prolongada siempre deben ir en subprocesos separados. De lo contrario, bloquearán el bucle principal de la GUI. Si mostrar la imagen ocupa mucha memoria, entonces supongo que está mostrando fotos de alta resolución a resolución completa. Intente crear un conjunto de fotos de menor resolución para mostrarlas en su lugar (como miniaturas o algo así). A menos que necesite que se muestre la resolución completa, no lo haga.

contestado el 03 de mayo de 12 a las 14:05

¿Cómo debo mostrar imágenes en baja resolución? - gisgyaan

Use PIL para crear algunas versiones de baja resolución en el disco o en la memoria: mike driscoll

Gracias. Planeaba usar PyPy; no está disponible para Windows de 64 bits y ahora planeo usar PyOpenCL para ayudar con el procesamiento de imágenes para poder aprovechar la GPU. ¿Crees que habrá una diferencia significativa? en velocidades. Dado que mi proyecto es académico, puedo experimentar un poco. Subprocesos es la salida obvia, pero quiero otras formas de optimizar la velocidad de procesamiento. - gisgyaan

Um... Vi en el blog de PyPy que de alguna manera habían logrado que wxPython se ejecutara en él, así que en teoría eso también podría acelerar las cosas para ti. Sé que algunas personas tomarán cosas difíciles y las reescribirán en C y luego las envolverán en Python, pero creo que eso es un poco extremo para esto. - mike driscoll

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.