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

Skip to content

Commit a21acb5

Browse files
Issue #20072: Fixed multiple errors in tkinter with wantobjects is False.
* Misc.image_names(), Misc.image_types(), Wm.wm_colormapwindows(), and LabelFrame.panes() now always return a tuple. * Fixed error of comparing str and int in tt.LabeledScale._adjust(). * ttk.Notebook.index() now always returns int. * ttk.Notebook.tabs() now always returns a tuple. * ttk.Entry.bbox() now always returns a tuple of ints. * ttk.Entry.validate() now always correctly works. * ttk.Combobox.current() now always returns int. * ttk.Panedwindow.sashpos() now always returns int. * ttk.Treeview.bbox() now always returns a tuple of ints. * ttk.Treeview.get_children() now always returns a tuple. * ttk.Treeview.exists() now always correctly works. * ttk.Treeview.index() now always returns int. * ttk.Treeview.tag_has() now always returns 0 or 1. * And numerous other errors in methods which returns a tuple, list or dict. * Fixed ttk tests for wantobjects is False.
1 parent 0455c3f commit a21acb5

7 files changed

Lines changed: 153 additions & 71 deletions

File tree

Lib/tkinter/__init__.py

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1459,11 +1459,11 @@ def event_info(self, virtual=None):
14591459

14601460
def image_names(self):
14611461
"""Return a list of all existing image names."""
1462-
return self.tk.call('image', 'names')
1462+
return self.tk.splitlist(self.tk.call('image', 'names'))
14631463

14641464
def image_types(self):
14651465
"""Return a list of all available image types (e.g. phote bitmap)."""
1466-
return self.tk.call('image', 'types')
1466+
return self.tk.splitlist(self.tk.call('image', 'types'))
14671467

14681468

14691469
class CallWrapper:
@@ -1577,7 +1577,11 @@ def wm_colormapwindows(self, *wlist):
15771577
if len(wlist) > 1:
15781578
wlist = (wlist,) # Tk needs a list of windows here
15791579
args = ('wm', 'colormapwindows', self._w) + wlist
1580-
return [self._nametowidget(x) for x in self.tk.call(args)]
1580+
if wlist:
1581+
self.tk.call(args)
1582+
else:
1583+
return [self._nametowidget(x)
1584+
for x in self.tk.splitlist(self.tk.call(args))]
15811585
colormapwindows = wm_colormapwindows
15821586
def wm_command(self, value=None):
15831587
"""Store VALUE in WM_COMMAND property. It is the command
@@ -3472,8 +3476,11 @@ def __init__(self, name=None, cnf={}, master=None, **kw):
34723476
Valid resource names: background, data, file, foreground, maskdata, maskfile."""
34733477
Image.__init__(self, 'bitmap', name, cnf, master, **kw)
34743478

3475-
def image_names(): return _default_root.tk.call('image', 'names')
3476-
def image_types(): return _default_root.tk.call('image', 'types')
3479+
def image_names():
3480+
return _default_root.tk.splitlist(_default_root.tk.call('image', 'names'))
3481+
3482+
def image_types():
3483+
return _default_root.tk.splitlist(_default_root.tk.call('image', 'types'))
34773484

34783485

34793486
class Spinbox(Widget, XView):
@@ -3842,7 +3849,7 @@ def paneconfigure(self, tagOrId, cnf=None, **kw):
38423849

38433850
def panes(self):
38443851
"""Returns an ordered list of the child panes."""
3845-
return self.tk.call(self._w, 'panes')
3852+
return self.tk.splitlist(self.tk.call(self._w, 'panes'))
38463853

38473854
######################################################################
38483855
# Extensions:

Lib/tkinter/test/test_ttk/test_extensions.py

Lines changed: 16 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,10 @@ def test_widget_destroy(self):
2929
name = myvar._name
3030
x = ttk.LabeledScale(variable=myvar)
3131
x.destroy()
32-
self.assertEqual(x.tk.globalgetvar(name), myvar.get())
32+
if x.tk.wantobjects():
33+
self.assertEqual(x.tk.globalgetvar(name), myvar.get())
34+
else:
35+
self.assertEqual(float(x.tk.globalgetvar(name)), myvar.get())
3336
del myvar
3437
self.assertRaises(tkinter.TclError, x.tk.globalgetvar, name)
3538

