You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
tkinter - Treeview - .selection_add and selection_toggle #70574
Id's with spaces in them causes a crash when using the .selection* methods Treeview. Version of ttk.py "0.3.1" dated 12/6/2015. Traceback line numbers are 1415 then 1395
Either of these lines of code, where the item id is "2009 Report.pdf" crash
allParents = oTree.get_children()
for id in allParents:
oTree.selection_add(id)
# oTree.selection_toggle(id)
These two lines of workaround code do work however.
oTree.selection_add('"' + id + '"')
# oTree.selection_toggle('"' + id + '"')
Note that so far all other places in dealing with the item id's have no issue when there are spaces in them.
The 3.5 version of 2015 Dec 6 is 3.5.1. A traceback is not a crash for the purpose of this tracker.
It is generally a good idea to mention OS, OS version, and Tk Version. (IDLE displays TkVersion in Help => About IDLE.) However, on Win 10 (8.6.4), I was able to reproduce with all four of the .selection_xyz(items) methods, which are all specializations of the .selection(op, items) methods.
a b
Traceback (most recent call last):
File "F:\Python\mypy\tem.py", line 10, in <module>
tree.selection_toggle(item)
File "C:\Programs\Python35\lib\tkinter\ttk.py", line 1415, in selection_toggleself.selection("toggle", items)
File "C:\Programs\Python35\lib\tkinter\ttk.py", line 1395, in selectionreturnself.tk.call(self._w, "selection", selop, items)
_tkinter.TclError: Item a not found
tkinter
These are the only Treeview methods in which a single argument can be multiple items. The doc string and doc do not define the form of 'items'. The unofficial but generally helpful doc, http://infohost.nmt.edu/tcc/help/pubs/tkinter/web/ttk-Treeview.html says "The argument may be either a single iid or a sequence of iids." I would expect sequence mean a tuple of strings, not space-separated fields in a string (a tcl sequence).
The .delete and .detach methods have signature '*items', meaning that each item is passed as a separate argument. The methods them pass the tuple of strings to tk. This should have been the signature of the selection methods.
Putting a single string in a tuple solves the problem, as in.
tree.selection('add', (item,))
My suggested fix is to add a statement to .selection
defselection(self, selop=None, items=None):
"""If selop is not specified, returns selected items."""ifisinstance(items, str): # newitems= (items,)
returnself.tk.call(self._w, "selection", selop, items)
LGTM, but after applying to all 3, leave open (or open new issue) to replace patch in 3.6 (before beta 1).
Change signature to *items. That will automatically make a single string become a len 1 tuple. For selection (list the 4 selops and) add a note. "For back compatibility, one may also pass a single tuple (or list?) of items." and Version Changed. For 4 derivatives, 'See selection.' In the code, instead add (untested):
iflen(items) ==1: # Remove after deprecation.item0=items[0]
ifnotisinstance(items[0], isinstance(str)):
raiseDeprecationWarning(
<levelarg>"The option of passing multiple items as a tuple ""rather than as multiple items is deprecated and ""will be removed in 2020 or later.")
items=items0# or more processing if lists were allowed
It looks like some testing code was inadvertently committed in the 2.7 branch fix causing only the Treeview testcases to be executed when test_ttk_gui_only is run. (I noticed this because a testcase was failing on other branches but not 2.7 although the tests are virtually identical.) PR 12014 fixes this.
Activity
gbarnabic commentedon Feb 18, 2016
Id's with spaces in them causes a crash when using the .selection* methods Treeview. Version of ttk.py "0.3.1" dated 12/6/2015. Traceback line numbers are 1415 then 1395
Either of these lines of code, where the item id is "2009 Report.pdf" crash
allParents = oTree.get_children()
for id in allParents:
oTree.selection_add(id)
# oTree.selection_toggle(id)
These two lines of workaround code do work however.
oTree.selection_add('"' + id + '"')
# oTree.selection_toggle('"' + id + '"')
Note that so far all other places in dealing with the item id's have no issue when there are spaces in them.
terryjreedy commentedon Feb 20, 2016
The 3.5 version of 2015 Dec 6 is 3.5.1. A traceback is not a crash for the purpose of this tracker.
It is generally a good idea to mention OS, OS version, and Tk Version. (IDLE displays TkVersion in Help => About IDLE.) However, on Win 10 (8.6.4), I was able to reproduce with all four of the .selection_xyz(items) methods, which are all specializations of the .selection(op, items) methods.
getting
tkinter
These are the only Treeview methods in which a single argument can be multiple items. The doc string and doc do not define the form of 'items'. The unofficial but generally helpful doc, http://infohost.nmt.edu/tcc/help/pubs/tkinter/web/ttk-Treeview.html says "The argument may be either a single iid or a sequence of iids." I would expect sequence mean a tuple of strings, not space-separated fields in a string (a tcl sequence).
The .delete and .detach methods have signature '*items', meaning that each item is passed as a separate argument. The methods them pass the tuple of strings to tk. This should have been the signature of the selection methods.
Putting a single string in a tuple solves the problem, as in.
My suggested fix is to add a statement to .selection
serhiy-storchaka commentedon Feb 24, 2016
Here is the patch with tests.
But I like the idea to make the selection_*() methods conforming with the delete() and detach() methods in 3.6.
terryjreedy commentedon Jun 13, 2016
LGTM, but after applying to all 3, leave open (or open new issue) to replace patch in 3.6 (before beta 1).
Change signature to *items. That will automatically make a single string become a len 1 tuple. For selection (list the 4 selops and) add a note. "For back compatibility, one may also pass a single tuple (or list?) of items." and Version Changed. For 4 derivatives, 'See selection.' In the code, instead add (untested):
Revise test accordingly.
python-dev commentedon Jun 14, 2016
New changeset 0885477fecfd by Serhiy Storchaka in branch '3.5':
Issue bpo-26386: Fixed ttk.TreeView selection operations with item id's
https://hg.python.org/cpython/rev/0885477fecfd
New changeset d1c0bc1d0625 by Serhiy Storchaka in branch 'default':
Issue bpo-26386: Fixed ttk.TreeView selection operations with item id's
https://hg.python.org/cpython/rev/d1c0bc1d0625
New changeset ac7c10f5e36e by Serhiy Storchaka in branch '2.7':
Issue bpo-26386: Fixed ttk.TreeView selection operations with item id's
https://hg.python.org/cpython/rev/ac7c10f5e36e
serhiy-storchaka commentedon Jun 14, 2016
Thank you Terry.
Opened bpo-27319 for changing the signature of selection methods.
ned-deily commentedon Feb 24, 2019
New changeset 72ff2f7 by Ned Deily in branch '2.7':
bpo-26386: Re-enable missing widget testcases in test_ttk_guionly. (GH-12014)
72ff2f7
ned-deily commentedon Feb 24, 2019
It looks like some testing code was inadvertently committed in the 2.7 branch fix causing only the Treeview testcases to be executed when test_ttk_gui_only is run. (I noticed this because a testcase was failing on other branches but not 2.7 although the tests are virtually identical.) PR 12014 fixes this.