Skip to content

Commit 3a50f77

Browse files
gh-153513: Remove redundant conversions in tkinter tests
Now that index, window, parsedVarName and pixel options are returned as str, int or float, drop the str()/int()/float() wrappers that only worked around Tcl_Obj results. The generated test_configure_* tests now also check that int- and float-valued options are returned as numbers. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
1 parent 8a32914 commit 3a50f77

6 files changed

Lines changed: 64 additions & 50 deletions

File tree

Lib/test/test_tkinter/test_filedialog.py

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -124,7 +124,7 @@ def test_use_classic(self):
124124
self.assertEqual(d.ok_button.winfo_class(), 'Button')
125125
self.assertEqual(d.selection.winfo_class(), 'Entry')
126126
if d.top._windowingsystem == 'x11':
127-
self.assertEqual(str(d.botframe.cget('relief')), 'raised')
127+
self.assertEqual(d.botframe.cget('relief'), 'raised')
128128

129129
def test_background(self):
130130
# The ttk dialog adopts the ttk background, even a customized one, while
@@ -145,18 +145,19 @@ def test_button_accelerator(self):
145145
# The buttons' "&" accelerators are parsed.
146146
d = self.open()
147147
self.assertEqual(str(d.ok_button.cget('text')), 'OK')
148-
self.assertEqual(int(d.ok_button.cget('underline')), 0)
148+
self.assertEqual(d.ok_button.cget('underline'),
149+
0 if self.wantobjects else '0')
149150

150151
def test_default_ring(self):
151152
# The default ring follows the keyboard focus among the buttons.
152153
d = self.open()
153-
self.assertEqual(str(d.cancel_button.cget('default')), 'normal')
154+
self.assertEqual(d.cancel_button.cget('default'), 'normal')
154155
d.cancel_button.focus_force()
155156
d.top.update()
156-
self.assertEqual(str(d.cancel_button.cget('default')), 'active')
157+
self.assertEqual(d.cancel_button.cget('default'), 'active')
157158
d.ok_button.focus_force()
158159
d.top.update()
159-
self.assertEqual(str(d.cancel_button.cget('default')), 'normal')
160+
self.assertEqual(d.cancel_button.cget('default'), 'normal')
160161

161162
def test_alt_key(self):
162163
# Alt + the underlined letter invokes the matching button.
@@ -182,8 +183,8 @@ def test_escape_cancels(self):
182183
def test_horizontal_scrollbars(self):
183184
# Each list has a horizontal scrollbar besides the vertical one.
184185
d = self.open()
185-
self.assertEqual(str(d.dirshbar.cget('orient')), 'horizontal')
186-
self.assertEqual(str(d.fileshbar.cget('orient')), 'horizontal')
186+
self.assertEqual(d.dirshbar.cget('orient'), 'horizontal')
187+
self.assertEqual(d.fileshbar.cget('orient'), 'horizontal')
187188
self.assertTrue(d.dirs.cget('xscrollcommand'))
188189
self.assertTrue(d.files.cget('xscrollcommand'))
189190

Lib/test/test_tkinter/test_simpledialog.py

Lines changed: 22 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ def test_use_ttk(self):
3232
d = self.create(buttons=['OK'], bitmap='warning')
3333
self.assertEqual(d._buttons[0].winfo_class(), 'TButton')
3434
self.assertEqual(d.message.winfo_class(), 'TLabel')
35-
self.assertEqual(str(d.message.cget('anchor')), 'nw') # cf. MessageBox
35+
self.assertEqual(d.message.cget('anchor'), 'nw') # cf. MessageBox
3636
# The standard icons are drawn with themed images (cf. MessageBox).
3737
self.assertEqual(d.bitmap.winfo_class(), 'TLabel')
3838
self.assertIn('::tk::icons::warning', str(d.bitmap.cget('image')))
@@ -57,7 +57,7 @@ def test_use_classic(self):
5757
self.assertEqual(d._buttons[0].winfo_class(), 'Button')
5858
self.assertEqual(d.message.winfo_class(), 'Label')
5959
if d.root._windowingsystem == 'x11':
60-
self.assertEqual(str(d.frame.cget('relief')), 'raised')
60+
self.assertEqual(d.frame.cget('relief'), 'raised')
6161
# tk_dialog does not make the buttons equal width.
6262
self.assertIsNone(d.root.children['bot'].grid_columnconfigure(0)['uniform'])
6363
# The bitmap is a classic monochrome label.
@@ -75,17 +75,20 @@ def test_no_detail(self):
7575
# Without a detail message the message label expands.
7676
d = self.create()
7777
self.assertIsNone(d.detail)
78-
self.assertEqual(int(d.message.pack_info()['expand']), 1)
78+
self.assertEqual(d.message.pack_info()['expand'],
79+
1 if self.wantobjects else '1')
7980

8081
def test_detail(self):
8182
# The detail message is shown below the main message.
8283
d = self.create(detail='More information.')
8384
self.assertEqual(d.detail.winfo_class(), 'TLabel')
8485
self.assertEqual(str(d.detail.cget('text')), 'More information.')
85-
self.assertEqual(str(d.detail.cget('anchor')), 'nw') # cf. MessageBox
86+
self.assertEqual(d.detail.cget('anchor'), 'nw') # cf. MessageBox
8687
# With a detail message it expands and the main message does not.
87-
self.assertEqual(int(d.message.pack_info()['expand']), 0)
88-
self.assertEqual(int(d.detail.pack_info()['expand']), 1)
88+
self.assertEqual(d.message.pack_info()['expand'],
89+
0 if self.wantobjects else '0')
90+
self.assertEqual(d.detail.pack_info()['expand'],
91+
1 if self.wantobjects else '1')
8992

9093
def test_bitmap_fallback(self):
9194
# A non-standard bitmap has no themed image, so even the ttk version
@@ -114,11 +117,11 @@ def test_button_options(self):
114117
yes, no = d._buttons
115118
self.assertEqual(str(yes.cget('text')), 'Yes')
116119
self.assertEqual(str(no.cget('text')), 'No')
117-
self.assertEqual(int(no.cget('underline')), 0)
120+
self.assertEqual(no.cget('underline'), 0 if self.wantobjects else '0')
118121
self.assertEqual(str(no.cget('width')), '12')
119122
# The dialog still controls the default ring (default=0) ...
120-
self.assertEqual(str(yes.cget('default')), 'active')
121-
self.assertEqual(str(no.cget('default')), 'normal')
123+
self.assertEqual(yes.cget('default'), 'active')
124+
self.assertEqual(no.cget('default'), 'normal')
122125
# ... and the command, which records the button index.
123126
no.invoke()
124127
self.assertEqual(d.num, 1)
@@ -128,13 +131,13 @@ def test_default_ring(self):
128131
# (cf. tk::MessageBox).
129132
d = self.create() # buttons ['Yes', 'No'], default 0
130133
b0, b1 = d._buttons
131-
self.assertEqual(str(b1.cget('default')), 'normal')
134+
self.assertEqual(b1.cget('default'), 'normal')
132135
b1.focus_force()
133136
d.root.update()
134-
self.assertEqual(str(b1.cget('default')), 'active') # focused -> ring
137+
self.assertEqual(b1.cget('default'), 'active') # focused -> ring
135138
b0.focus_force()
136139
d.root.update()
137-
self.assertEqual(str(b1.cget('default')), 'normal') # unfocused -> none
140+
self.assertEqual(b1.cget('default'), 'normal') # unfocused -> none
138141

139142
def test_alt_key(self):
140143
# Alt + an underlined character (the "underline" button option) invokes
@@ -269,7 +272,7 @@ def test_use_classic(self):
269272
self.assertEqual(d.children['ok'].winfo_class(), 'Button')
270273
self.assertEqual(d.entry.winfo_class(), 'Entry')
271274
if d._windowingsystem == 'x11':
272-
self.assertEqual(str(d.children['bot'].cget('relief')), 'raised')
275+
self.assertEqual(d.children['bot'].cget('relief'), 'raised')
273276
# tk_dialog does not make the buttons equal width.
274277
self.assertIsNone(d.children['bot'].grid_columnconfigure(0)['uniform'])
275278
# The bindings work with the classic buttons too.
@@ -311,8 +314,8 @@ def body(self, master):
311314

312315
def test_button_default(self):
313316
d = self.open()
314-
self.assertEqual(str(d.children['ok'].cget('default')), 'active')
315-
self.assertEqual(str(d.children['cancel'].cget('default')), 'normal')
317+
self.assertEqual(d.children['ok'].cget('default'), 'active')
318+
self.assertEqual(d.children['cancel'].cget('default'), 'normal')
316319

317320
def test_underline_ampersand(self):
318321
self.assertEqual(_underline_ampersand('Yes'), ('Yes', -1))
@@ -326,19 +329,19 @@ def test_button_accelerator(self):
326329
d = self.open()
327330
ok = d.children['ok'] # "&OK" -> underline 0 -> "O"
328331
self.assertEqual(str(ok.cget('text')), 'OK')
329-
self.assertEqual(int(ok.cget('underline')), 0)
332+
self.assertEqual(ok.cget('underline'), 0 if self.wantobjects else '0')
330333

