Inheritance problem. Creating an instance.

.nu bruce83 at gmail.com
Tue Dec 5 22:19:46 EST 2006


#!/usr/bin/env python
# -*- coding: utf-8 -*-


# Name: Sleepy Hollow
# Author: .nu

import wx
import os
import sys
NEW_ID = 1; OPEN_ID = 2; SAVE_ID = 3; SAVE_AS_ID = 4;
QUIT_ID = 5; UNDO_ID = 6; REDO_ID = 7; HELPME_ID = 8;
ABOUT_ID = 9; OPTIONS_ID = 10

APP_NAME = 'Sleepy Hollow'

class SleepyHollow(wx.Frame):
	def __init__(self, parent, id, title):
		wx.Frame.__init__(self, parent, id, title, size=(600, 400))
		self.SetTitle(APP_NAME)
		# create sizers
		self.vbox = wx.BoxSizer(wx.VERTICAL)

		# create instance of the NoteBook class, then put a tab on it
		self.notebook = NoteBook(self)
		self.notebook.createTab()

		# Create items(statusbar, number panel, etc)
		self.statusbar = self.CreateStatusBar()
		#self.statusbar.Hide()

		#wx.EVT_KEY_UP(self.textarea, self.key_press)


		# Call methods that can be turned on/off through options
		self.statusbar_toggle(self, 0)


		#self.hbox.Add(self.textarea, 1, wx.EXPAND|wx.ADJUST_MINSIZE, 0)
		#self.vbox.Add(self.hbox, 1, wx.EXPAND, 0)

		#self.SetAutoLayout(True)

		self.Layout()

		## Menu
		self.menubar = wx.MenuBar()
		self.SetMenuBar(self.menubar)

		self.file = wx.Menu()
		self.new = wx.MenuItem(self.file, NEW_ID, 'new')
		self.file.AppendItem(self.new)
		self.open = wx.MenuItem(self.file, OPEN_ID, '&Open\tCtrl+O')
		self.file.AppendItem(self.open)
		self.file.AppendSeparator()
		self.save = wx.MenuItem(self.file, SAVE_ID, '&Save\tCtrl+S')
		self.file.AppendItem(self.save)
		self.saveas = wx.MenuItem(self.file, SAVE_AS_ID, '&Save
as\tCtrl+Shift+s')
		self.file.AppendItem(self.saveas)
		self.file.AppendSeparator()
		self.quit = wx.MenuItem(self.file, QUIT_ID, '&Quit')
		self.file.AppendItem(self.quit)

		self.edit = wx.Menu()
		self.undo = wx.MenuItem(self.edit, UNDO_ID, '&Undo\tCtrl+z')
		self.edit.AppendItem(self.undo)
		self.redo = wx.MenuItem(self.edit, REDO_ID, '&Redo\tCtrl+Shift+z')
		self.edit.AppendItem(self.redo)
		self.edit.AppendSeparator()
		self.options = wx.MenuItem(self.edit, OPTIONS_ID, '&Options\tCtrl+p')
		self.edit.AppendItem(self.options)

		self.help = wx.Menu()
		self.helpme = wx.MenuItem(self.help, HELPME_ID, '&Help\tF1')
		self.help.AppendItem(self.helpme)
		self.about = wx.MenuItem(self.help, ABOUT_ID, '&About\tF2')
		self.help.AppendItem(self.about)

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

		# bind items to functions
		self.Bind(wx.EVT_MENU, self.New, id=NEW_ID)
		self.Bind(wx.EVT_MENU, self.Open, id=OPEN_ID)
		self.Bind(wx.EVT_MENU, self.Save, id=SAVE_ID)
		self.Bind(wx.EVT_MENU, self.Saveas, id=SAVE_AS_ID)
		self.Bind(wx.EVT_MENU, self.Undo, id=UNDO_ID)
		self.Bind(wx.EVT_MENU, self.Redo, id=REDO_ID)
		self.Bind(wx.EVT_MENU, self.Helpme, id=HELPME_ID)
		self.Bind(wx.EVT_MENU, self.About, id=ABOUT_ID)
		self.Bind(wx.EVT_MENU, self.Quit, id=QUIT_ID)
		self.Bind(wx.EVT_MENU, self.Options, id=OPTIONS_ID)


		## Random variables
		self.fileName = ''
		self.dirName = ''

		self.tempFileName = ''
		self.tempDirName = ''

		self.oldPos = -1
		self.show_position(self)


	## Menu Methods
	def New(self, event):
		self.popup(self, "Would you like to save this file before starting a
new one?", "Save?", wx.YES | wx.NO | wx.ICON_QUESTION)
		#self.textarea.SetValue('')
		self.notebook.createTab()

	def Open(self, event):
		open_dialog = wx.FileDialog(self, "Open", self.dirName,
self.fileName, "Text Files (*.txt)|*.txt|All Files|*.*", wx.OPEN)
		# If open_dialog opens, try to get dirName and fileName, and open it
in the textarea
		if (open_dialog.ShowModal() == wx.ID_OK):
			try:
				self.tempDirName = open_dialog.GetDirectory()
				self.tempFileName = open_dialog.GetFilename()
				self.file = file(os.path.join(self.tempDirName, self.tempFileName),
'r')
				self.fileContents = self.file.read()
				self.textarea.SetValue(self.fileContents.decode('utf-8'))
				self.SetTitle(APP_NAME + " |  " + self.tempFileName + "")
				self.fileName = self.tempFileName
				print '--------- Open succeeded. Showing temporary and current
filenames (testing purposes) -------';
				print '--------- Open succeeded. Showing temporary and current
filenames (testing purposes) -------';
				print 'fileName    :',self.fileName
				self.dirName = self.tempDirName
				self.file.close()
			except:
				self.tempDirName = self.dirName
				self.tempFilename = self.fileName
				print '--------- open failed. showing file names again (testing
purposes) ----------'
				print 'temp file     :',self.tempFileName
				print 'fileName      :', self.fileName
				self.popup(self,'Could Not open file.', 'Error', wx.OK
|wx.ICON_ERROR)
		open_dialog.Destroy()


	def Save(self, event):
		if (self.fileName != "") and (self.dirName != ""):
			self.file = file(os.path.join(self.dirName, self.fileName), 'w') #
<-- Same as:  self.file = file(self.dirName + '/' + self.fileName, 'w')
			self.fileContents = self.textarea.GetValue()
			self.file.write(self.fileContents.encode('utf-8'))
			self.SetTitle(APP_NAME + " |  " + self.fileName + "")
			self.file.close()
			print '*saved*'

		else:
			self.Saveas(self)


	def Saveas(self, event):
	# Ask for filename
		saveDialogue = wx.FileDialog(self, "Save As", self.dirName,
self.fileName, "Text Files (*.txt)|*.txt|All Files|*.*", wx.SAVE |
wx.OVERWRITE_PROMPT)
		if (saveDialogue.ShowModal() == wx.ID_OK):
			self.fileName = saveDialogue.GetFilename()
			self.dirName = saveDialogue.GetDirectory()
			if self.Save(self):
				self.SetTitle(APP_NAME + " |  " + self.fileName + "")
		saveDialogue.Destroy()


	def Quit(self, event):
		self.Destroy()

	def Undo(self, event):
		pass

	def Redo(self, event):
		pass

	def Helpme(self, event):
		self.popup(self, "No help file has been created yet.", "Help", wx.OK
| wx.ICON_INFORMATION)

	def About(self, event):
		self.popup(self, "Milkpad Lite 1.0\nby .nu\nwww.ficti0n.com",
"About", wx.OK | wx.ICON_INFORMATION)

	def Options(self, event):
		pass



	## Option Methods
	def statusbar_toggle(self, event, switch):
		#if 1, then show. if 0, hide.
		if (switch == True):
			self.statusbar.Show()
			self.Refresh()
		elif (switch == False):
			self.statusbar.Hide()





	## Random Methods
	def popup(self, event, message, title, button_type_and_icon):
		# Show a pop-up message
		popup_dialog = wx.MessageDialog(self, message, title,
button_type_and_icon)
		popup_dialog.ShowModal()
		popup_dialog.Destroy()

	def key_press(self, event):
		self.show_position(self)
		event.Skip()

	def show_position(self, event):
		#(bPos,ePos) = self.textarea.GetSelection()
		#if (self.oldPos != ePos):
			#(c,r) = self.textarea.PositionToXY(ePos)
			#self.SetStatusText(" " + str((r+1,c+1)))
		#self.oldPos = ePos
		pass


## This is the Notebook class. It is called in SleepyHollow's __init__
method to
## Create the notebook and createTab() creates/add a new tab(file->new)
class NoteBook(wx.Notebook):
	def __init__(self, parent):
		wx.Notebook.__init__(self, parent, -1, style=wx.NB_TOP)
		#print parent
		#self.notebook = wx.Notebook(parent, -1, style=wx.NB_TOP)
		self.number_of_tabs = 0

"""		#*_*_*__*_*_*_*_*_*_*_*__*_*_*_*_*_*_*_*__*___ERROR__*__*_*_*_*_*_*_*_*__*_*_*_*_*_*_*_*__*_*_*_*_*_*_*_*__*_*_*_*_*_
		# This is where I am having problems. I am trying to create an
instance of  SleepyHollow
		# So i can call its 'popup' method. But i keep getting errors when
trying to create this instance
		sh = SleepyHollow(parent, -1, '')
		#*_*_*__*_*_*_*_*_*_*_*__*_*_*_*_*_*_*_*__*___ERROR__*__*_*_*_*_*_*_*_*__*_*_*_*_*_*_*_*__*_*_*_*_*_*_*_*__*_*_*_*_*_
"""

	def tabCounter(self, action):
		""" action is either 'add' or 'subtract' """
		if(action == 'add'):
			self.number_of_tabs += 1
			print self.number_of_tabs
		elif(action == 'subtract'):
			self.number_of_tabs -= 1
		#SleepyHollow.popup(SleepyHollow,'Could Not open file.', 'Error',
wx.OK |wx.ICON_ERROR)

	def createTab(self):
		#self.notebook_pane1 = wx.Panel(self.notebook)
		#wx.Panel.__init__(self)
		#t = wx.StaticText(self, -1, "This is a PageOne object", (20,20))
		self.textarea = wx.TextCtrl(self, -1, ' hehe', style=wx.TE_MULTILINE)
		self.AddPage(self.textarea, 'tab')
		self.tabCounter('add')

	def deleteTab(self):
		pass



if __name__ == "__main__":
	app = wx.App(0)
	MainFrame = SleepyHollow(None, -1, '')
	MainFrame.Show()
	app.MainLoop()




So there i have two classes.
The main class, SleepyHollow, creates the main frame and the menu.
Inside the SleepyHollow class, i create an instance to NoteBook class
and call on it.
The NoteBook class creates a notebook and adds tabs to the notebook.

However, inside the NoteBook class, i try to call a SleepyHollow method
(the 'popup' method, for displaying dialogues), but i keep getting this
error:

/usr/bin/python -u  "path/to/file/file.py"
Traceback (most recent call last):

 File "path/to/file/file.py", line 256, in ?
    MainFrame = SleepyHollow(None, -1, '')

  File "path/to/file/file.py", line 26, in __init__
    self.notebook = NoteBook(self)

  File "path/to/file/file.py", line 222, in __init__
    wx.Notebook.__init__(self, parent, -1, style=wx.NB_TOP)

  File "path/to/file/file.py", line 3117, in __init__
    self.this = newobj.this
AttributeError: 'PySwigObject' object has no attribute 'this'




More information about the Python-list mailing list