Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit b60adc5

Browse files
committed
Issue #24137: Run IDLE, test_idle, and htest with tkinter default root disabled.
Fix code and tests that fail with this restriction. Fix htests to not create a second and redundant root and mainloop.
1 parent aacd53f commit b60adc5

15 files changed

Lines changed: 92 additions & 84 deletions

Lib/idlelib/debugobj.py

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -122,21 +122,20 @@ def make_objecttreeitem(labeltext, object, setfunction=None):
122122
return c(labeltext, object, setfunction)
123123

124124

125-
def _object_browser(parent):
125+
def _object_browser(parent): # htest #
126126
import sys
127-
from tkinter import Tk
128-
root = Tk()
129-
root.title("Test debug object browser")
127+
from tkinter import Toplevel
128+
top = Toplevel(parent)
129+
top.title("Test debug object browser")
130130
width, height, x, y = list(map(int, re.split('[x+]', parent.geometry())))
131-
root.geometry("+%d+%d"%(x, y + 150))
132-
root.configure(bd=0, bg="yellow")
133-
root.focus_set()
134-
sc = ScrolledCanvas(root, bg="white", highlightthickness=0, takefocus=1)
131+
top.geometry("+%d+%d"%(x + 100, y + 175))
132+
top.configure(bd=0, bg="yellow")
133+
top.focus_set()
134+
sc = ScrolledCanvas(top, bg="white", highlightthickness=0, takefocus=1)
135135
sc.frame.pack(expand=1, fill="both")
136136
item = make_objecttreeitem("sys", sys)
137137
node = TreeNode(sc.canvas, None, item)
138138
node.update()
139-
root.mainloop()
140139

141140
if __name__ == '__main__':
142141
from idlelib.idle_test.htest import run

Lib/idlelib/dynoption.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,9 +34,9 @@ def SetMenu(self,valueList,value=None):
3434
self.variable.set(value)
3535

3636
def _dyn_option_menu(parent): # htest #
37-
from tkinter import Toplevel
37+
from tkinter import Toplevel # + StringVar, Button
3838

39-
top = Toplevel()
39+
top = Toplevel(parent)
4040
top.title("Tets dynamic option menu")
4141
top.geometry("200x100+%d+%d" % (parent.winfo_rootx() + 200,
4242
parent.winfo_rooty() + 150))

Lib/idlelib/grep.py

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@
33
import re # for htest
44
import sys
55
from tkinter import StringVar, BooleanVar, Checkbutton # for GrepDialog
6-
from tkinter import Tk, Text, Button, SEL, END # for htest
76
from idlelib import searchengine
87
from idlelib.searchbase import SearchDialogBase
98
# Importing OutputWindow fails due to import loop
@@ -132,23 +131,23 @@ def close(self, event=None):
132131

133132
def _grep_dialog(parent): # htest #
134133
from idlelib.pyshell import PyShellFileList
135-
root = Tk()
136-
root.title("Test GrepDialog")
134+
from tkinter import Toplevel, Text, Button, SEL, END
135+
top = Toplevel(parent)
136+
top.title("Test GrepDialog")
137137
width, height, x, y = list(map(int, re.split('[x+]', parent.geometry())))
138-
root.geometry("+%d+%d"%(x, y + 150))
138+
top.geometry("+%d+%d"%(x, y + 150))
139139

140-
flist = PyShellFileList(root)
141-
text = Text(root, height=5)
140+
flist = PyShellFileList(top)
141+
text = Text(top, height=5)
142142
text.pack()
143143

144144
def show_grep_dialog():
145145
text.tag_add(SEL, "1.0", END)
146146
grep(text, flist=flist)
147147
text.tag_remove(SEL, "1.0", END)
148148

149-
button = Button(root, text="Show GrepDialog", command=show_grep_dialog)
149+
button = Button(top, text="Show GrepDialog", command=show_grep_dialog)
150150
button.pack()
151-
root.mainloop()
152151

153152
if __name__ == "__main__":
154153
import unittest

Lib/idlelib/idle_test/htest.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,7 @@ def _wrapper(parent): # htest #
6868
from importlib import import_module
6969
import tkinter as tk
7070
from tkinter.ttk import Scrollbar
71+
tk.NoDefaultRoot()
7172

