summaryrefslogtreecommitdiffstats
path: root/Lib/idlelib/configdialog.py
diff options
context:
space:
mode:
authorTal Einat <taleinat@gmail.com>2019-07-23 10:02:11 (GMT)
committerGitHub <noreply@github.com>2019-07-23 10:02:11 (GMT)
commit1ebee37dde5c2aabc8e2d2c7bbe2a69b293133bb (patch)
tree53fa341d7075aab6b62de2e7cf053a7ca484c73e /Lib/idlelib/configdialog.py
parent4e16a4a3112161a5c6981c0588142d4a4673a934 (diff)
downloadcpython-1ebee37dde5c2aabc8e2d2c7bbe2a69b293133bb.zip
cpython-1ebee37dde5c2aabc8e2d2c7bbe2a69b293133bb.tar.gz
cpython-1ebee37dde5c2aabc8e2d2c7bbe2a69b293133bb.tar.bz2
bpo-33610: validate non-negative integer inputs in IDLE's config (GH-14822)
Diffstat (limited to 'Lib/idlelib/configdialog.py')
-rw-r--r--Lib/idlelib/configdialog.py38
1 files changed, 31 insertions, 7 deletions
diff --git a/Lib/idlelib/configdialog.py b/Lib/idlelib/configdialog.py
index 6ddbc7f..6b0ecc9 100644
--- a/Lib/idlelib/configdialog.py
+++ b/Lib/idlelib/configdialog.py
@@ -9,6 +9,8 @@ Note that tab width in IDLE is currently fixed at eight due to Tk issues.
Refer to comments in EditorWindow autoindent code for details.
"""
+import re
+
from tkinter import (Toplevel, Listbox, Text, Scale, Canvas,
StringVar, BooleanVar, IntVar, TRUE, FALSE,
TOP, BOTTOM, RIGHT, LEFT, SOLID, GROOVE,
@@ -1764,9 +1766,18 @@ class GenPage(Frame):
def __init__(self, master):
super().__init__(master)
+
+ self.init_validators()
self.create_page_general()
self.load_general_cfg()
+ def init_validators(self):
+ digits_or_empty_re = re.compile(r'[0-9]*')
+ def is_digits_or_empty(s):
+ "Return 's is blank or contains only digits'"
+ return digits_or_empty_re.fullmatch(s) is not None
+ self.digits_only = (self.register(is_digits_or_empty), '%P',)
+
def create_page_general(self):
"""Return frame of widgets for General tab.
@@ -1883,16 +1894,23 @@ class GenPage(Frame):
frame_win_size, text='Initial Window Size (in characters)')
win_width_title = Label(frame_win_size, text='Width')
self.win_width_int = Entry(
- frame_win_size, textvariable=self.win_width, width=3)
+ frame_win_size, textvariable=self.win_width, width=3,
+ validatecommand=self.digits_only, validate='key',
+ )
win_height_title = Label(frame_win_size, text='Height')
self.win_height_int = Entry(
- frame_win_size, textvariable=self.win_height, width=3)
+ frame_win_size, textvariable=self.win_height, width=3,
+ validatecommand=self.digits_only, validate='key',
+ )
frame_autocomplete = Frame(frame_window, borderwidth=0,)
auto_wait_title = Label(frame_autocomplete,
text='Completions Popup Wait (milliseconds)')
self.auto_wait_int = Entry(frame_autocomplete, width=6,
- textvariable=self.autocomplete_wait)
+ textvariable=self.autocomplete_wait,
+ validatecommand=self.digits_only,
+ validate='key',
+ )
frame_paren1 = Frame(frame_window, borderwidth=0)
paren_style_title = Label(frame_paren1, text='Paren Match Style')
@@ -1922,20 +1940,26 @@ class GenPage(Frame):
format_width_title = Label(frame_format,
text='Format Paragraph Max Width')
self.format_width_int = Entry(
- frame_format, textvariable=self.format_width, width=4)
+ frame_format, textvariable=self.format_width, width=4,
+ validatecommand=self.digits_only, validate='key',
+ )
frame_context = Frame(frame_editor, borderwidth=0)
context_title = Label(frame_context, text='Max Context Lines :')
self.context_int = Entry(
- frame_context, textvariable=self.context_lines, width=3)
+ frame_context, textvariable=self.context_lines, width=3,
+ validatecommand=self.digits_only, validate='key',
+ )
# Frame_shell.
frame_auto_squeeze_min_lines = Frame(frame_shell, borderwidth=0)
auto_squeeze_min_lines_title = Label(frame_auto_squeeze_min_lines,
text='Auto-Squeeze Min. Lines:')
self.auto_squeeze_min_lines_int = Entry(
- frame_auto_squeeze_min_lines, width=4,
- textvariable=self.auto_squeeze_min_lines)
+ frame_auto_squeeze_min_lines, width=4,
+ textvariable=self.auto_squeeze_min_lines,
+ validatecommand=self.digits_only, validate='key',
+ )
# frame_help.
frame_helplist = Frame(frame_help)