Commit 1ebee37d authored by Tal Einat's avatar Tal Einat Committed by GitHub

bpo-33610: validate non-negative integer inputs in IDLE's config (GH-14822)

parent 4e16a4a3
...@@ -9,6 +9,8 @@ Note that tab width in IDLE is currently fixed at eight due to Tk issues. ...@@ -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. Refer to comments in EditorWindow autoindent code for details.
""" """
import re
from tkinter import (Toplevel, Listbox, Text, Scale, Canvas, from tkinter import (Toplevel, Listbox, Text, Scale, Canvas,
StringVar, BooleanVar, IntVar, TRUE, FALSE, StringVar, BooleanVar, IntVar, TRUE, FALSE,
TOP, BOTTOM, RIGHT, LEFT, SOLID, GROOVE, TOP, BOTTOM, RIGHT, LEFT, SOLID, GROOVE,
...@@ -1764,9 +1766,18 @@ class GenPage(Frame): ...@@ -1764,9 +1766,18 @@ class GenPage(Frame):
def __init__(self, master): def __init__(self, master):
super().__init__(master) super().__init__(master)
self.init_validators()
self.create_page_general() self.create_page_general()
self.load_general_cfg() 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): def create_page_general(self):
"""Return frame of widgets for General tab. """Return frame of widgets for General tab.
...@@ -1883,16 +1894,23 @@ class GenPage(Frame): ...@@ -1883,16 +1894,23 @@ class GenPage(Frame):
frame_win_size, text='Initial Window Size (in characters)') frame_win_size, text='Initial Window Size (in characters)')
win_width_title = Label(frame_win_size, text='Width') win_width_title = Label(frame_win_size, text='Width')
self.win_width_int = Entry( 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') win_height_title = Label(frame_win_size, text='Height')
self.win_height_int = Entry( 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,) frame_autocomplete = Frame(frame_window, borderwidth=0,)
auto_wait_title = Label(frame_autocomplete, auto_wait_title = Label(frame_autocomplete,
text='Completions Popup Wait (milliseconds)') text='Completions Popup Wait (milliseconds)')
self.auto_wait_int = Entry(frame_autocomplete, width=6, 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) frame_paren1 = Frame(frame_window, borderwidth=0)
paren_style_title = Label(frame_paren1, text='Paren Match Style') paren_style_title = Label(frame_paren1, text='Paren Match Style')
...@@ -1922,12 +1940,16 @@ class GenPage(Frame): ...@@ -1922,12 +1940,16 @@ class GenPage(Frame):
format_width_title = Label(frame_format, format_width_title = Label(frame_format,
text='Format Paragraph Max Width') text='Format Paragraph Max Width')
self.format_width_int = Entry( 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) frame_context = Frame(frame_editor, borderwidth=0)
context_title = Label(frame_context, text='Max Context Lines :') context_title = Label(frame_context, text='Max Context Lines :')
self.context_int = Entry( 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_shell.
frame_auto_squeeze_min_lines = Frame(frame_shell, borderwidth=0) frame_auto_squeeze_min_lines = Frame(frame_shell, borderwidth=0)
...@@ -1935,7 +1957,9 @@ class GenPage(Frame): ...@@ -1935,7 +1957,9 @@ class GenPage(Frame):
text='Auto-Squeeze Min. Lines:') text='Auto-Squeeze Min. Lines:')
self.auto_squeeze_min_lines_int = Entry( self.auto_squeeze_min_lines_int = Entry(
frame_auto_squeeze_min_lines, width=4, frame_auto_squeeze_min_lines, width=4,
textvariable=self.auto_squeeze_min_lines) textvariable=self.auto_squeeze_min_lines,
validatecommand=self.digits_only, validate='key',
)
# frame_help. # frame_help.
frame_helplist = Frame(frame_help) frame_helplist = Frame(frame_help)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment