blob: 7664524cd3896437f17ee2f40012d94f92c64488 [file] [log] [blame]
Kurt B. Kaiser09cb74b2003-06-12 04:20:56 +00001"""Simple text browser for IDLE
2
Steven M. Gava44d3d1a2001-07-31 06:59:02 +00003"""
Kurt B. Kaiser09cb74b2003-06-12 04:20:56 +00004
Georg Brandl14fc4272008-05-17 18:39:55 +00005from tkinter import *
Terry Jan Reedy01e35752016-06-10 18:19:21 -04006from tkinter.ttk import Scrollbar
Terry Jan Reedy82c46152016-06-22 04:54:18 -04007from tkinter.messagebox import showerror
Steven M. Gava44d3d1a2001-07-31 06:59:02 +00008
9class TextViewer(Toplevel):
Guido van Rossum8ce8a782007-11-01 19:42:39 +000010 """A simple text viewer dialog for IDLE
Kurt B. Kaiser09cb74b2003-06-12 04:20:56 +000011
Guido van Rossum8ce8a782007-11-01 19:42:39 +000012 """
Terry Jan Reedy1b392ff2014-05-24 18:48:18 -040013 def __init__(self, parent, title, text, modal=True, _htest=False):
Guido van Rossum8ce8a782007-11-01 19:42:39 +000014 """Show the given text in a scrollable window with a 'close' button
15
Terry Jan Reedy537e2c82014-06-05 03:38:34 -040016 If modal option set to False, user can interact with other windows,
17 otherwise they will be unable to interact with other windows until
18 the textview window is closed.
19
20 _htest - bool; change box location when running htest.
Steven M. Gavad721c482001-07-31 10:46:53 +000021 """
22 Toplevel.__init__(self, parent)
23 self.configure(borderwidth=5)
Terry Jan Reedy1b392ff2014-05-24 18:48:18 -040024 # place dialog below parent if running htest
Terry Jan Reedyd0cadba2015-10-11 22:07:31 -040025 self.geometry("=%dx%d+%d+%d" % (750, 500,
Terry Jan Reedy1b392ff2014-05-24 18:48:18 -040026 parent.winfo_rootx() + 10,
27 parent.winfo_rooty() + (10 if not _htest else 100)))
Steven M. Gavad721c482001-07-31 10:46:53 +000028 #elguavas - config placeholders til config stuff completed
Kurt B. Kaiser09cb74b2003-06-12 04:20:56 +000029 self.bg = '#ffffff'
30 self.fg = '#000000'
Steven M. Gava44d3d1a2001-07-31 06:59:02 +000031
Steven M. Gavad721c482001-07-31 10:46:53 +000032 self.CreateWidgets()
33 self.title(title)
Steven M. Gavad721c482001-07-31 10:46:53 +000034 self.protocol("WM_DELETE_WINDOW", self.Ok)
35 self.parent = parent
36 self.textView.focus_set()
37 #key bindings for this dialog
38 self.bind('<Return>',self.Ok) #dismiss dialog
39 self.bind('<Escape>',self.Ok) #dismiss dialog
Guido van Rossum8ce8a782007-11-01 19:42:39 +000040 self.textView.insert(0.0, text)
Steven M. Gavad721c482001-07-31 10:46:53 +000041 self.textView.config(state=DISABLED)
Terry Jan Reedye91e7632012-02-05 15:14:20 -050042
43 if modal:
44 self.transient(parent)
45 self.grab_set()
46 self.wait_window()
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +000047
Steven M. Gavad721c482001-07-31 10:46:53 +000048 def CreateWidgets(self):
Kurt B. Kaiser09cb74b2003-06-12 04:20:56 +000049 frameText = Frame(self, relief=SUNKEN, height=700)
Steven M. Gavad721c482001-07-31 10:46:53 +000050 frameButtons = Frame(self)
Kurt B. Kaiser09cb74b2003-06-12 04:20:56 +000051 self.buttonOk = Button(frameButtons, text='Close',
52 command=self.Ok, takefocus=FALSE)
53 self.scrollbarView = Scrollbar(frameText, orient=VERTICAL,
Terry Jan Reedy01e35752016-06-10 18:19:21 -040054 takefocus=FALSE)
Kurt B. Kaiser09cb74b2003-06-12 04:20:56 +000055 self.textView = Text(frameText, wrap=WORD, highlightthickness=0,
56 fg=self.fg, bg=self.bg)
Steven M. Gavad721c482001-07-31 10:46:53 +000057 self.scrollbarView.config(command=self.textView.yview)
58 self.textView.config(yscrollcommand=self.scrollbarView.set)
Kurt B. Kaiser09cb74b2003-06-12 04:20:56 +000059 self.buttonOk.pack()
Steven M. Gavad721c482001-07-31 10:46:53 +000060 self.scrollbarView.pack(side=RIGHT,fill=Y)
61 self.textView.pack(side=LEFT,expand=TRUE,fill=BOTH)
62 frameButtons.pack(side=BOTTOM,fill=X)
63 frameText.pack(side=TOP,expand=TRUE,fill=BOTH)
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +000064
Steven M. Gavad721c482001-07-31 10:46:53 +000065 def Ok(self, event=None):
66 self.destroy()
Steven M. Gava44d3d1a2001-07-31 06:59:02 +000067
Guido van Rossum8ce8a782007-11-01 19:42:39 +000068
Terry Jan Reedye91e7632012-02-05 15:14:20 -050069def view_text(parent, title, text, modal=True):
70 return TextViewer(parent, title, text, modal)
Guido van Rossum8ce8a782007-11-01 19:42:39 +000071
Terry Jan Reedye91e7632012-02-05 15:14:20 -050072def view_file(parent, title, filename, encoding=None, modal=True):
Guido van Rossum8ce8a782007-11-01 19:42:39 +000073 try:
Éric Araujoccf03a12011-08-01 17:29:36 +020074 with open(filename, 'r', encoding=encoding) as file:
75 contents = file.read()
Terry Jan Reedy82c46152016-06-22 04:54:18 -040076 except OSError:
77 showerror(title='File Load Error',
78 message='Unable to load file %r .' % filename,
79 parent=parent)
80 except UnicodeDecodeError as err:
81 showerror(title='Unicode Decode Error',
82 message=str(err),
83 parent=parent)
Guido van Rossum8ce8a782007-11-01 19:42:39 +000084 else:
Terry Jan Reedye91e7632012-02-05 15:14:20 -050085 return view_text(parent, title, contents, modal)
Guido van Rossum8ce8a782007-11-01 19:42:39 +000086
Steven M. Gava44d3d1a2001-07-31 06:59:02 +000087if __name__ == '__main__':
Terry Jan Reedy537e2c82014-06-05 03:38:34 -040088 import unittest
89 unittest.main('idlelib.idle_test.test_textview', verbosity=2, exit=False)
Terry Jan Reedy1b392ff2014-05-24 18:48:18 -040090 from idlelib.idle_test.htest import run
91 run(TextViewer)