-
-
Notifications
You must be signed in to change notification settings - Fork 31.7k
tkinter - Treeview - .selection_add and selection_toggle #70574
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Comments
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 These two lines of workaround code do work however. 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. import tkinter as tk
from tkinter import ttk
root = tk.Tk()
tree = ttk.Treeview(root)
tree.pack()
tree.insert('', 1, iid='a b', text='id with space')
for item in tree.get_children():
print(item)
#tree.selection_add(item) # fail
#tree.selection_toggle(item) # fail
#tree.selection_set(item) # fail
#tree.selection_remove(item) # fail
tree.selection('add', item) # fail getting 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_toggle
self.selection("toggle", items)
File "C:\Programs\Python35\lib\tkinter\ttk.py", line 1395, in selection
return self.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 def selection(self, selop=None, items=None):
"""If selop is not specified, returns selected items."""
if isinstance(items, str): # new
items = (items,)
return self.tk.call(self._w, "selection", selop, items) |
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. |
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): if len(items) == 1: # Remove after deprecation.
item0 = items[0]
if not isinstance(items[0], isinstance(str)):
raise DeprecationWarning(
<level arg>
"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 Revise test accordingly. |
New changeset 0885477fecfd by Serhiy Storchaka in branch '3.5': New changeset d1c0bc1d0625 by Serhiy Storchaka in branch 'default': New changeset ac7c10f5e36e by Serhiy Storchaka in branch '2.7': |
Thank you Terry. Opened bpo-27319 for changing the signature of selection methods. |
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. |
Note: these values reflect the state of the issue at the time it was migrated and might not reflect the current state.
Show more details
GitHub fields:
bugs.python.org fields:
The text was updated successfully, but these errors were encountered: