Skip to content

Commit d3ea065

Browse files
Issue #22236: Tkinter tests now don't reuse default root window. New root
window is created for every test class. Fixed Tkinter images copying operations in NoDefaultRoot mode. Tcl command names generated for "after" callbacks now contains a name of original function.
1 parent 8cb6738 commit d3ea065

14 files changed

Lines changed: 229 additions & 264 deletions

Lib/lib-tk/Tkinter.py

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -563,6 +563,7 @@ def callit():
563563
self.deletecommand(name)
564564
except TclError:
565565
pass
566+
callit.__name__ = func.__name__
566567
name = self._register(callit)
567568
return self.tk.call('after', ms, name)
568569
def after_idle(self, func, *args):
@@ -3293,7 +3294,7 @@ def __init__(self, imgtype, name=None, cnf={}, master=None, **kw):
32933294
master = _default_root
32943295
if not master:
32953296
raise RuntimeError, 'Too early to create image'
3296-
self.tk = master.tk
3297+
self.tk = getattr(master, 'tk', master)
32973298
if not name:
32983299
Image._last_id += 1
32993300
name = "pyimage%r" % (Image._last_id,) # tk itself would use image<x>
@@ -3368,20 +3369,20 @@ def __getitem__(self, key):
33683369
# XXX copy -from, -to, ...?
33693370
def copy(self):
33703371
"""Return a new PhotoImage with the same image as this widget."""
3371-
destImage = PhotoImage()
3372+
destImage = PhotoImage(master=self.tk)
33723373
self.tk.call(destImage, 'copy', self.name)
33733374
return destImage
33743375
def zoom(self,x,y=''):
33753376
"""Return a new PhotoImage with the same image as this widget
33763377
but zoom it with X and Y."""
3377-
destImage = PhotoImage()
3378+
destImage = PhotoImage(master=self.tk)
33783379
if y=='': y=x
33793380
self.tk.call(destImage, 'copy', self.name, '-zoom',x,y)
33803381
return destImage
33813382
def subsample(self,x,y=''):
33823383
"""Return a new PhotoImage based on the same image as this widget
33833384
but use only every Xth or Yth pixel."""
3384-
destImage = PhotoImage()
3385+
destImage = PhotoImage(master=self.tk)
33853386
if y=='': y=x
33863387
self.tk.call(destImage, 'copy', self.name, '-subsample',x,y)
33873388
return destImage

Lib/lib-tk/test/test_tkinter/test_font.py

Lines changed: 6 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,28 +1,21 @@
11
import unittest
22
import Tkinter as tkinter
3-
#from Tkinter
43
import tkFont as font
54
from test.test_support import requires, run_unittest
6-
import test_ttk.support as support
5+
from test_ttk.support import AbstractTkTest
76

87
requires('gui')
98

10-
class FontTest(unittest.TestCase):
11-
12-
def setUp(self):
13-
support.root_deiconify()
14-
15-
def tearDown(self):
16-
support.root_withdraw()
9+
class FontTest(AbstractTkTest, unittest.TestCase):
1710

1811
def test_font_eq(self):
1912
fontname = "TkDefaultFont"
2013
try:
21-
f = font.Font(name=fontname, exists=True)
14+
f = font.Font(root=self.root, name=fontname, exists=True)
2215
except tkinter._tkinter.TclError:
23-
f = font.Font(name=fontname, exists=False)
24-
font1 = font.nametofont(fontname)
25-
font2 = font.nametofont(fontname)
16+
f = font.Font(root=self.root, name=fontname, exists=False)
17+
font1 = font.Font(root=self.root, name=fontname, exists=True)
18+
font2 = font.Font(root=self.root, name=fontname, exists=True)
2619
self.assertIsNot(font1, font2)
2720
self.assertEqual(font1, font2)
2821
self.assertNotEqual(font1, font1.copy())

Lib/lib-tk/test/test_tkinter/test_geometry_managers.py

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -278,7 +278,7 @@ class PlaceTest(AbstractWidgetTest, unittest.TestCase):
278278

279279
def create2(self):
280280
t = tkinter.Toplevel(self.root, width=300, height=200, bd=0)
281-
t.wm_geometry('+0+0')
281+
t.wm_geometry('300x200+0+0')
282282
f = tkinter.Frame(t, width=154, height=84, bd=2, relief='raised')
283283
f.place_configure(x=48, y=38)
284284
f2 = tkinter.Frame(t, width=30, height=60, bd=2, relief='raised')
@@ -479,17 +479,16 @@ def test_place_slaves(self):
479479
class GridTest(AbstractWidgetTest, unittest.TestCase):
480480

481481
def tearDown(self):
482-
super(GridTest, self).tearDown()
483482
cols, rows = self.root.grid_size()
484483
for i in range(cols + 1):
485484
self.root.grid_columnconfigure(i, weight=0, minsize=0, pad=0, uniform='')
486485
for i in range(rows + 1):
487486
self.root.grid_rowconfigure(i, weight=0, minsize=0, pad=0, uniform='')
488487
self.root.grid_propagate(1)
488+
super(GridTest, self).tearDown()
489489

