#!/usr/bin/env python import pygtk pygtk.require('2.0') import gtk import gtkcons, gtkdb, gtkprof, edit, dialogs import os, sys, string # select a good VT emulator for vt in 'Eterm', 'nxterm', 'xterm-color', 'xterm', 'rxvt': for dirname in string.split(os.environ['PATH'], os.pathsep): fullname = os.path.join(dirname, vt) if os.path.exists(fullname): VT_CMD = fullname + ' -geometry 80x6 -e ' break else: continue break else: VT_CMD='' # this is not ideal ui_string = """ """ pythonmenu_uistring = """ """ class Application(gtk.Window): def __init__(self): gtk.Window.__init__(self, gtk.WINDOW_TOPLEVEL) self.connect("destroy", self.quit) self.connect("delete_event", self.quit) self.set_title("Python") self.set_size_request(475, 325) self.main_box = gtk.VBox() self.add(self.main_box) self.main_box.show() hdlbox = gtk.HandleBox() self.main_box.pack_start(hdlbox, expand=False) hdlbox.show() actions = [ ('FileMenu', None, '_File'), ('FileNew', gtk.STOCK_NEW, None, None, None, self.file_new), ('FileOpen', gtk.STOCK_OPEN, None, None, None, self.file_open), ('FileExit', gtk.STOCK_QUIT, None, None, None, self.file_exit), ('EditMenu', None, '_Edit'), ('EditCopy', gtk.STOCK_COPY, None, None, None, self.edit_copy), ('EditPaste', gtk.STOCK_PASTE, None, None, None, self.edit_paste), ('EditClear', gtk.STOCK_REMOVE, 'C_lear', None, None, self.edit_clear), ('HelpMenu', gtk.STOCK_HELP), ('HelpAbout', None, 'A_bout', None, None, self.help_about), ] python_actions = [ ('PythonMenu', None, '_Python'), ('PythonReload', None, '_Reload Module...', None, None, self.python_reload), ('PythonRun', None, 'R_un...', None, None, self.python_run), ('PythonDebug', None, '_Debug...', None, None, self.python_debug), ('PythonProfile', None, 'Pro_file...', None, None, self.python_prof), ] self.ag = gtk.ActionGroup('ide') self.ag.add_actions(actions) self.ag.add_actions(python_actions) self.ui = gtk.UIManager() self.ui.insert_action_group(self.ag, 0) self.ui.add_ui_from_string(ui_string) self.ui.add_ui_from_string(pythonmenu_uistring) self.add_accel_group(self.ui.get_accel_group()) hdlbox.add(self.ui.get_widget('/menubar')) #self.ui.get_widget('/menubar').show() self.interp = gtkcons.Console( namespace={'__builtins__': __builtins__, '__name__': '__main__', '__doc__': None}, quit_cb=self.quit) self.main_box.pack_start(self.interp) self.interp.show() self.interp.init() self.editwins = [] return def quit(self, *args): for win in self.editwins: if win.chk_save(): return win.hide() win.destroy() gtk.main_quit() return def reload_file(self, fname): if not os.path.isfile(fname): gtk.MessageDialog(self, gtk.DIALOG_DESTROY_WITH_PARENT, gtk.MESSAGE_ERROR, gtk.BUTTONS_OK, fname + " was not found.") return dir = os.path.dirname(fname) base = os.path.basename(fname) if dir not in sys.path: sys.path.insert(0, dir) if string.lower(base[-3:]) == '.py': base = base[:-3] elif string.lower(base[-4:]) == '.pyc': base = base[:-4] if not sys.modules.has_key(base): self.interp.run('import ' + base) else: self.interp.run('import ' + base) self.interp.run('reload(' + base + ')') return # execute a python script normally or with the debugger or profiler def run_script(self, fname): if not fname or not os.path.exists(fname): dlg = gtk.MessageDialog(self, gtk.DIALOG_DESTROY_WITH_PARENT, gtk.MESSAGE_ERROR, gtk.BUTTONS_OK, "Invalid filename "+fname) dlg.run() return args = dialogs.InputBox("Arguments", "Enter any command line arguments", self) if args == None: return os.system(VT_CMD+'python "'+fname+'" ' + args + ' &') return def debug_script(self, fname): if not fname or not os.path.exists(fname): dlg = gtk.MessageDialog(self, gtk.DIALOG_DESTROY_WITH_PARENT, gtk.MESSAGE_ERROR, gtk.BUTTONS_OK, "Invalid filename "+fname) dlg.run() return args = dialogs.InputBox("Arguments", "Enter any command line arguments", self) if args == None: return os.system(VT_CMD+'python '+gtkdb.__file__+' "'+fname+'" ' + args + ' &') return def profile_script(self, fname): if not fname or not os.path.exists(fname): dlg = gtk.MessageDialog(self, gtk.DIALOG_DESTROY_WITH_PARENT, gtk.MESSAGE_ERROR, gtk.BUTTONS_OK, "Invalid filename "+fname) dlg.run() return args = dialogs.InputBox("Arguments", "Enter any command line arguments", self) if args == None: return os.system(VT_CMD+'python '+gtkprof.__file__+' "'+fname+'" ' + args + ' &') return def add_py_menu(self, ew): python_actions = [ ('PythonMenu', None, '_Python'), ('PythonReload', None, '_Reload Module'), ('PythonRun', None, 'R_un...', None, None, lambda w, ew=ew: self.run_script(ew.fname)), ('PythonDebug', None, '_Debug...', None, None, lambda w, ew=ew: self.debug_script(ew.fname)), ('PythonProfile', None, 'Pro_file...', None, None, lambda w, ew=ew: self.profile_script(ew.fname)), ] ew.ag.add_actions(python_actions) ew.ui.add_ui_from_string(pythonmenu_uistring) return def file_new(self, mi=None): ew = edit.EditWindow(quit_cb=self.rem_editwin) self.editwins.append(ew) self.add_py_menu(ew) ew.show() ew.set_size_request(0,0) return def file_open(self, mi=None): fname = dialogs.OpenFile('Open', self) if fname: ew = edit.EditWindow(quit_cb=self.rem_editwin) ew.load_file(fname) self.editwins.append(ew) self.add_py_menu(ew) ew.show() ew.set_size_request(0,0) return def rem_editwin(self, win=None, event=None): for i in range(len(self.editwins)): if self.editwins[i] == win: del self.editwins[i] break return def file_exit(self, mi=None): self.quit() return def edit_copy(self, mi=None): self.interp.text.copy_clipboard(0) return def edit_paste(self, mi=None): self.interp.line.paste_clipboard(0) return def edit_clear(self, mi=None): self.interp.line.delete_selection() return def python_reload(self, mi=None): print "python_reload" return def python_run(self, mi=None): fname = dialogs.OpenFile("Run", self) if fname: self.run_script(fname) return def python_debug(self, mi=None): fname = dialogs.OpenFile("Debug", self) if fname: self.debug_script(fname) return def python_prof(self, mi=None): fname = dialogs.OpenFile("Profile", self) if fname: self.profile_script(fname) return def help_about(self, mi=None): dlg = gtk.MessageDialog(self, gtk.DIALOG_DESTROY_WITH_PARENT, gtk.MESSAGE_INFO, gtk.BUTTONS_OK, "Copyright (C)\n" \ "1998 James Henstridge\n" \ "2004 John Finlay\n" \ "This program is covered by the GPL>=2") dlg.run() dlg.hide() return if __name__ == '__main__': app = Application() app.show() app.set_size_request(0,0) gtk.main()