@@ -59,8 +62,10 @@ def test_initialization(self):
5962
x.destroy()
6063

6164
# variable initialization/passing
62-
passed_expected = ((2.5, 2), ('0', 0), (0, 0), (10, 10),
65+
passed_expected = (('0', 0), (0, 0), (10, 10),
6366
(-1, -1), (sys.maxsize + 1, sys.maxsize + 1))
67+
if x.tk.wantobjects():
68+
passed_expected += ((2.5, 2),)
6469
for pair in passed_expected:
6570
x = ttk.LabeledScale(from_=pair[0])
6671
self.assertEqual(x.value, pair[1])
@@ -123,7 +128,7 @@ def test_horizontal_range(self):
123128
self.assertNotEqual(prev_xcoord, curr_xcoord)
124129
# the label widget should have been repositioned too
125130
linfo_2 = lscale.label.place_info()
126-
self.assertEqual(lscale.label['text'], 0)
131+
self.assertEqual(lscale.label['text'], 0 if lscale.tk.wantobjects() else '0')
127132
self.assertEqual(curr_xcoord, int(linfo_2['x']))
128133
# change the range back
129134
lscale.scale.configure(from_=0, to=10)
@@ -145,15 +150,20 @@ def test_variable_change(self):
145150
# The following update is needed since the test doesn't use mainloop,
146151
# at the same time this shouldn't affect test outcome
147152
x.update()
148-
self.assertEqual(x.label['text'], newval)
153+
self.assertEqual(x.label['text'],
154+
newval if x.tk.wantobjects() else str(newval))
149155
self.assertGreater(x.scale.coords()[0], curr_xcoord)
150156
self.assertEqual(x.scale.coords()[0],
151157
int(x.label.place_info()['x']))
152158

153159
# value outside range
154-
x.value = x.scale['to'] + 1 # no changes shouldn't happen
160+
if x.tk.wantobjects():
161+
conv = lambda x: x
162+
else:
163+
conv = int
164+
x.value = conv(x.scale['to']) + 1 # no changes shouldn't happen
155165
x.update()
156-
self.assertEqual(x.label['text'], newval)
166+
self.assertEqual(conv(x.label['text']), newval)
157167
self.assertEqual(x.scale.coords()[0],
158168
int(x.label.place_info()['x']))
159169

Lib/tkinter/test/test_ttk/test_functions.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -393,8 +393,10 @@ def test_list_from_layouttuple(self):
393393
('name', 'no_minus', 'value'))
394394
self.assertRaises(ValueError, ttk._list_from_layouttuple,
395395
('something', '-children')) # no children
396-
self.assertRaises(ValueError, ttk._list_from_layouttuple,
397-
('something', '-children', 'value')) # invalid children
396+
import tkinter
397+
if not tkinter._default_root or tkinter._default_root.wantobjects():
398+
self.assertRaises(ValueError, ttk._list_from_layouttuple,
399+
('something', '-children', 'value')) # invalid children
398400

399401

400402
def test_val_or_dict(self):

Lib/tkinter/test/test_ttk/test_style.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,8 @@ def test_map(self):
2525
style = self.style
2626
style.map('TButton', background=[('active', 'background', 'blue')])
2727
self.assertEqual(style.map('TButton', 'background'),
28-
[('active', 'background', 'blue')])
28+
[('active', 'background', 'blue')] if style.tk.wantobjects() else
29+
[('active background', 'blue')])
2930
self.assertIsInstance(style.map('TButton'), dict)
3031

3132

Lib/tkinter/test/test_ttk/test_widgets.py

Lines changed: 77 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -382,15 +382,21 @@ def check_get_current(getval, currval):
382382

383383
# testing values with empty string set through configure
384384
self.combo.configure(values=[1, '', 2])
385-
self.assertEqual(self.combo['values'], ('1', '', '2'))
385+
self.assertEqual(self.combo['values'],
386+
('1', '', '2') if self.wantobjects else
387+
'1 {} 2')
386388

