from threading import Thread from Queue import Queue from Tkinter import * from code import InteractiveConsole from tkMessageBox import * #from papy import * import os class ScrolledText(Frame): def __init__(self, parent =None, text ='', file =None): Frame.__init__(self, parent) self.pack(expand=YES, fill=BOTH) # make me expandable self.make_widgets() self.settext(text, file) def make_widgets(self): sbar = Scrollbar(self) text = Text(self, relief=SUNKEN) sbar.config(command =text.yview) # xlink sbar and text text.config(yscrollcommand =sbar.set) # move one moves other sbar.pack(side=RIGHT, fill=Y) # pack first=clip last text.pack(side=LEFT, expand=YES, fill=BOTH) # text clipped first self.text = text def settext(self, text ='', file =None): if file: text = open(file, 'r').read() self.text.delete('1.0', END) # delete current text self.text.insert('1.0', text) # add at line 1, col 0 self.text.mark_set(INSERT, '1.0') # set insert cursor self.text.focus() # save user a click def gettext(self): # returns a string return self.text.get('1.0', END+'-1c') # first through last class Shell(ScrolledText): @staticmethod def iconsole(): ic = InteractiveConsole() ic.interact() @staticmethod def ibuffer(get, put): char_buff = [] while True: try: result = get() except (IOError, EOFError): put("".join(char_buff) + '\n') break if 'Return' == result.keysym: put("".join(char_buff) + '\n') char_buff = [] elif 'BackSpace' == result.keysym: try: char_buff.pop() except IndexError: pass elif len(result.char) == 1: char_buff.append(result.char) def __init__(self, parent =None): ScrolledText.__init__(self, parent =None) self.charque = Queue() self.lineque = Queue() self.bind_all('', self._key) sys.stdout = self sys.stderr = self sys.stdin = self self._start_threads() def _start_threads(self): self.ic = Thread(target =self.iconsole) self.ic.deamon = True self.ic.start() self.ib = Thread(target =self.ibuffer, args =(self.charque.get, self.lineque.put)) self.ib.deamon = True self.ib.start() def _key(self, event): label1.config(text = event.keysym) self.charque.put(event) def readline(self): return self.lineque.get() def write(self, stuff): self.text.insert("end", stuff) self.text.yview_pickplace("end") def flush(self): return None #def writelines(self, lines): #for line in lines: #self.write(line) class MenuBar(Menu): def __init__(self, *args, **kwargs): Menu.__init__(self, *args, **kwargs) self.create_widgets() def not_impl(self): showerror(message ='Not implemented') def create_widgets(self): file_menu = Menu(self) file_menu.add_command(label ='Open', command =self.not_impl) file_menu.add_command(label ='Save', command =self.not_impl) file_menu.add_command(label ='Quit', command =self.quit) self.add_cascade(label="File", underline=1, menu =file_menu) class Interactive(Text): pass class GraphCanvas(Canvas): pass class PapyMainFrame(Frame): def __init__(self, parent =None, title =None,**kwargs): Frame.__init__(self, parent) self.pack(expand =YES, fill =BOTH) self.create_widgets(title) def create_widgets(self, title =None): self.menu_bar = MenuBar(self.master) self.master.config(menu =self.menu_bar) self.master.title(title or 'papy_gui') self.shell = Shell(self) self.shell.pack() if __name__ == '__main__': root = Tk() t = Toplevel() label1 = Label(t, text='press', width=40) label1.pack() frame = PapyMainFrame(root, title ='xpp') root.mainloop()