Question

I'm new programming interfaces. I'm creating a simple interface with wxpython and openCV to open an image, save it and close the interface. You can see my code below. I can open an image and close the interface. Even, I show dialog boxes for the opening and saving routines but saving is where I have problems. I don't know how to send to OnSave the img (image object) to be saved. This is not clear to me. Can you help me? Thanks in advance.

import wx
import cv2

class MyMenu(wx.Frame):
def __init__(self, parent, id, title):
    wx.Frame.__init__(self, parent, id, title, wx.DefaultPosition, wx.Size(200, 150))
    menubar = wx.MenuBar()
    file = wx.Menu()
    edit = wx.Menu()
    help = wx.Menu()
    file.Append(101, '&Open', 'Open a new document')
    file.Append(102, '&Save', 'Save the document')
    file.AppendSeparator()
    quit = wx.MenuItem(file, 105, '&Quit\tCtrl+Q', 'Quit the Application')
    file.AppendItem(quit)

    menubar.Append(file, '&File')
    menubar.Append(edit, '&Edit')
    menubar.Append(help, '&Help')

    self.SetMenuBar(menubar)
    self.CreateStatusBar()

    self.Bind(wx.EVT_MENU, self.OnOpen, id=101)
    self.Bind(wx.EVT_MENU, self.OnSave, id=102)
    self.Bind(wx.EVT_MENU, self.OnQuit, id=105)

def OnOpen(self, event):
    openFileDialog = wx.FileDialog(self, "Open", "", "",
                                   "PNG files (*.png)|*.png|BMP files (*.bmp)|*.bmp",
                                   wx.FD_OPEN | wx.FD_FILE_MUST_EXIST)
    openFileDialog.ShowModal()
    path = openFileDialog.GetPath()
    openFileDialog.Destroy()
    img = cv2.imread(str(path))
    cv2.imshow('img', img)
    return img

def OnSave(self, event):
    saveFileDialog = wx.FileDialog(self, "Save As", "", "",
                                   "PNG files (*.png)|*.png|BMP files (*.bmp)|*.bmp",
                                   wx.FD_SAVE | wx.FD_OVERWRITE_PROMPT)
    saveFileDialog.ShowModal()
    path_save = saveFileDialog.GetPath()
    print path_save
    saveFileDialog.Destroy()
    cv2.imwrite(str(path_save), img)

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

class MyApp(wx.App):
    def OnInit(self):
       frame = MyMenu(None, -1, 'menu1.py')
       frame.Show(True)
       return True

app = MyApp(0)
app.MainLoop()

I get the following error:

NameError: global name 'img' is not defined

EDIT (final version):

import wx
import cv2
import numpy as np


class MyMenu(wx.Frame):
def __init__(self, parent, id, title):
    wx.Frame.__init__(self, parent, id, title, wx.DefaultPosition, wx.Size(200, 150))
    img = np.array([0])
    menubar = wx.MenuBar()
    file = wx.Menu()
    edit = wx.Menu()
    help = wx.Menu()
    file.Append(101, '&Open', 'Open a new document')
    file.Append(102, '&Save', 'Save the document')
    file.AppendSeparator()
    quit = wx.MenuItem(file, 105, '&Quit\tCtrl+Q', 'Quit the Application')
    file.AppendItem(quit)

    menubar.Append(file, '&File')
    menubar.Append(edit, '&Edit')
    menubar.Append(help, '&Help')

    self.SetMenuBar(menubar)
    self.CreateStatusBar()

    self.Bind(wx.EVT_MENU, self.OnOpen, id=101)
    self.Bind(wx.EVT_MENU, self.OnSave, id=102)
    self.Bind(wx.EVT_MENU, self.OnQuit, id=105)

def OnOpen(self, event):
    openFileDialog = wx.FileDialog(self, "Open", "", "",
                                   "PNG files (*.png)|*.png|BMP files (*.bmp)|*.bmp",
                                   wx.FD_OPEN | wx.FD_FILE_MUST_EXIST)
    openFileDialog.ShowModal()
    path = openFileDialog.GetPath()
    openFileDialog.Destroy()
    self.img = cv2.imread(str(path))
    cv2.imshow('img', self.img)

def OnSave(self, event):
    saveFileDialog = wx.FileDialog(self, "Save As", "", "",
                                   "PNG files (*.png)|*.png|BMP files (*.bmp)|*.bmp",
                                   wx.FD_SAVE | wx.FD_OVERWRITE_PROMPT)
    saveFileDialog.ShowModal()
    path_save = saveFileDialog.GetPath()
    print path_save
    saveFileDialog.Destroy()
    cv2.imwrite(str(path_save), self.img)

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


class MyApp(wx.App):
def OnInit(self):
    frame = MyMenu(None, -1, 'menu1.py')
    frame.Show(True)
    return True

app = MyApp(0)
app.MainLoop()
Était-ce utile?

La solution

Looking at it you mean the img used in OnSave, if you look, img isn't defined in the scope, nor is it globally defined.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top