textview.py 3.21 KB
Newer Older
Kurt B. Kaiser's avatar
Kurt B. Kaiser committed
1 2
"""Simple text browser for IDLE

3
"""
4
from tkinter import *
5
from tkinter.ttk import Scrollbar
6
from tkinter.messagebox import showerror
7

8

9
class TextViewer(Toplevel):
10
    "A simple text viewer dialog for IDLE."
11

12
    def __init__(self, parent, title, text, modal=True, _htest=False):
13
        """Show the given text in a scrollable window with a 'close' button
Kurt B. Kaiser's avatar
Kurt B. Kaiser committed
14

15 16 17 18 19
        If modal option set to False, user can interact with other windows,
        otherwise they will be unable to interact with other windows until
        the textview window is closed.

        _htest - bool; change box location when running htest.
20 21 22
        """
        Toplevel.__init__(self, parent)
        self.configure(borderwidth=5)
23
        # Place dialog below parent if running htest.
24
        self.geometry("=%dx%d+%d+%d" % (750, 500,
25 26
                           parent.winfo_rootx() + 10,
                           parent.winfo_rooty() + (10 if not _htest else 100)))
27
        # TODO: get fg/bg from theme.
Kurt B. Kaiser's avatar
Kurt B. Kaiser committed
28 29
        self.bg = '#ffffff'
        self.fg = '#000000'
30

31 32 33 34 35
        self.CreateWidgets()
        self.title(title)
        self.protocol("WM_DELETE_WINDOW", self.Ok)
        self.parent = parent
        self.textView.focus_set()
36 37 38
        # Bind keys for closing this dialog.
        self.bind('<Return>',self.Ok)
        self.bind('<Escape>',self.Ok)
39
        self.textView.insert(0.0, text)
40
        self.textView.config(state=DISABLED)
41 42 43 44 45

        if modal:
            self.transient(parent)
            self.grab_set()
            self.wait_window()
46

47
    def CreateWidgets(self):
Kurt B. Kaiser's avatar
Kurt B. Kaiser committed
48
        frameText = Frame(self, relief=SUNKEN, height=700)
49
        frameButtons = Frame(self)
Kurt B. Kaiser's avatar
Kurt B. Kaiser committed
50 51 52
        self.buttonOk = Button(frameButtons, text='Close',
                               command=self.Ok, takefocus=FALSE)
        self.scrollbarView = Scrollbar(frameText, orient=VERTICAL,
53
                                       takefocus=FALSE)
Kurt B. Kaiser's avatar
Kurt B. Kaiser committed
54 55
        self.textView = Text(frameText, wrap=WORD, highlightthickness=0,
                             fg=self.fg, bg=self.bg)
56 57
        self.scrollbarView.config(command=self.textView.yview)
        self.textView.config(yscrollcommand=self.scrollbarView.set)
Kurt B. Kaiser's avatar
Kurt B. Kaiser committed
58
        self.buttonOk.pack()
59 60 61 62
        self.scrollbarView.pack(side=RIGHT,fill=Y)
        self.textView.pack(side=LEFT,expand=TRUE,fill=BOTH)
        frameButtons.pack(side=BOTTOM,fill=X)
        frameText.pack(side=TOP,expand=TRUE,fill=BOTH)
63

64 65
    def Ok(self, event=None):
        self.destroy()
66

67

68 69
def view_text(parent, title, text, modal=True):
    return TextViewer(parent, title, text, modal)
70

71
def view_file(parent, title, filename, encoding=None, modal=True):
72
    try:
73 74
        with open(filename, 'r', encoding=encoding) as file:
            contents = file.read()
75 76 77 78 79 80 81 82
    except OSError:
        showerror(title='File Load Error',
                  message='Unable to load file %r .' % filename,
                  parent=parent)
    except UnicodeDecodeError as err:
        showerror(title='Unicode Decode Error',
                  message=str(err),
                  parent=parent)
83
    else:
84
        return view_text(parent, title, contents, modal)
85

86
if __name__ == '__main__':
87 88
    import unittest
    unittest.main('idlelib.idle_test.test_textview', verbosity=2, exit=False)
89 90
    from idlelib.idle_test.htest import run
    run(TextViewer)