Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

bpo-30495: IDLE: Modernize textview.py with docstrings and PEP8 names #1839

Merged
merged 4 commits into from
May 28, 2017
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
20 changes: 10 additions & 10 deletions Lib/idlelib/idle_test/test_textview.py
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@ class TV(tv.TextViewer): # Used in TextViewTest.

# Call wrapper class with mock wait_window.
class TextViewTest(unittest.TestCase):

def setUp(self):
TV.transient.__init__()
TV.grab_set.__init__()
Expand All @@ -52,19 +52,19 @@ def test_init_modal(self):
self.assertTrue(TV.transient.called)
self.assertTrue(TV.grab_set.called)
self.assertTrue(TV.wait_window.called)
view.Ok()
view.ok()

def test_init_nonmodal(self):
view = TV(root, 'Title', 'test text', modal=False)
self.assertFalse(TV.transient.called)
self.assertFalse(TV.grab_set.called)
self.assertFalse(TV.wait_window.called)
view.Ok()
view.ok()

def test_ok(self):
view = TV(root, 'Title', 'test text', modal=False)
view.destroy = Func()
view.Ok()
view.ok()
self.assertTrue(view.destroy.called)
del view.destroy # Unmask real function.
view.destroy()
Expand All @@ -86,13 +86,13 @@ def tearDownClass(cls):
def test_view_text(self):
view = tv.view_text(root, 'Title', 'test text', modal=False)
self.assertIsInstance(view, tv.TextViewer)
view.Ok()
view.ok()

def test_view_file(self):
view = tv.view_file(root, 'Title', __file__, modal=False)
self.assertIsInstance(view, tv.TextViewer)
self.assertIn('Test', view.textView.get('1.0', '1.end'))
view.Ok()
self.assertIn('Test', view.textview.get('1.0', '1.end'))
view.ok()

def test_bad_file(self):
# Mock showerror will be used; view_file will return None.
Expand Down Expand Up @@ -131,7 +131,7 @@ def _command():

self.assertEqual(self.called, True)
self.assertEqual(self.view.title(), 'TITLE_TEXT')
self.assertEqual(self.view.textView.get('1.0', '1.end'), 'COMMAND')
self.assertEqual(self.view.textview.get('1.0', '1.end'), 'COMMAND')

def test_view_file_bind_with_button(self):
def _command():
Expand All @@ -144,10 +144,10 @@ def _command():
self.assertEqual(self.called, True)
self.assertEqual(self.view.title(), 'TITLE_FILE')
with open(__file__) as f:
self.assertEqual(self.view.textView.get('1.0', '1.end'),
self.assertEqual(self.view.textview.get('1.0', '1.end'),
f.readline().strip())
f.readline()
self.assertEqual(self.view.textView.get('3.0', '3.end'),
self.assertEqual(self.view.textview.get('3.0', '3.end'),
f.readline().strip())


Expand Down
72 changes: 45 additions & 27 deletions Lib/idlelib/textview.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
"""Simple text browser for IDLE

"""
from tkinter import *
from tkinter import Toplevel, Frame, Button, Text
from tkinter import DISABLED, SUNKEN, VERTICAL, WORD
from tkinter import RIGHT, LEFT, TOP, BOTTOM, BOTH, X, Y
from tkinter.ttk import Scrollbar
from tkinter.messagebox import showerror

Expand All @@ -16,6 +18,9 @@ def __init__(self, parent, title, text, modal=True,
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
text - text to display in dialog
_htest - bool; change box location when running htest.
_utest - bool; don't wait_window when running unittest.
"""
Expand All @@ -29,51 +34,64 @@ def __init__(self, parent, title, text, modal=True,
self.bg = '#ffffff'
self.fg = '#000000'

self.CreateWidgets()
self.create_widgets()
self.title(title)
self.protocol("WM_DELETE_WINDOW", self.Ok)
self.protocol("WM_DELETE_WINDOW", self.ok)
self.parent = parent
self.textView.focus_set()
self.textview.focus_set()
# Bind keys for closing this dialog.
self.bind('<Return>',self.Ok)
self.bind('<Escape>',self.Ok)
self.textView.insert(0.0, text)
self.textView.config(state=DISABLED)
self.bind('<Return>', self.ok)
self.bind('<Escape>', self.ok)
self.textview.insert(0.0, text)
self.textview.config(state=DISABLED)

if modal:
self.transient(parent)
self.grab_set()
if not _utest:
self.wait_window()

def CreateWidgets(self):
def create_widgets(self):
"Create Frame with Text (with vertical Scrollbar) and Button."
frameText = Frame(self, relief=SUNKEN, height=700)
frameButtons = Frame(self)
self.buttonOk = Button(frameButtons, text='Close',
command=self.Ok, takefocus=FALSE)
self.scrollbarView = Scrollbar(frameText, orient=VERTICAL,
takefocus=FALSE)
self.textView = Text(frameText, wrap=WORD, highlightthickness=0,
frame = Frame(self, relief=SUNKEN, height=700)
frame_buttons = Frame(self)
self.button_ok = Button(frame_buttons, text='Close',
command=self.ok, takefocus=False)
self.scrollbar = Scrollbar(frame, orient=VERTICAL, takefocus=False)
self.textview = Text(frame, wrap=WORD, highlightthickness=0,
fg=self.fg, bg=self.bg)
self.scrollbarView.config(command=self.textView.yview)
self.textView.config(yscrollcommand=self.scrollbarView.set)
self.buttonOk.pack()
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)

def Ok(self, event=None):
self.scrollbar.config(command=self.textview.yview)
self.textview.config(yscrollcommand=self.scrollbar.set)
self.button_ok.pack()
self.scrollbar.pack(side=RIGHT, fill=Y)
self.textview.pack(side=LEFT, expand=True, fill=BOTH)
frame_buttons.pack(side=BOTTOM, fill=X)
frame.pack(side=TOP, expand=True, fill=BOTH)

def ok(self, event=None):
"""Dismiss text viewer dialog."""
self.destroy()


def view_text(parent, title, text, modal=True, _utest=False):
"Display text in a TextViewer."
"""Create TextViewer for given text.

parent - parent of this dialog
title - string which is the title of popup dialog
text - text to display in this dialog
modal - controls if users can interact with other windows while this
dialog is displayed
_utest - bool; controls wait_window on unittest
"""
return TextViewer(parent, title, text, modal, _utest=_utest)


def view_file(parent, title, filename, encoding=None, modal=True, _utest=False):
"Display file in a TextViever or show error message."
"""Create TextViewer 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()
Expand Down