diff CSP2/CSP2_env/env-d9b9114564458d9d-741b3de822f2aaca6c6caa4325c4afce/lib/python3.8/idlelib/textview.py @ 69:33d812a61356

planemo upload commit 2e9511a184a1ca667c7be0c6321a36dc4e3d116d
author jpayne
date Tue, 18 Mar 2025 17:55:14 -0400
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/CSP2/CSP2_env/env-d9b9114564458d9d-741b3de822f2aaca6c6caa4325c4afce/lib/python3.8/idlelib/textview.py	Tue Mar 18 17:55:14 2025 -0400
@@ -0,0 +1,194 @@
+"""Simple text browser for IDLE
+
+"""
+from tkinter import Toplevel, Text, TclError,\
+    HORIZONTAL, VERTICAL, NS, EW, NSEW, NONE, WORD, SUNKEN
+from tkinter.ttk import Frame, Scrollbar, Button
+from tkinter.messagebox import showerror
+
+from functools import update_wrapper
+from idlelib.colorizer import color_config
+
+
+class AutoHideScrollbar(Scrollbar):
+    """A scrollbar that is automatically hidden when not needed.
+
+    Only the grid geometry manager is supported.
+    """
+    def set(self, lo, hi):
+        if float(lo) > 0.0 or float(hi) < 1.0:
+            self.grid()
+        else:
+            self.grid_remove()
+        super().set(lo, hi)
+
+    def pack(self, **kwargs):
+        raise TclError(f'{self.__class__.__name__} does not support "pack"')
+
+    def place(self, **kwargs):
+        raise TclError(f'{self.__class__.__name__} does not support "place"')
+
+
+class ScrollableTextFrame(Frame):
+    """Display text with scrollbar(s)."""
+
+    def __init__(self, master, wrap=NONE, **kwargs):
+        """Create a frame for Textview.
+
+        master - master widget for this frame
+        wrap - type of text wrapping to use ('word', 'char' or 'none')
+
+        All parameters except for 'wrap' are passed to Frame.__init__().
+
+        The Text widget is accessible via the 'text' attribute.
+
+        Note: Changing the wrapping mode of the text widget after
+        instantiation is not supported.
+        """
+        super().__init__(master, **kwargs)
+
+        text = self.text = Text(self, wrap=wrap)
+        text.grid(row=0, column=0, sticky=NSEW)
+        self.grid_rowconfigure(0, weight=1)
+        self.grid_columnconfigure(0, weight=1)
+
+        # vertical scrollbar
+        self.yscroll = AutoHideScrollbar(self, orient=VERTICAL,
+                                         takefocus=False,
+                                         command=text.yview)
+        self.yscroll.grid(row=0, column=1, sticky=NS)
+        text['yscrollcommand'] = self.yscroll.set
+
+        # horizontal scrollbar - only when wrap is set to NONE
+        if wrap == NONE:
+            self.xscroll = AutoHideScrollbar(self, orient=HORIZONTAL,
+                                             takefocus=False,
+                                             command=text.xview)
+            self.xscroll.grid(row=1, column=0, sticky=EW)
+            text['xscrollcommand'] = self.xscroll.set
+        else:
+            self.xscroll = None
+
+
+class ViewFrame(Frame):
+    "Display TextFrame and Close button."
+    def __init__(self, parent, contents, wrap='word'):
+        """Create a frame for viewing text with a "Close" button.
+
+        parent - parent widget for this frame
+        contents - text to display
+        wrap - type of text wrapping to use ('word', 'char' or 'none')
+
+        The Text widget is accessible via the 'text' attribute.
+        """
+        super().__init__(parent)
+        self.parent = parent
+        self.bind('<Return>', self.ok)
+        self.bind('<Escape>', self.ok)
+        self.textframe = ScrollableTextFrame(self, relief=SUNKEN, height=700)
+
+        text = self.text = self.textframe.text
+        text.insert('1.0', contents)
+        text.configure(wrap=wrap, highlightthickness=0, state='disabled')
+        color_config(text)
+        text.focus_set()
+
+        self.button_ok = button_ok = Button(
+                self, text='Close', command=self.ok, takefocus=False)
+        self.textframe.pack(side='top', expand=True, fill='both')
+        button_ok.pack(side='bottom')
+
+    def ok(self, event=None):
+        """Dismiss text viewer dialog."""
+        self.parent.destroy()
+
+
+class ViewWindow(Toplevel):
+    "A simple text viewer dialog for IDLE."
+
+    def __init__(self, parent, title, contents, modal=True, wrap=WORD,
+                 *, _htest=False, _utest=False):
+        """Show the given text in a scrollable window with a 'close' button.
+
+        If modal is left True, users cannot interact with other windows
+        until the textview window is closed.
+
+        parent - parent of this dialog
+        title - string which is title of popup dialog
+        contents - text to display in dialog
+        wrap - type of text wrapping to use ('word', 'char' or 'none')
+        _htest - bool; change box location when running htest.
+        _utest - bool; don't wait_window when running unittest.
+        """
+        super().__init__(parent)
+        self['borderwidth'] = 5
+        # Place dialog below parent if running htest.
+        x = parent.winfo_rootx() + 10
+        y = parent.winfo_rooty() + (10 if not _htest else 100)
+        self.geometry(f'=750x500+{x}+{y}')
+
+        self.title(title)
+        self.viewframe = ViewFrame(self, contents, wrap=wrap)
+        self.protocol("WM_DELETE_WINDOW", self.ok)
+        self.button_ok = button_ok = Button(self, text='Close',
+                                            command=self.ok, takefocus=False)
+        self.viewframe.pack(side='top', expand=True, fill='both')
+
+        self.is_modal = modal
+        if self.is_modal:
+            self.transient(parent)
+            self.grab_set()
+            if not _utest:
+                self.wait_window()
+
+    def ok(self, event=None):
+        """Dismiss text viewer dialog."""
+        if self.is_modal:
+            self.grab_release()
+        self.destroy()
+
+
+def view_text(parent, title, contents, modal=True, wrap='word', _utest=False):
+    """Create text viewer for given text.
+
+    parent - parent of this dialog
+    title - string which is the title of popup dialog
+    contents - text to display in this dialog
+    wrap - type of text wrapping to use ('word', 'char' or 'none')
+    modal - controls if users can interact with other windows while this
+            dialog is displayed
+    _utest - bool; controls wait_window on unittest
+    """
+    return ViewWindow(parent, title, contents, modal, wrap=wrap, _utest=_utest)
+
+
+def view_file(parent, title, filename, encoding, modal=True, wrap='word',
+              _utest=False):
+    """Create text viewer for text in filename.
+
+    Return error message if file cannot be read.  Otherwise calls view_text
+    with contents of the file.
+    """
+    try:
+        with open(filename, 'r', encoding=encoding) as file:
+            contents = file.read()
+    except OSError:
+        showerror(title='File Load Error',
+                  message=f'Unable to load file {filename!r} .',
+                  parent=parent)
+    except UnicodeDecodeError as err:
+        showerror(title='Unicode Decode Error',
+                  message=str(err),
+                  parent=parent)
+    else:
+        return view_text(parent, title, contents, modal, wrap=wrap,
+                         _utest=_utest)
+    return None
+
+
+if __name__ == '__main__':
+    from unittest import main
+    main('idlelib.idle_test.test_textview', verbosity=2, exit=False)
+
+    from idlelib.idle_test.htest import run
+    run(ViewWindow)