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.
Global name 'img' is not defined?
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()
La solution
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow