This code is a direct replacement for SmallApp, updated for the wx namespace

### SmallApp.py/pyw:
###     Small test wxPython program along with py2Exe scripts to build a windows executable
###     ToDo:
###         - wrap RTB, menu items, etc in classes (see DemoA.py for a good example)

import os
import time
import wx

#-------------------------------------------------------------------------------
# Define booleans until Python ver 2.3
True=1
False=0

APP_NAME = "SmallApp"

# --- Menu and control ID's
ID_NEW=101
ID_OPEN=102
ID_SAVE=103
ID_SAVEAS=104
ID_EXIT=109
ID_ABOUT=141
ID_RTB=201

SB_INFO = 0
SB_ROWCOL = 1
SB_DATETIME = 2

#-------------------------------------------------------------------------------
# --- our frame class
class smallAppFrame(wx.Frame):
    """ Derive a new class of wxFrame. """


    def __init__(self, parent, id, title):
        # --- a basic window frame/form
        wx.Frame.__init__(self, parent = None, id = -1,
                         title = APP_NAME + " - Greg's 1st wxPython App",
                         pos = wx.Point(200, 200), size = wx.Size(379, 207),
                         name = '', style = wx.DEFAULT_FRAME_STYLE)

        # --- real windows programs have icons, so here's ours!
        # XXX see about integrating this into our app or a resource file
        try:            # - don't sweat it if it doesn't load
            self.SetIcon(wx.Icon("test.ico", wx.BITMAP_TYPE_ICO))
        finally:
            pass

        # --- add a menu, first build the menus (with accelerators
        fileMenu = wx.Menu()

        fileMenu.Append(ID_NEW, "&New\tCtrl+N", "Creates a new file")
        wx.EVT_MENU(self, ID_NEW, self.OnFileNew)
        fileMenu.Append(ID_OPEN, "&Open\tCtrl+O", "Opens an existing file")
        wx.EVT_MENU(self, ID_OPEN, self.OnFileOpen)
        fileMenu.Append(ID_SAVE, "&Save\tCtrl+S", "Save the active file")
        wx.EVT_MENU(self, ID_SAVE, self.OnFileSave)
        fileMenu.Append(ID_SAVEAS, "Save &As...", "Save the active file with a new name")
        wx.EVT_MENU(self, ID_SAVEAS, self.OnFileSaveAs)

        fileMenu.AppendSeparator()
        fileMenu.Append(ID_EXIT, "E&xit\tAlt+Q", "Exit the program")
        wx.EVT_MENU(self, ID_EXIT, self.OnFileExit)

        helpMenu = wx.Menu()
        helpMenu.Append(ID_ABOUT, "&About", "Display information about the program")
        wx.EVT_MENU(self, ID_ABOUT, self.OnHelpAbout)

        # --- now add them to a menubar & attach it to the frame
        menuBar = wx.MenuBar()
        menuBar.Append(fileMenu, "&File")
        menuBar.Append(helpMenu, "&Help")
        self.SetMenuBar(menuBar)

        #  Not needed!, just put them in text form after tab in menu item!
        # --- add accelerators to the menus
        #self.SetAcceleratorTable(wx..AcceleratorTable([(wxACCEL_CTRL, ord('O'), ID_OPEN), 
        #                          (wxACCEL_ALT, ord('Q'), ID_EXIT)]))

        # --- add a statusBar (with date/time panel)
        sb = self.CreateStatusBar(3)
        sb.SetStatusWidths([-1, 65, 150])
        sb.PushStatusText("Ready", SB_INFO)
        # --- set up a timer to update the date/time (every 5 seconds)
        self.timer = wx.PyTimer(self.Notify)
        self.timer.Start(5000)
        self.Notify()       # - call it once right away

        # --- add a control (a RichTextBox) & trap KEY_DOWN event
        self.rtb = wx.TextCtrl(self, ID_RTB, size=wx.Size(400,200),
                              style=wx.TE_MULTILINE | wx.TE_RICH2)
        ### - NOTE: binds to the control itself!
        wx.EVT_KEY_UP(self.rtb, self.OnRtbKeyUp)

        # --- need to add a sizer for the control - yuck!
        self.sizer = wx.BoxSizer(wx.VERTICAL)
        # self.sizer.SetMinSize(200,400)
        self.sizer.Add(self.rtb, 1, wx.EXPAND)
        # --- now add it to the frame (at least this auto-sizes the control!)
        self.SetSizer(self.sizer)
        self.SetAutoLayout(True)
        self.sizer.SetSizeHints(self)

        # --- initialize other settings
        self.dirName = ""
        self.fileName = ""

        # - this is ugly, but there's no static available 
        #   once we build a class for RTB, move this there
        self.oldPos = -1
        self.ShowPos()

        # --- finally - show it!
        self.Show(True)

