Home | History | Annotate | Download | only in idlelib
      1 """Simple text browser for IDLE
      2 
      3 """
      4 
      5 from Tkinter import *
      6 import tkMessageBox
      7 
      8 class TextViewer(Toplevel):
      9     """A simple text viewer dialog for IDLE
     10 
     11     """
     12     def __init__(self, parent, title, text, modal=True):
     13         """Show the given text in a scrollable window with a 'close' button
     14 
     15         """
     16         Toplevel.__init__(self, parent)
     17         self.configure(borderwidth=5)
     18         self.geometry("=%dx%d+%d+%d" % (625, 500,
     19                                         parent.winfo_rootx() + 10,
     20                                         parent.winfo_rooty() + 10))
     21         #elguavas - config placeholders til config stuff completed
     22         self.bg = '#ffffff'
     23         self.fg = '#000000'
     24 
     25         self.CreateWidgets()
     26         self.title(title)
     27         self.protocol("WM_DELETE_WINDOW", self.Ok)
     28         self.parent = parent
     29         self.textView.focus_set()
     30         #key bindings for this dialog
     31         self.bind('<Return>',self.Ok) #dismiss dialog
     32         self.bind('<Escape>',self.Ok) #dismiss dialog
     33         self.textView.insert(0.0, text)
     34         self.textView.config(state=DISABLED)
     35 
     36         if modal:
     37             self.transient(parent)
     38             self.grab_set()
     39             self.wait_window()
     40 
     41     def CreateWidgets(self):
     42         frameText = Frame(self, relief=SUNKEN, height=700)
     43         frameButtons = Frame(self)
     44         self.buttonOk = Button(frameButtons, text='Close',
     45                                command=self.Ok, takefocus=FALSE)
     46         self.scrollbarView = Scrollbar(frameText, orient=VERTICAL,
     47                                        takefocus=FALSE, highlightthickness=0)
     48         self.textView = Text(frameText, wrap=WORD, highlightthickness=0,
     49                              fg=self.fg, bg=self.bg)
     50         self.scrollbarView.config(command=self.textView.yview)
     51         self.textView.config(yscrollcommand=self.scrollbarView.set)
     52         self.buttonOk.pack()
     53         self.scrollbarView.pack(side=RIGHT,fill=Y)
     54         self.textView.pack(side=LEFT,expand=TRUE,fill=BOTH)
     55         frameButtons.pack(side=BOTTOM,fill=X)
     56         frameText.pack(side=TOP,expand=TRUE,fill=BOTH)
     57 
     58     def Ok(self, event=None):
     59         self.destroy()
     60 
     61 
     62 def view_text(parent, title, text, modal=True):
     63     return TextViewer(parent, title, text, modal)
     64 
     65 def view_file(parent, title, filename, encoding=None, modal=True):
     66     try:
     67         if encoding:
     68             import codecs
     69             textFile = codecs.open(filename, 'r')
     70         else:
     71             textFile = open(filename, 'r')
     72     except IOError:
     73         import tkMessageBox
     74         tkMessageBox.showerror(title='File Load Error',
     75                                message='Unable to load file %r .' % filename,
     76                                parent=parent)
     77     else:
     78         return view_text(parent, title, textFile.read(), modal)
     79 
     80 
     81 if __name__ == '__main__':
     82     #test the dialog
     83     root=Tk()
     84     root.title('textView test')
     85     filename = './textView.py'
     86     text = file(filename, 'r').read()
     87     btn1 = Button(root, text='view_text',
     88                   command=lambda:view_text(root, 'view_text', text))
     89     btn1.pack(side=LEFT)
     90     btn2 = Button(root, text='view_file',
     91                   command=lambda:view_file(root, 'view_file', filename))
     92     btn2.pack(side=LEFT)
     93     btn3 = Button(root, text='nonmodal view_text',
     94                   command=lambda:view_text(root, 'nonmodal view_text', text,
     95                                            modal=False))
     96     btn3.pack(side=LEFT)
     97     close = Button(root, text='Close', command=root.destroy)
     98     close.pack(side=RIGHT)
     99     root.mainloop()
    100