490490
def test_grid_configure(self):
491491
b = tkinter.Button(self.root)
492-
self.addCleanup(b.destroy)
493492
self.assertEqual(b.grid_info(), {})
494493
b.grid_configure()
495494
self.assertEqual(b.grid_info()['in'], self.root)
@@ -576,7 +575,6 @@ def test_grid_configure_pady(self):
576575

577576
def test_grid_configure_row(self):
578577
b = tkinter.Button(self.root)
579-
self.addCleanup(b.destroy)
580578
with self.assertRaisesRegexp(TclError, 'bad (row|grid) value "-1": '
581579
'must be a non-negative integer'):
582580
b.grid_configure(row=-1)
@@ -782,7 +780,7 @@ def test_grid_bbox(self):
782780
self.root.grid_bbox(0, 0, 0, 'x')
783781
with self.assertRaises(TypeError):
784782
self.root.grid_bbox(0, 0, 0, 0, 0)
785-
t = tkinter.Toplevel(self.root)
783+
t = self.root
786784
# de-maximize
787785
t.wm_geometry('1x1+0+0')
788786
t.wm_geometry('')
@@ -810,7 +808,7 @@ def test_grid_location(self):
810808
self.root.grid_location('x', 'y')
811809
with self.assertRaisesRegexp(TclError, 'bad screen distance "y"'):
812810
self.root.grid_location('1c', 'y')
813-
t = tkinter.Toplevel(self.root)
811+
t = self.root
814812
# de-maximize
815813
t.wm_geometry('1x1+0+0')
816814
t.wm_geometry('')

Lib/lib-tk/test/test_tkinter/test_images.py

Lines changed: 6 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -2,15 +2,12 @@
22
import Tkinter as tkinter
33
import ttk
44
import test.test_support as support
5-
from test_ttk.support import requires_tcl
5+
from test_ttk.support import AbstractTkTest, requires_tcl
66

77
support.requires('gui')
88

99

10-
class MiscTest(unittest.TestCase):
11-
12-
def setUp(self):
13-
self.root = ttk.setup_master()
10+
class MiscTest(AbstractTkTest, unittest.TestCase):
1411

1512
def test_image_types(self):
1613
image_types = self.root.image_types()
@@ -23,15 +20,13 @@ def test_image_names(self):
2320
self.assertIsInstance(image_names, tuple)
2421

2522

26-
class BitmapImageTest(unittest.TestCase):
23+
class BitmapImageTest(AbstractTkTest, unittest.TestCase):
2724

2825
@classmethod
2926
def setUpClass(cls):
27+
AbstractTkTest.setUpClass.__func__(cls)
3028
cls.testfile = support.findfile('python.xbm', subdir='imghdrdata')
3129

32-
def setUp(self):
33-
self.root = ttk.setup_master()
34-
3530
def test_create_from_file(self):
3631
image = tkinter.BitmapImage('::img::test', master=self.root,
3732
foreground='yellow', background='blue',
@@ -107,16 +102,13 @@ def test_configure_foreground(self):
107102
'-foreground {} {} #000000 yellow')
108103

109104

110-
class PhotoImageTest(unittest.TestCase):
105+
class PhotoImageTest(AbstractTkTest, unittest.TestCase):
111106

112107
@classmethod
113108
def setUpClass(cls):
109+
AbstractTkTest.setUpClass.__func__(cls)
114110
cls.testfile = support.findfile('python.gif', subdir='imghdrdata')
115111

116-
def setUp(self):
117-
self.root = ttk.setup_master()
118-
self.wantobjects = self.root.wantobjects()
119-
120112
def create(self):
121113
return tkinter.PhotoImage('::img::test', master=self.root,
122114
file=self.testfile)

Lib/lib-tk/test/test_tkinter/test_text.py

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,16 @@
11
import unittest
22
import Tkinter as tkinter
33
from test.test_support import requires, run_unittest
4-
from ttk import setup_master
4+
from test_ttk.support import AbstractTkTest
55

66
requires('gui')
77

8-
class TextTest(unittest.TestCase):
8+
class TextTest(AbstractTkTest, unittest.TestCase):
99

1010
def setUp(self):
11-
self.root = setup_master()
11+
super(TextTest, self).setUp()
1212
self.text = tkinter.Text(self.root)
1313

14-
def tearDown(self):
15-
self.text.destroy()
16-
1714
def test_debug(self):
1815
text = self.text
1916
olddebug = text.debug()

Lib/lib-tk/test/test_tkinter/test_variables.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,15 @@
11
import unittest
22

3-
from Tkinter import Variable, StringVar, IntVar, DoubleVar, BooleanVar, Tk, TclError
3+
from Tkinter import Variable, StringVar, IntVar, DoubleVar, BooleanVar, Tcl, TclError
44

55

66
class TestBase(unittest.TestCase):
77

88
def setUp(self):
9-
self.root = Tk()
9+
self.root = Tcl()
1010

1111
def tearDown(self):
12-
self.root.destroy()
12+
del self.root
1313

1414

1515
class TestVariable(TestBase):

0 commit comments

Comments
 (0)