#---------------------------------------
    def __del__(self):
        """ Class delete event: don't leave timer hanging around! """
        self.timer.stop()
        del self.timer

#---------------------------------------
    def Notify(self):
        """ Timer event """
        t = time.localtime(time.time())
        st = time.strftime(" %b-%d-%Y  %I:%M %p", t)
        # --- could also use self.sb.SetStatusText
        self.SetStatusText(st, SB_DATETIME)

#---------------------------------------
    def OnFileExit(self, e):
        """ File|Exit event """
        self.Close(True)

#---------------------------------------
    def OnFileNew(self, e):
        """ File|New event - Clear rtb. """
        self.fileName = ""
        self.dirName = ""
        self.rtb.SetValue("")
        self.PushStatusText("Starting new file", SB_INFO)
        self.ShowPos()

#---------------------------------------
    def OnFileOpen(self, e):
        """ File|Open event - Open dialog box. """
        dlg = wx.FileDialog(self, "Open", self.dirName, self.fileName,
                           "Text Files (*.txt)|*.txt|All Files|*.*", wx.OPEN)
        if (dlg.ShowModal() == wx.ID_OK):
            self.fileName = dlg.GetFilename()
            self.dirName = dlg.GetDirectory()

            ### - this will read in Unicode files (since I'm using Unicode wxPython
            #if self.rtb.LoadFile(os.path.join(self.dirName, self.fileName)):
            #    self.SetStatusText("Opened file: " + str(self.rtb.GetLastPosition()) + 
            #                       " characters.", SB_INFO)
            #    self.ShowPos()
            #else:
            #    self.SetStatusText("Error in opening file.", SB_INFO)

            ### - but we want just plain ASCII files, so:
            try:
                f = file(os.path.join(self.dirName, self.fileName), 'r')
                self.rtb.SetValue(f.read())
                self.SetTitle(APP_NAME + " - [" + self.fileName + "]")
                self.SetStatusText("Opened file: " + str(self.rtb.GetLastPosition()) +
                                   " characters.", SB_INFO)
                self.ShowPos()
                f.close()
            except:
                self.PushStatusText("Error in opening file.", SB_INFO)
        dlg.Destroy()

#---------------------------------------
    def OnFileSave(self, e):
        """ File|Save event - Just Save it if it's got a name. """
        if (self.fileName != "") and (self.dirName != ""):
            try:
                f = file(os.path.join(self.dirName, self.fileName), 'w')
                f.write(self.rtb.GetValue())
                self.PushStatusText("Saved file: " + str(self.rtb.GetLastPosition()) +
                                    " characters.", SB_INFO)
                f.close()
                return True
            except:
                self.PushStatusText("Error in saving file.", SB_INFO)
                return False
        else:
            ### - If no name yet, then use the OnFileSaveAs to get name/directory
            return self.OnFileSaveAs(e)

#---------------------------------------
    def OnFileSaveAs(self, e):
        """ File|SaveAs event - Prompt for File Name. """
        ret = False
        dlg = wx.FileDialog(self, "Save As", self.dirName, self.fileName,
                           "Text Files (*.txt)|*.txt|All Files|*.*", wx.SAVE)
        if (dlg.ShowModal() == wx.ID_OK):
            self.fileName = dlg.GetFilename()
            self.dirName = dlg.GetDirectory()
            ### - Use the OnFileSave to save the file
            if self.OnFileSave(e):
                self.SetTitle(APP_NAME + " - [" + self.fileName + "]")
                ret = True
        dlg.Destroy()
        return ret

#---------------------------------------
    def OnHelpAbout(self, e):
        """ Help|About event """
        title = self.GetTitle()
        d = wx.MessageDialog(self, "About " + title, title, wx.ICON_INFORMATION | wx.OK)
        d.ShowModal()
        d.Destroy()

#---------------------------------------
    def OnRtbKeyUp(self, e):
        """ Update Row/Col indicator based on position """
        self.ShowPos()
        e.Skip()

#---------------------------------------
    def ShowPos(self):
        """ Update Row/Col indicator """
        (bPos,ePos) = self.rtb.GetSelection()
        if (self.oldPos != ePos):
            (c,r) = self.rtb.PositionToXY(ePos)
            self.SetStatusText(" " + str((r+1,c+1)), SB_ROWCOL)
        self.oldPos = ePos

# --- end [testFrame] class


#-------------------------------------------------------------------------------
# --- Program Entry Point
app = wx.PySimpleApp()
# --- note: Title never gets used!
frame = smallAppFrame("A Title", -1, "Small wxPython Application")
# frame.Show(True)  # - now shown in class __init__
app.MainLoop()

WxSmallApp (last edited 2009-03-12 07:49:27 by 212)

NOTE: To edit pages in this wiki you must be a member of the TrustedEditorsGroup.