387389
# testing values with spaces
388390
self.combo['values'] = ['a b', 'a\tb', 'a\nb']
389-
self.assertEqual(self.combo['values'], ('a b', 'a\tb', 'a\nb'))
391+
self.assertEqual(self.combo['values'],
392+
('a b', 'a\tb', 'a\nb') if self.wantobjects else
393+
'{a b} {a\tb} {a\nb}')
390394

391395
# testing values with special characters
392396
self.combo['values'] = [r'a\tb', '"a"', '} {']
393-
self.assertEqual(self.combo['values'], (r'a\tb', '"a"', '} {'))
397+
self.assertEqual(self.combo['values'],
398+
(r'a\tb', '"a"', '} {') if self.wantobjects else
399+
r'a\\tb {"a"} \}\ \{')
394400

395401
# out of range
396402
self.assertRaises(tkinter.TclError, self.combo.current,
@@ -400,7 +406,8 @@ def check_get_current(getval, currval):
400406

401407
# testing creating combobox with empty string in values
402408
combo2 = ttk.Combobox(values=[1, 2, ''])
403-
self.assertEqual(combo2['values'], ('1', '2', ''))
409+
self.assertEqual(combo2['values'],
410+
('1', '2', '') if self.wantobjects else '1 2 {}')
404411
combo2.destroy()
405412

406413

@@ -654,9 +661,11 @@ def test_pane(self):
654661
child = ttk.Label()
655662
self.paned.add(child)
656663
self.assertIsInstance(self.paned.pane(0), dict)
657-
self.assertEqual(self.paned.pane(0, weight=None), 0)
664+
self.assertEqual(self.paned.pane(0, weight=None),
665+
0 if self.wantobjects else '0')
658666
# newer form for querying a single option
659-
self.assertEqual(self.paned.pane(0, 'weight'), 0)
667+
self.assertEqual(self.paned.pane(0, 'weight'),
668+
0 if self.wantobjects else '0')
660669
self.assertEqual(self.paned.pane(0), self.paned.pane(str(child)))
661670

662671
self.assertRaises(tkinter.TclError, self.paned.pane, 0,
@@ -711,20 +720,25 @@ def cb_test():
711720
cbtn = ttk.Radiobutton(command=cb_test, variable=myvar, value=0)
712721
cbtn2 = ttk.Radiobutton(command=cb_test, variable=myvar, value=1)
713722

723+
if self.wantobjects:
724+
conv = lambda x: x
725+
else:
726+
conv = int
727+
714728
res = cbtn.invoke()
715729
self.assertEqual(res, "cb test called")
716-
self.assertEqual(cbtn['value'], myvar.get())
730+
self.assertEqual(conv(cbtn['value']), myvar.get())
717731
self.assertEqual(myvar.get(),
718-
cbtn.tk.globalgetvar(cbtn['variable']))
732+
conv(cbtn.tk.globalgetvar(cbtn['variable'])))
719733
self.assertTrue(success)
720734

721735
cbtn2['command'] = ''
722736
res = cbtn2.invoke()
723737
self.assertEqual(str(res), '')
724738
self.assertLessEqual(len(success), 1)
725-
self.assertEqual(cbtn2['value'], myvar.get())
739+
self.assertEqual(conv(cbtn2['value']), myvar.get())
726740
self.assertEqual(myvar.get(),
727-
cbtn.tk.globalgetvar(cbtn['variable']))
741+
conv(cbtn.tk.globalgetvar(cbtn['variable'])))
728742

729743
self.assertEqual(str(cbtn['variable']), str(cbtn2['variable']))
730744

@@ -812,10 +826,15 @@ def test_custom_event(self):
812826

813827

814828
def test_get(self):
829+
if self.wantobjects:
830+
conv = lambda x: x
831+
else:
832+
conv = float
833+
815834
scale_width = self.scale.winfo_width()
816835
self.assertEqual(self.scale.get(scale_width, 0), self.scale['to'])
817836