7273
AboutDialog_spec = {
7374
'file': 'help_about',
@@ -364,7 +365,7 @@ def run(*tests):
364365
test = getattr(mod, test_name)
365366
test_list.append((test_spec, test))
366367

367-
test_name = tk.StringVar('')
368+
test_name = tk.StringVar(root)
368369
callable_object = None
369370
test_kwds = None
370371

Lib/idlelib/idle_test/test_searchbase.py

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,7 @@ def test_create_widgets(self):
7474
def test_make_entry(self):
7575
equal = self.assertEqual
7676
self.dialog.row = 0
77-
self.dialog.top = Toplevel(self.root)
77+
self.dialog.top = self.root
7878
entry, label = self.dialog.make_entry("Test:", 'hello')
7979
equal(label['text'], 'Test:')
8080

@@ -87,14 +87,15 @@ def test_make_entry(self):
8787
equal(self.dialog.row, 1)
8888

8989
def test_create_entries(self):
90+
self.dialog.top = self.root
9091
self.dialog.row = 0
9192
self.engine.setpat('hello')
9293
self.dialog.create_entries()
9394
self.assertIn(self.dialog.ent.get(), 'hello')
9495

9596
def test_make_frame(self):
9697
self.dialog.row = 0
97-
self.dialog.top = Toplevel(self.root)
98+
self.dialog.top = self.root
9899
frame, label = self.dialog.make_frame()
99100
self.assertEqual(label, '')
100101
self.assertIsInstance(frame, Frame)
@@ -104,7 +105,7 @@ def test_make_frame(self):
104105
self.assertIsInstance(frame, Frame)
105106

106107
def btn_test_setup(self, meth):
107-
self.dialog.top = Toplevel(self.root)
108+
self.dialog.top = self.root
108109
self.dialog.row = 0
109110
return meth()
110111

@@ -145,12 +146,13 @@ def test_create_other_buttons(self):
145146
self.assertEqual(var.get(), state)
146147

147148
def test_make_button(self):
148-
self.dialog.top = Toplevel(self.root)
149+
self.dialog.top = self.root
149150
self.dialog.buttonframe = Frame(self.dialog.top)
150151
btn = self.dialog.make_button('Test', self.dialog.close)
151152
self.assertEqual(btn['text'], 'Test')
152153

153154
def test_create_command_buttons(self):
155+
self.dialog.top = self.root
154156
self.dialog.create_command_buttons()
155157
# Look for close button command in buttonframe
156158
closebuttoncommand = ''

Lib/idlelib/idle_test/test_text.py

Lines changed: 15 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,19 @@
1-
# Test mock_tk.Text class against tkinter.Text class by running same tests with both.
1+
''' Test mock_tk.Text class against tkinter.Text class
2+
3+
Run same tests with both by creating a mixin class.
4+
'''
25
import unittest
36
from test.support import requires
4-
57
from _tkinter import TclError
68

79
class TextTest(object):
10+
"Define items common to both sets of tests."
811

9-
hw = 'hello\nworld' # usual initial insert after initialization
12+
hw = 'hello\nworld' # Several tests insert this after after initialization.
1013
hwn = hw+'\n' # \n present at initialization, before insert
1114

12-
Text = None
13-
def setUp(self):
14-
self.text = self.Text()
15+
# setUpClass defines cls.Text and maybe cls.root.
16+
# setUp defines self.text from Text and maybe root.
1517

1618
def test_init(self):
1719
self.assertEqual(self.text.get('1.0'), '\n')
@@ -196,6 +198,10 @@ def setUpClass(cls):
196198
from idlelib.idle_test.mock_tk import Text
197199
cls.Text = Text
198200

201+
def setUp(self):
202+
self.text = self.Text()
203+
204+
199205
def test_decode(self):
200206
# test endflags (-1, 0) not tested by test_index (which uses +1)
201207
decode = self.text._decode
@@ -222,6 +228,9 @@ def tearDownClass(cls):
222228
cls.root.destroy()
223229
del cls.root
224230

231+
def setUp(self):
232+
self.text = self.Text(self.root)
233+
225234

226235
if __name__ == '__main__':
227236
unittest.main(verbosity=2, exit=False)

Lib/idlelib/multicall.py

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -414,12 +414,12 @@ def __del__(self):
414414
return MultiCall
415415

416416

417-
def _multi_call(parent):
418-
root = tkinter.Tk()
419-
root.title("Test MultiCall")
417+
def _multi_call(parent): # htest #
418+
top = tkinter.Toplevel(parent)
419+
top.title("Test MultiCall")
420420
width, height, x, y = list(map(int, re.split('[x+]', parent.geometry())))
421-
root.geometry("+%d+%d"%(x, y + 150))
422-
text = MultiCallCreator(tkinter.Text)(root)
421+
top.geometry("+%d+%d"%(x, y + 150))
422+
text = MultiCallCreator(tkinter.Text)(top)
423423
text.pack()
424424
def bindseq(seq, n=[0]):
425425
def handler(event):
@@ -439,7 +439,6 @@ def handler(event):
439439
bindseq("<FocusOut>")
440440
bindseq("<Enter>")
441441
bindseq("<Leave>")
442-
root.mainloop()
443442

444443
if __name__ == "__main__":
445444
from idlelib.idle_test.htest import run

Lib/idlelib/percolator.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -89,10 +89,10 @@ def toggle2():
8989
(pin if var2.get() else pout)(t2)
9090

9191
text.pack()
92-
var1 = tk.IntVar()
92+
var1 = tk.IntVar(parent)
9393
cb1 = tk.Checkbutton(box, text="Tracer1", command=toggle1, variable=var1)
9494
cb1.pack()
95-
var2 = tk.IntVar()
95+
var2 = tk.IntVar(parent)
9696
cb2 = tk.Checkbutton(box, text="Tracer2", command=toggle2, variable=var2)
9797
cb2.pack()
9898

Lib/idlelib/pyshell.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1547,7 +1547,9 @@ def main():
15471547
enable_edit = enable_edit or edit_start
15481548
enable_shell = enable_shell or not enable_edit
15491549

1550-
# start editor and/or shell windows:
1550+
# Setup root.
1551+
if use_subprocess: # Don't break user code run in IDLE process
1552+
NoDefaultRoot()
15511553
root = Tk(className="Idle")
15521554
root.withdraw()
15531555

@@ -1563,6 +1565,7 @@ def main():
15631565
icons = [PhotoImage(file=iconfile) for iconfile in iconfiles]
15641566
root.wm_iconphoto(True, *icons)
15651567

1568+
# start editor and/or shell windows:
15661569
fixwordbreaks(root)
15671570
fix_x11_paste(root)
15681571
flist = PyShellFileList(root)

Lib/idlelib/redirector.py

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -151,26 +151,25 @@ def __call__(self, *args):
151151

152152

153153
def _widget_redirector(parent): # htest #
154-
from tkinter import Tk, Text
154+
from tkinter import Toplevel, Text
155155
import re
156156

157-
root = Tk()
158-
root.title("Test WidgetRedirector")
157+
top = Toplevel(parent)
158+
top.title("Test WidgetRedirector")
159159
width, height, x, y = list(map(int, re.split('[x+]', parent.geometry())))
160-
root.geometry("+%d+%d"%(x, y + 150))
161-
text = Text(root)
160+
top.geometry("+%d+%d"%(x, y + 150))
161+
text = Text(top)
162162
text.pack()
163163
text.focus_set()
164164
redir = WidgetRedirector(text)
165165
def my_insert(*args):
166166
print("insert", args)
167167
original_insert(*args)
168168
original_insert = redir.register("insert", my_insert)
169-
root.mainloop()
170169

171170
if __name__ == "__main__":
172171
import unittest
173-
unittest.main('idlelib.idle_test.test_widgetredir',
172+
unittest.main('idlelib.idle_test.test_redirector',
174173
verbosity=2, exit=False)
175174
from idlelib.idle_test.htest import run
176175
run(_widget_redirector)

0 commit comments

Comments
 (0)