Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
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
45 changes: 38 additions & 7 deletions Lib/idlelib/help_about.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,14 @@
"""
import os
import sys
import webbrowser
from functools import partial
from platform import python_version, architecture

from tkinter import font
from tkinter import Toplevel, Frame, Label, Button, PhotoImage
from tkinter import SUNKEN, TOP, BOTTOM, LEFT, X, BOTH, W, EW, NSEW, E
from tkinter.messagebox import showerror

from idlelib import textview

Expand Down Expand Up @@ -85,13 +89,14 @@ def create_widgets(self):
byline = Label(frame_background, text=byline_text, justify=LEFT,
fg=self.fg, bg=self.bg)
byline.grid(row=2, column=0, sticky=W, columnspan=3, padx=10, pady=5)
email = Label(frame_background, text='email: idle-dev@python.org',
justify=LEFT, fg=self.fg, bg=self.bg)
email.grid(row=6, column=0, columnspan=2, sticky=W, padx=10, pady=0)
docs = Label(frame_background, text='https://docs.python.org/' +
python_version()[:3] + '/library/idle.html',
justify=LEFT, fg=self.fg, bg=self.bg)
docs.grid(row=7, column=0, columnspan=2, sticky=W, padx=10, pady=0)

emaillink = 'https://mail.python.org/mailman/listinfo/idle-dev'
self.email = self.create_link(parent=frame_background,
text='Email List',
callback=partial(self.display_browser_link,
emaillink))
self.email.grid(row=6, column=0, columnspan=2, sticky=W,
padx=10, pady=0)

Frame(frame_background, borderwidth=1, relief=SUNKEN,
height=2, bg=self.bg).grid(row=8, column=0, sticky=EW,
Expand Down Expand Up @@ -142,6 +147,23 @@ def create_widgets(self):
command=self.show_idle_credits)
self.idle_credits.pack(side=LEFT, padx=10, pady=10)

def create_link(self, parent=None, text=None, callback=None):
"""Create a Label widget that behaves like a hyperlink.

Args:
parent: Parent widget for the Label.
text: Text for the Label.
callback: Callback to execute when Label is clicked.
"""
widget = Label(parent, text=text, foreground='blue', bg=self.bg,
cursor='hand2')
underline_font = font.Font(widget, widget['font'])
underline_font['underline'] = True
underline_font['size'] = 10
widget['font'] = underline_font
widget.bind('<Button-1>', callback)
return widget

# License, copyright, and credits are of type _sitebuiltins._Printer
def show_py_license(self):
"Handle License button event."
Expand Down Expand Up @@ -193,6 +215,15 @@ def display_file_text(self, title, filename, encoding=None):
self._current_textview = textview.view_file(
self, title, fn, encoding, _utest=self._utest)

def display_browser_link(self, link=None, event=None):
"Handle event of clicking a hyperlink."
if not link:
return
if not webbrowser.open(link):
showerror(title='Page Load Error',
message=f'Unable open browser.',
parent=self)

def ok(self, event=None):
"Dismiss help_about dialog."
self.grab_release()
Expand Down
44 changes: 42 additions & 2 deletions Lib/idlelib/idle_test/test_help_about.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,10 @@
"""

from idlelib import help_about
import unittest
from test.support import requires, findfile
from tkinter import Tk, TclError
import unittest
from unittest import mock
from tkinter import Tk, TclError, font
from idlelib.idle_test.mock_idle import Func
from idlelib.idle_test.mock_tk import Mbox_func
from idlelib import textview
Expand Down Expand Up @@ -38,6 +39,33 @@ def tearDownClass(cls):
def test_build_bits(self):
self.assertIn(help_about.build_bits(), ('32', '64'))

def test_display_browser_link(self):
"""Test display browser link."""
dialog = self.dialog
ha = help_about
orig_webbrowser = ha.webbrowser.open
orig_showerror = ha.showerror
web = ha.webbrowser.open = mock.Mock()
error = ha.showerror = Mbox_func()

# No link.
dialog.display_browser_link()
web.assert_not_called()

# Valid link.
link = 'https://www.python.org'
ha.webbrowser.open.return_value(True)
dialog.display_browser_link(link=link)
web.assert_called_with(link)

# False returned from webbrowser.open.
ha.webbrowser.open.return_value = False
dialog.display_browser_link(link=link)
self.assertEqual(error.title, 'Page Load Error')

ha.webbrowser.open = orig_webbrowser
ha.showerror = orig_showerror

def test_dialog_title(self):
"""Test about dialog title"""
self.assertEqual(self.dialog.title(), 'About IDLE')
Expand All @@ -48,6 +76,18 @@ def test_dialog_logo(self):
fn, ext = os.path.splitext(file)
self.assertEqual(fn, 'idle_48')

def test_create_link(self):
"""Test appearance of label acting as links."""
dialog = self.dialog
link_widgets = (dialog.email, )
for widget in link_widgets:
widget_font = font.Font(widget, font=widget['font'])
self.assertTrue(widget_font.actual()['underline'])
self.assertEqual(widget_font.actual()['size'], 10)
self.assertEqual(widget['foreground'], 'blue')
self.assertEqual(widget['cursor'], 'hand2')
self.assertIn('<Button-1>', widget.bind())

def test_printer_buttons(self):
"""Test buttons whose commands use printer function."""
dialog = self.dialog
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Change labels to hyperlinks in help_about.