331334
def test_default_ring(self):
332335
# The default ring follows the keyboard focus among the buttons.
333336
d = self.open()
334337
cancel = d.children['cancel']
335-
self.assertEqual(str(cancel.cget('default')), 'normal')
338+
self.assertEqual(cancel.cget('default'), 'normal')
336339
cancel.focus_force()
337340
d.update()
338-
self.assertEqual(str(cancel.cget('default')), 'active')
341+
self.assertEqual(cancel.cget('default'), 'active')
339342
d.children['ok'].focus_force()
340343
d.update()
341-
self.assertEqual(str(cancel.cget('default')), 'normal')
344+
self.assertEqual(cancel.cget('default'), 'normal')
342345

343346
def test_find_alt_key_target(self):
344347
d = self.open()

Lib/test/test_tkinter/test_text.py

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -508,10 +508,12 @@ def test_image_configure(self):
508508
self.assertEqual(str(text.image_cget(name, 'image')), str(image))
509509
for value in ('top', 'center', 'bottom', 'baseline'):
510510
text.image_configure(name, align=value)
511-
self.assertEqual(str(text.image_cget(name, 'align')), value)
511+
self.assertEqual(text.image_cget(name, 'align'), value)
512512
text.image_configure(name, padx=3, pady=4)
513-
self.assertEqual(text.tk.getint(text.image_cget(name, 'padx')), 3)
514-
self.assertEqual(text.tk.getint(text.image_cget(name, 'pady')), 4)
513+
self.assertEqual(text.image_cget(name, 'padx'),
514+
3 if self.wantobjects else '3')
515+
self.assertEqual(text.image_cget(name, 'pady'),
516+
4 if self.wantobjects else '4')
515517

516518
# Querying returns the full option set.
517519
cnf = text.image_configure(name)
@@ -528,10 +530,12 @@ def test_window_configure(self):
528530
self.assertEqual(text.window_cget('1.1', 'window'), str(button))
529531
for value in ('top', 'center', 'bottom', 'baseline'):
530532
text.window_configure('1.1', align=value)
531-
self.assertEqual(str(text.window_cget('1.1', 'align')), value)
533+
self.assertEqual(text.window_cget('1.1', 'align'), value)
532534
text.window_configure('1.1', padx=3, pady=4)
533-
self.assertEqual(text.tk.getint(text.window_cget('1.1', 'padx')), 3)
534-
self.assertEqual(text.tk.getint(text.window_cget('1.1', 'pady')), 4)
535+
self.assertEqual(text.window_cget('1.1', 'padx'),
536+
3 if self.wantobjects else '3')
537+
self.assertEqual(text.window_cget('1.1', 'pady'),
538+
4 if self.wantobjects else '4')
535539
text.window_configure('1.1', stretch=True)
536540
self.assertIs(text.tk.getboolean(text.window_cget('1.1', 'stretch')),
537541
True)

Lib/test/test_tkinter/test_widgets.py

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -266,7 +266,7 @@ def test_unique_variables(self):
266266
b = tkinter.Checkbutton(f, text=j)
267267
b.pack()
268268
buttons.append(b)
269-
variables = [str(b['variable']) for b in buttons]
269+
variables = [b['variable'] for b in buttons]
270270
self.assertEqual(len(set(variables)), 4, variables)
271271

272272
def test_same_name(self):
@@ -442,14 +442,15 @@ def test_kwargs(self):
442442
# Menubutton options can be passed at construction (gh-101284).
443443
widget = tkinter.OptionMenu(self.root, None, 'b',
444444
width=10, direction='right')
445+
# Menubutton -width is a string on Tk 8.6, an int on 9.0+.
445446
self.assertEqual(int(widget['width']), 10)
446-
self.assertEqual(str(widget['direction']), 'right')
447+
self.assertEqual(widget['direction'], 'right')
447448
# They override OptionMenu's own appearance defaults,
448449
widget = tkinter.OptionMenu(self.root, None, 'b', relief='flat')
449-
self.assertEqual(str(widget['relief']), 'flat')
450+
self.assertEqual(widget['relief'], 'flat')
450451
# which otherwise keep their historical values.
451452
widget = tkinter.OptionMenu(self.root, None, 'b')
452-
self.assertEqual(str(widget['relief']), 'raised')
453+
self.assertEqual(widget['relief'], 'raised')
453454

454455
def test_bad_kwarg(self):
455456
with self.assertRaisesRegex(TclError, r'^unknown option "-spam"$'):
@@ -2472,9 +2473,9 @@ def test_entryconfigure_variable(self):
24722473
v2 = tkinter.BooleanVar(self.root)
24732474
m1.add_checkbutton(variable=v1, onvalue=True, offvalue=False,
24742475
label='Nonsense')
2475-
self.assertEqual(str(m1.entrycget(1, 'variable')), str(v1))
2476+
self.assertEqual(m1.entrycget(1, 'variable'), str(v1))
24762477
m1.entryconfigure(1, variable=v2)
2477-
self.assertEqual(str(m1.entrycget(1, 'variable')), str(v2))
2478+
self.assertEqual(m1.entrycget(1, 'variable'), str(v2))
24782479

24792480
def test_add(self):
24802481
m = self.create(tearoff=False)

Lib/test/test_tkinter/widget_tests.py

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,11 @@ def checkParam(self, widget, name, value, *, expected=_sentinel,
6767
expected = tkinter._join(expected)
6868
else:
6969
expected = str(expected)
70+
elif type(expected) is int:
71+
self.assertIsInstance(widget[name], int)
72+
elif type(expected) is float:
73+
# An integral value may be returned as an int.
74+
self.assertIsInstance(widget[name], (int, float))
7075
if eq is None:
7176
eq = tcl_obj_eq
7277
self.assertEqual2(widget[name], expected, eq=eq)
@@ -439,7 +444,7 @@ def test_configure_justify(self):
439444

440445
def test_configure_orient(self):
441446
widget = self.create()
442-
self.assertEqual(str(widget['orient']), self.default_orient)
447+
self.assertEqual(widget['orient'], self.default_orient)
443448
self.checkEnumParam(widget, 'orient', 'horizontal', 'vertical')
444449

445450
@requires_tk(8, 7)

Lib/test/test_ttk/test_widgets.py

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -310,7 +310,7 @@ def test_unique_variables(self):
310310
b = ttk.Checkbutton(f, text=j)
311311
b.pack()
312312
buttons.append(b)
313-
variables = [str(b['variable']) for b in buttons]
313+
variables = [b['variable'] for b in buttons]
314314
self.assertEqual(len(set(variables)), 4, variables)
315315

316316
def test_unique_variables2(self):
@@ -331,7 +331,7 @@ def test_unique_variables2(self):
331331
buttons.append(b)
332332
names = [str(b) for b in buttons]
333333
self.assertEqual(len(set(names)), len(buttons), names)
334-
variables = [str(b['variable']) for b in buttons]
334+
variables = [b['variable'] for b in buttons]
335335
self.assertEqual(len(set(variables)), len(buttons), variables)
336336

337337

@@ -618,14 +618,14 @@ def create(self, **kwargs):
618618

619619
def test_configure_orient(self):
620620
widget = self.create()
621-
self.assertEqual(str(widget['orient']), 'vertical')
621+
self.assertEqual(widget['orient'], 'vertical')
622622
errmsg='attempt to change read-only option'
623623
if get_tk_patchlevel(self.root) < (8, 6, 0, 'beta', 3):
624624
errmsg='Attempt to change read-only option'
625625
self.checkInvalidParam(widget, 'orient', 'horizontal',
626626
errmsg=errmsg)
627627
widget2 = self.create(orient='horizontal')
628-
self.assertEqual(str(widget2['orient']), 'horizontal')
628+
self.assertEqual(widget2['orient'], 'horizontal')
629629

630630
def test_add(self):
631631
# attempt to add a child that is not a direct child of the paned window
@@ -790,7 +790,7 @@ def cb_test():
790790
self.assertEqual(myvar.get(),
791791
conv(cbtn.tk.globalgetvar(cbtn['variable'])))
792792

793-
self.assertEqual(str(cbtn['variable']), str(cbtn2['variable']))
793+
self.assertEqual(cbtn['variable'], cbtn2['variable'])
794794

795795

796796
@add_configure_tests(StandardTtkOptionsTests)
@@ -985,13 +985,13 @@ def test_configure_value(self):
985985

986986
def test_step(self):
987987
widget = self.create(maximum=100, mode='determinate')
988-
self.assertEqual(float(widget['value']), 0.0)
988+
self.assertEqual(widget['value'], self._str(0.0))
989989
widget.step() # The default increment is 1.0.
990-
self.assertEqual(float(widget['value']), 1.0)
990+
self.assertEqual(widget['value'], self._str(1.0))
991991
widget.step(5)
992-
self.assertEqual(float(widget['value']), 6.0)
992+
self.assertEqual(widget['value'], self._str(6.0))
993993
widget.step(-2)
994-
self.assertEqual(float(widget['value']), 4.0)
994+
self.assertEqual(widget['value'], self._str(4.0))
995995

996996
def test_start_stop(self):
997997
widget = self.create(maximum=100, mode='determinate')
@@ -1000,9 +1000,9 @@ def test_start_stop(self):
10001000
widget.update()
10011001
widget.stop() # Cancel it.
10021002
# After stopping, the value no longer changes.
1003-
value = float(widget['value'])
1003+
value = widget['value']
10041004
widget.update()
1005-
self.assertEqual(float(widget['value']), value)
1005+
self.assertEqual(widget['value'], value)
10061006

10071007

10081008
@unittest.skipIf(sys.platform == 'darwin',

0 commit comments

Comments
 (0)