Proposal: OK, so the python language has officially moved into the next level. I look at IDLE and think, hmm great IDE but it could really use a spit shining. So here is a very simple script showing my ideas to improve IDLE. Reason for change: The text widget and the prompt(>>>) should be separated. Trying to write a conditional in the interactive IDLE is a real pain. Not to mention that when you copy code from Interactive IDLE to the IDLE editor window the indention is eight spaces instead four and you've got that prompt(>>>) stuck in there. I have a solution for the problem though.
I hope you are using fixed-width font Lst|<----- Text Widget ---->| | | >>>|if this: | ...| if that: | ...| ... | ...| elif that: | ...| ... | ...| else: | ...| ... | >>>| | >>>|x = 10 | >>>| | Basically you have a Listbox on the left for the prompt and a Text on the right. Disable the Listbox highlight and key press events and now we have a very friendly interactive IDLE! No more prompt hijacking your snippets, and no more eigtht space indention! Hip-Hip-Hooray! from Tkinter import * class CMD(Toplevel): def __init__(self, master, glo, loc): Toplevel.__init__(self, master) self.glo = glo self.loc = loc self.master = master self.startidx = '1.0' self.transient(master) self.lift(master) self.title('IDLE 3000') self.listbox = Listbox(self, width=3, relief=FLAT, font=('Courier New',12), takefocus=0) self.listbox.pack(fill=Y, side=LEFT) self.listbox.insert(0, '>>>') self.text = Text(self, relief=FLAT, spacing3=1, wrap=NONE, font=('Courier New',12)) self.text.pack(fill=BOTH, side=LEFT, expand=1) self.text.config(width=50, height=10) self.text.focus_set() self.listbox.bind("<KeyPress>" , lambda e: "break") self.listbox.bind("<Button-1>" , lambda e: "break") self.listbox.bind("<B1-Motion>" , lambda e: "break") self.listbox.bind("<ButtonRelease-1>" , lambda e: "break") self.listbox.bind("<B2-Motion>" , lambda e: "break") self.text.bind('<Next>' , lambda e: "break")#pageup self.text.bind('<Prior>' , lambda e: "break")#pagedown self.text.bind('<Delete>' , lambda e: "break") self.text.bind('<Control-Home>' , lambda e: "break") self.text.bind('<Control-End>' , lambda e: "break") self.text.bind("<B2-Motion>" , lambda e: "break") self.text.bind('<Button-2>' , lambda e: "break") self.text.bind("<MouseWheel>" , lambda e: "break") self.text.bind("<Up>" , self.onUp) self.text.bind("<Down>" , self.onDown) self.text.bind("<Tab>" , self.onTab) self.text.bind("<Return>" , self.onReturn) self.text.bind("<BackSpace>", self.onBackSpace) def on_quit(self): self.grab_release() if self.master: self.master.focus_set() self.destroy() def onTab(self, event=None): curline, cursor = self.text.index(INSERT).split('.')[0]+'.0', self.text.index(INSERT) self.text.insert(INSERT, ' ') return "break" def onDown(self, event): i = self.text.index(INSERT+'+1l') #;print 'New index: ', i self.text.mark_set(INSERT, i) self.text.see(i) self.listbox.see(int(i.split('.')[0])-1) return "break" def onUp(self, event): i = self.text.index(INSERT+'-1l') #;print 'New index: ', i self.text.mark_set(INSERT, i) self.text.see(i) self.listbox.see(int(i.split('.')[0])-1) return "break" def fix_index(self, chars): self.text.insert(END, '\n') self.text.mark_set(INSERT, END) self.text.see(INSERT) self.listbox.insert(END, chars) self.listbox.see(self.listbox.size()) def onBackSpace(self, event=None): if self.text.compare(self.text.index(INSERT), '!=', self.startidx): self.text.delete(self.text.index(INSERT+'-1c')) return "break" def onReturn(self, event=None): curline, cursor = self.text.index(INSERT).split('.')[0]+'.0', self.text.index(INSERT) text = self.text.get(self.startidx, END).strip() if self.text.compare(curline, '<', self.startidx):#'Out Of Zone' self.text.mark_set(INSERT, END+'-1c') self.text.see(INSERT) self.listbox.see(END) elif '.0' in cursor: #nothing typed on this line, try to exec command cmd = text.rstrip('\n') try: exec(cmd, self.glo, self.loc) except: self.master.bell() print '%s\n%s\n%s' %(sys.exc_traceback, sys.exc_type, sys.exc_value) finally: self.fix_index('>>>') self.startidx = self.text.index(INSERT) elif text != '':#something typed self.fix_index('...') else: #insert newline self.fix_index('>>>') return "break" if __name__ == '__main__': print 'main' root = Tk() cmd = CMD(root, globals(), locals()) root.mainloop() Issue #2: When you press MMB and there is a highlighted selection in the text it gets pasted over and over again @ the insertion cursor. This can be aggravating, and turn a clean script into a bowl of "Cheerios" breakfast cereal in no time.
_______________________________________________ IDLE-dev mailing list IDLE-dev@python.org http://mail.python.org/mailman/listinfo/idle-dev