818-
self.assertEqual(self.scale.get(0, 0), self.scale['from'])
837+
self.assertEqual(conv(self.scale.get(0, 0)), conv(self.scale['from']))
819838
self.assertEqual(self.scale.get(), self.scale['value'])
820839
self.scale['value'] = 30
821840
self.assertEqual(self.scale.get(), self.scale['value'])
@@ -825,32 +844,37 @@ def test_get(self):
825844

826845

827846
def test_set(self):
847+
if self.wantobjects:
848+
conv = lambda x: x
849+
else:
850+
conv = float
851+
828852
# set restricts the max/min values according to the current range
829-
max = self.scale['to']
853+
max = conv(self.scale['to'])
830854
new_max = max + 10
831855
self.scale.set(new_max)
832-
self.assertEqual(self.scale.get(), max)
833-
min = self.scale['from']
856+
self.assertEqual(conv(self.scale.get()), max)
857+
min = conv(self.scale['from'])
834858
self.scale.set(min - 1)
835-
self.assertEqual(self.scale.get(), min)
859+
self.assertEqual(conv(self.scale.get()), min)
836860

837861
# changing directly the variable doesn't impose this limitation tho
838862
var = tkinter.DoubleVar()
839863
self.scale['variable'] = var
840864
var.set(max + 5)
841-
self.assertEqual(self.scale.get(), var.get())
842-
self.assertEqual(self.scale.get(), max + 5)
865+
self.assertEqual(conv(self.scale.get()), var.get())
866+
self.assertEqual(conv(self.scale.get()), max + 5)
843867
del var
844868

845869
# the same happens with the value option
846870
self.scale['value'] = max + 10
847-
self.assertEqual(self.scale.get(), max + 10)
848-
self.assertEqual(self.scale.get(), self.scale['value'])
871+
self.assertEqual(conv(self.scale.get()), max + 10)
872+
self.assertEqual(conv(self.scale.get()), conv(self.scale['value']))
849873

850874
# nevertheless, note that the max/min values we can get specifying
851875
# x, y coords are the ones according to the current range
852-
self.assertEqual(self.scale.get(0, 0), min)
853-
self.assertEqual(self.scale.get(self.scale.winfo_width(), 0), max)
876+
self.assertEqual(conv(self.scale.get(0, 0)), min)
877+
self.assertEqual(conv(self.scale.get(self.scale.winfo_width(), 0)), max)
854878

855879
self.assertRaises(tkinter.TclError, self.scale.set, None)
856880

@@ -1204,6 +1228,8 @@ def test_bbox(self):
12041228
self.tv.column('test', width=50)
12051229
bbox_column0 = self.tv.bbox(children[0], 0)
12061230
root_width = self.tv.column('#0', width=None)
1231+
if not self.wantobjects:
1232+
root_width = int(root_width)
12071233
self.assertEqual(bbox_column0[0], bbox[0] + root_width)
12081234

12091235
# verify that bbox of a closed item is the empty string
@@ -1243,12 +1269,15 @@ def test_column(self):
12431269
# return a dict with all options/values
12441270
self.assertIsInstance(self.tv.column('#0'), dict)
12451271
# return a single value of the given option
1246-
self.assertIsInstance(self.tv.column('#0', width=None), int)
1272+
if self.wantobjects:
1273+
self.assertIsInstance(self.tv.column('#0', width=None), int)
12471274
# set a new value for an option
12481275
self.tv.column('#0', width=10)
12491276
# testing new way to get option value
1250-
self.assertEqual(self.tv.column('#0', 'width'), 10)
1251-
self.assertEqual(self.tv.column('#0', width=None), 10)
1277+
self.assertEqual(self.tv.column('#0', 'width'),
1278+
10 if self.wantobjects else '10')
1279+
self.assertEqual(self.tv.column('#0', width=None),
1280+
10 if self.wantobjects else '10')
12521281
# check read-only option
12531282
self.assertRaises(tkinter.TclError, self.tv.column, '#0', id='X')
12541283

@@ -1461,11 +1490,14 @@ def test_insert_item(self):
14611490
# unicode values
14621491
value = '\xe1ba'
14631492
item = self.tv.insert('', 'end', values=(value, ))
1464-
self.assertEqual(self.tv.item(item, 'values'), (value, ))
1465-
self.assertEqual(self.tv.item(item, values=None), (value, ))
1493+
self.assertEqual(self.tv.item(item, 'values'),
1494+
(value,) if self.wantobjects else value)
1495+
self.assertEqual(self.tv.item(item, values=None),
1496+
(value,) if self.wantobjects else value)
14661497

1467-
self.tv.item(item, values=list(self.tv.item(item, values=None)))
1468-
self.assertEqual(self.tv.item(item, values=None), (value, ))
1498+
self.tv.item(item, values=self.root.splitlist(self.tv.item(item, values=None)))
1499+
self.assertEqual(self.tv.item(item, values=None),
1500+
(value,) if self.wantobjects else value)
14691501

14701502
self.assertIsInstance(self.tv.item(item), dict)
14711503

@@ -1475,17 +1507,21 @@ def test_insert_item(self):
14751507

14761508
# item tags
14771509
item = self.tv.insert('', 'end', tags=[1, 2, value])
1478-
self.assertEqual(self.tv.item(item, tags=None), ('1', '2', value))
1510+
self.assertEqual(self.tv.item(item, tags=None),
1511+
('1', '2', value) if self.wantobjects else
1512+
'1 2 %s' % value)
14791513
self.tv.item(item, tags=[])
14801514
self.assertFalse(self.tv.item(item, tags=None))
14811515
self.tv.item(item, tags=(1, 2))
1482-
self.assertEqual(self.tv.item(item, tags=None), ('1', '2'))
1516+
self.assertEqual(self.tv.item(item, tags=None),
1517+
('1', '2') if self.wantobjects else '1 2')
14831518

14841519
# values with spaces
14851520
item = self.tv.insert('', 'end', values=('a b c',
14861521
'%s %s' % (value, value)))
14871522
self.assertEqual(self.tv.item(item, values=None),
1488-
('a b c', '%s %s' % (value, value)))
1523+
('a b c', '%s %s' % (value, value)) if self.wantobjects else
1524+
'{a b c} {%s %s}' % (value, value))
14891525

14901526
# text
14911527
self.assertEqual(self.tv.item(
@@ -1502,19 +1538,24 @@ def test_set(self):
15021538
self.assertEqual(self.tv.set(item), {'A': 'a', 'B': 'b'})
15031539

15041540
self.tv.set(item, 'B', 'a')
1505-
self.assertEqual(self.tv.item(item, values=None), ('a', 'a'))
1541+
self.assertEqual(self.tv.item(item, values=None),
1542+
('a', 'a') if self.wantobjects else 'a a')
15061543

15071544
self.tv['columns'] = ['B']
15081545
self.assertEqual(self.tv.set(item), {'B': 'a'})
15091546

15101547
self.tv.set(item, 'B', 'b')
15111548
self.assertEqual(self.tv.set(item, column='B'), 'b')
1512-
self.assertEqual(self.tv.item(item, values=None), ('b', 'a'))
1549+
self.assertEqual(self.tv.item(item, values=None),
1550+
('b', 'a') if self.wantobjects else 'b a')
15131551

15141552
self.tv.set(item, 'B', 123)
1515-
self.assertEqual(self.tv.set(item, 'B'), 123)
1516-
self.assertEqual(self.tv.item(item, values=None), (123, 'a'))
1517-
self.assertEqual(self.tv.set(item), {'B': 123})
1553+
self.assertEqual(self.tv.set(item, 'B'),
1554+
123 if self.wantobjects else '123')
1555+
self.assertEqual(self.tv.item(item, values=None),
1556+
(123, 'a') if self.wantobjects else '123 a')
1557+
self.assertEqual(self.tv.set(item),
1558+
{'B': 123} if self.wantobjects else {'B': '123'})
15181559

15191560
# inexistent column
15201561
self.assertRaises(tkinter.TclError, self.tv.set, item, 'A')

0 commit comments

Comments
 (0)