#!/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' -- http://mail.python.org/mailman/listinfo/python-list