#!/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(A PP_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.c reateTab()
# Create items(statusbar , number panel, etc)
self.statusbar = self.CreateStat usBar()
#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.AD JUST_MINSIZE, 0)
#self.vbox.Add( self.hbox, 1, wx.EXPAND, 0)
#self.SetAutoLa yout(True)
self.Layout()
## Menu
self.menubar = wx.MenuBar()
self.SetMenuBar (self.menubar)
self.file = wx.Menu()
self.new = wx.MenuItem(sel f.file, NEW_ID, 'new')
self.file.Appen dItem(self.new)
self.open = wx.MenuItem(sel f.file, OPEN_ID, '&Open\tCtrl+O' )
self.file.Appen dItem(self.open )
self.file.Appen dSeparator()
self.save = wx.MenuItem(sel f.file, SAVE_ID, '&Save\tCtrl+S' )
self.file.Appen dItem(self.save )
self.saveas = wx.MenuItem(sel f.file, SAVE_AS_ID, '&Save
as\tCtrl+Shift+ s')
self.file.Appen dItem(self.save as)
self.file.Appen dSeparator()
self.quit = wx.MenuItem(sel f.file, QUIT_ID, '&Quit')
self.file.Appen dItem(self.quit )
self.edit = wx.Menu()
self.undo = wx.MenuItem(sel f.edit, UNDO_ID, '&Undo\tCtrl+z' )
self.edit.Appen dItem(self.undo )
self.redo = wx.MenuItem(sel f.edit, REDO_ID, '&Redo\tCtrl+Sh ift+z')
self.edit.Appen dItem(self.redo )
self.edit.Appen dSeparator()
self.options = wx.MenuItem(sel f.edit, OPTIONS_ID, '&Options\tCtrl +p')
self.edit.Appen dItem(self.opti ons)
self.help = wx.Menu()
self.helpme = wx.MenuItem(sel f.help, HELPME_ID, '&Help\tF1')
self.help.Appen dItem(self.help me)
self.about = wx.MenuItem(sel f.help, ABOUT_ID, '&About\tF2')
self.help.Appen dItem(self.abou t)
self.menubar.Ap pend(self.file, '&File')
self.menubar.Ap pend(self.edit, '&Edit')
self.menubar.Ap pend(self.help, '&Help')
# bind items to functions
self.Bind(wx.EV T_MENU, self.New, id=NEW_ID)
self.Bind(wx.EV T_MENU, self.Open, id=OPEN_ID)
self.Bind(wx.EV T_MENU, self.Save, id=SAVE_ID)
self.Bind(wx.EV T_MENU, self.Saveas, id=SAVE_AS_ID)
self.Bind(wx.EV T_MENU, self.Undo, id=UNDO_ID)
self.Bind(wx.EV T_MENU, self.Redo, id=REDO_ID)
self.Bind(wx.EV T_MENU, self.Helpme, id=HELPME_ID)
self.Bind(wx.EV T_MENU, self.About, id=ABOUT_ID)
self.Bind(wx.EV T_MENU, self.Quit, id=QUIT_ID)
self.Bind(wx.EV T_MENU, self.Options, id=OPTIONS_ID)
## Random variables
self.fileName = ''
self.dirName = ''
self.tempFileNa me = ''
self.tempDirNam e = ''
self.oldPos = -1
self.show_posit ion(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_QUESTIO N)
#self.textarea. SetValue('')
self.notebook.c reateTab()
def Open(self, event):
open_dialog = wx.FileDialog(s elf, "Open", self.dirName,
self.fileName, "Text Files (*.txt)|*.txt|A ll Files|*.*", wx.OPEN)
# If open_dialog opens, try to get dirName and fileName, and open it
in the textarea
if (open_dialog.Sh owModal() == wx.ID_OK):
try:
self.tempDirNam e = open_dialog.Get Directory()
self.tempFileNa me = open_dialog.Get Filename()
self.file = file(os.path.jo in(self.tempDir Name, self.tempFileNa me),
'r')
self.fileConten ts = self.file.read( )
self.textarea.S etValue(self.fi leContents.deco de('utf-8'))
self.SetTitle(A PP_NAME + " | " + self.tempFileNa me + "")
self.fileName = self.tempFileNa me
print '--------- Open succeeded. Showing temporary and current
filenames (testing purposes) -------';
print '--------- Open succeeded. Showing temporary and current
filenames (testing purposes) -------';
print 'fileName :',self.fileNam e
self.dirName = self.tempDirNam e
self.file.close ()
except:
self.tempDirNam e = self.dirName
self.tempFilena me = self.fileName
print '--------- open failed. showing file names again (testing
purposes) ----------'
print 'temp file :',self.tempFil eName
print 'fileName :', self.fileName
self.popup(self ,'Could Not open file.', 'Error', wx.OK
|wx.ICON_ERROR)
open_dialog.Des troy()
def Save(self, event):
if (self.fileName != "") and (self.dirName != ""):
self.file = file(os.path.jo in(self.dirName , self.fileName), 'w') #
<-- Same as: self.file = file(self.dirNa me + '/' + self.fileName, 'w')
self.fileConten ts = self.textarea.G etValue()
self.file.write (self.fileConte nts.encode('utf-8'))
self.SetTitle(A PP_NAME + " | " + self.fileName + "")
self.file.close ()
print '*saved*'
else:
self.Saveas(sel f)
def Saveas(self, event):
# Ask for filename
saveDialogue = wx.FileDialog(s elf, "Save As", self.dirName,
self.fileName, "Text Files (*.txt)|*.txt|A ll Files|*.*", wx.SAVE |
wx.OVERWRITE_PR OMPT)
if (saveDialogue.S howModal() == wx.ID_OK):
self.fileName = saveDialogue.Ge tFilename()
self.dirName = saveDialogue.Ge tDirectory()
if self.Save(self) :
self.SetTitle(A PP_NAME + " | " + self.fileName + "")
saveDialogue.De stroy()
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_INFORMA TION)
def About(self, event):
self.popup(self , "Milkpad Lite 1.0\nby .nu\nwww.ficti0 n.com",
"About", wx.OK | wx.ICON_INFORMA TION)
def Options(self, event):
pass
## Option Methods
def statusbar_toggl e(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.MessageDialo g(self, message, title,
button_type_and _icon)
popup_dialog.Sh owModal()
popup_dialog.De stroy()
def key_press(self, event):
self.show_posit ion(self)
event.Skip()
def show_position(s elf, event):
#(bPos,ePos) = self.textarea.G etSelection()
#if (self.oldPos != ePos):
#(c,r) = self.textarea.P ositionToXY(ePo s)
#self.SetStatus Text(" " + 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.Not ebook):
def __init__(self, parent):
wx.Notebook.__i nit__(self, parent, -1, style=wx.NB_TOP )
#print parent
#self.notebook = wx.Notebook(par ent, -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(pa rent, -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.p opup(SleepyHoll ow,'Could Not open file.', 'Error',
wx.OK |wx.ICON_ERROR)
def createTab(self) :
#self.notebook_ pane1 = wx.Panel(self.n otebook)
#wx.Panel.__ini t__(self)
#t = wx.StaticText(s elf, -1, "This is a PageOne object", (20,20))
self.textarea = wx.TextCtrl(sel f, -1, ' hehe', style=wx.TE_MUL TILINE)
self.AddPage(se lf.textarea, 'tab')
self.tabCounter ('add')
def deleteTab(self) :
pass
if __name__ == "__main__":
app = wx.App(0)
MainFrame = SleepyHollow(No ne, -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(No ne, -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.__i nit__(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'