Merge pull request #1885 from PySimpleGUI/Dev-latest

Fix for Tree element not returning keys.  Was really messed up. ROWS …
This commit is contained in:
PySimpleGUI 2019-08-27 14:02:34 -04:00 committed by GitHub
commit 780a19f3a9
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 52 additions and 16 deletions

View File

@ -1,5 +1,5 @@
#!/usr/bin/python3 #!/usr/bin/python3
version = __version__ = "4.4.0.2 Unreleased Version" version = __version__ = "4.4.0.3 Unreleased Version"
# 888888ba .d88888b oo dP .88888. dP dP dP # 888888ba .d88888b oo dP .88888. dP dP dP
@ -4669,6 +4669,8 @@ class Tree(Element):
self.RightClickMenu = right_click_menu self.RightClickMenu = right_click_menu
self.RowHeight = row_height self.RowHeight = row_height
self.IconList = {} self.IconList = {}
self.IdToKey = {'':''}
self.KeyToID = {'':''}
super().__init__(ELEM_TYPE_TREE, text_color=text_color, background_color=background_color, font=font, pad=pad, super().__init__(ELEM_TYPE_TREE, text_color=text_color, background_color=background_color, font=font, pad=pad,
key=key, tooltip=tooltip, visible=visible) key=key, tooltip=tooltip, visible=visible)
@ -4683,7 +4685,8 @@ class Tree(Element):
""" """
selections = self.TKTreeview.selection() selections = self.TKTreeview.selection()
self.SelectedRows = [x for x in selections] # self.SelectedRows = [x for x in selections]
self.SelectedRows = [self.IdToKey[x] for x in selections]
if self.ChangeSubmits: if self.ChangeSubmits:
MyForm = self.ParentForm MyForm = self.ParentForm
if self.Key is not None: if self.Key is not None:
@ -4701,7 +4704,6 @@ class Tree(Element):
:param node: (TreeData) The node to insert. Will insert all nodes from starting point downward, recursively :param node: (TreeData) The node to insert. Will insert all nodes from starting point downward, recursively
""" """
# print(f'Inserting {node.key} under parent {node.parent}')
if node.key != '': if node.key != '':
if node.icon: if node.icon:
try: try:
@ -4710,17 +4712,22 @@ class Tree(Element):
else: else:
photo = tk.PhotoImage(file=node.icon) photo = tk.PhotoImage(file=node.icon)
node.photo = photo node.photo = photo
self.TKTreeview.insert(node.parent, 'end', node.key, text=node.text, values=node.values, id = self.TKTreeview.insert(self.KeyToID[node.parent], 'end', iid=None, text=node.text,
open=self.ShowExpanded, image=node.photo) values=node.values, open=self.ShowExpanded, image=node.photo)
self.IdToKey[id] = node.key
self.KeyToID[node.key] = id
except: except:
self.photo = None self.photo = None
else: else:
self.TKTreeview.insert(node.parent, 'end', node.key, text=node.text, values=node.values, id = self.TKTreeview.insert(self.KeyToID[node.parent], 'end', iid=None, text=node.text,
open=self.ShowExpanded) values=node.values, open=self.ShowExpanded)
self.IdToKey[id] = node.key
self.KeyToID[node.key] = id
for node in node.children: for node in node.children:
self.add_treeview_data(node) self.add_treeview_data(node)
def Update(self, values=None, key=None, value=None, text=None, icon=None, visible=None): def Update(self, values=None, key=None, value=None, text=None, icon=None, visible=None):
""" """
Changes some of the settings for the Tree Element. Must call `Window.Read` or `Window.Finalize` prior Changes some of the settings for the Tree Element. Must call `Window.Read` or `Window.Finalize` prior
@ -4742,25 +4749,36 @@ class Tree(Element):
self.TKTreeview.delete(i) self.TKTreeview.delete(i)
children = self.TKTreeview.get_children() children = self.TKTreeview.get_children()
self.TreeData = values self.TreeData = values
self.IdToKey = {'': ''}
self.KeyToID = {'': ''}
self.add_treeview_data(self.TreeData.root_node) self.add_treeview_data(self.TreeData.root_node)
self.SelectedRows = [] self.SelectedRows = []
if key is not None: if key is not None:
item = self.TKTreeview.item(key) for id in self.IdToKey.keys():
if key == self.IdToKey[id]:
break
else:
id = None
print('** Key not found **')
else:
id = None
if id:
# item = self.TKTreeview.item(id)
if value is not None: if value is not None:
self.TKTreeview.item(key, values=value) self.TKTreeview.item(id, values=value)
if text is not None: if text is not None:
self.TKTreeview.item(key, text=text) self.TKTreeview.item(id, text=text)
if icon is not None: if icon is not None:
try: try:
if type(icon) is bytes: if type(icon) is bytes:
photo = tk.PhotoImage(data=icon) photo = tk.PhotoImage(data=icon)
else: else:
photo = tk.PhotoImage(file=icon) photo = tk.PhotoImage(file=icon)
self.TKTreeview.item(key, image=photo) self.TKTreeview.item(id, image=photo)
self.IconList[key] = photo # save so that it's not deleted (save reference) self.IconList[key] = photo # save so that it's not deleted (save reference)
except: except:
pass pass
item = self.TKTreeview.item(key) # item = self.TKTreeview.item(id)
if visible is False: if visible is False:
self.TKTreeview.pack_forget() self.TKTreeview.pack_forget()
elif visible is True: elif visible is True:
@ -6146,6 +6164,14 @@ Window.CloseNonBlocking = Window.Close
# ------------------------- A fake Element... the Pad Element ------------------------- # # ------------------------- A fake Element... the Pad Element ------------------------- #
def Sizer(h_pixels=0, v_pixels=0): def Sizer(h_pixels=0, v_pixels=0):
"""
"Pushes" out the size of whatever it is placed inside of. This includes Columns, Frames, Tabs and Windows
:param h_pixels: (int) number of horizontal pixels
:param v_pixels: (int) number of vertical pixels
:return: (Column) A column element that has a pad setting set according to parameters
"""
return Column([[]], pad=((h_pixels,0),(v_pixels,0))) return Column([[]], pad=((h_pixels,0),(v_pixels,0)))
# ------------------------- FOLDER BROWSE Element lazy function ------------------------- # # ------------------------- FOLDER BROWSE Element lazy function ------------------------- #
@ -7452,6 +7478,7 @@ def PackFormIntoFrame(form, containing_frame, toplevel_form):
AddMenuItem(top_menu, menu[1], element) AddMenuItem(top_menu, menu[1], element)
element.TKRightClickMenu = top_menu element.TKRightClickMenu = top_menu
element.TKColFrame.bind('<Button-3>', element._RightClickMenuCallback) element.TKColFrame.bind('<Button-3>', element._RightClickMenuCallback)
row_should_expand = True
# ------------------------- Pane element ------------------------- # # ------------------------- Pane element ------------------------- #
if element_type == ELEM_TYPE_PANE: if element_type == ELEM_TYPE_PANE:
bd = element.BorderDepth if element.BorderDepth is not None else border_depth bd = element.BorderDepth if element.BorderDepth is not None else border_depth
@ -7723,7 +7750,7 @@ def PackFormIntoFrame(form, containing_frame, toplevel_form):
element.TKEntry.configure(background=element.BackgroundColor) element.TKEntry.configure(background=element.BackgroundColor)
if text_color is not None and text_color != COLOR_SYSTEM_DEFAULT: if text_color is not None and text_color != COLOR_SYSTEM_DEFAULT:
element.TKEntry.configure(fg=text_color) element.TKEntry.configure(fg=text_color)
element.TKEntry.pack(side=tk.LEFT, padx=elementpad[0], pady=elementpad[1], expand=True, fill='x') element.TKEntry.pack(side=tk.LEFT, padx=elementpad[0], pady=elementpad[1], expand=True, fill=tk.X)
if element.Visible is False: if element.Visible is False:
element.TKEntry.pack_forget() element.TKEntry.pack_forget()
if element.Focus is True or (toplevel_form.UseDefaultFocus and not focus_set): if element.Focus is True or (toplevel_form.UseDefaultFocus and not focus_set):
@ -7739,6 +7766,8 @@ def PackFormIntoFrame(form, containing_frame, toplevel_form):
AddMenuItem(top_menu, menu[1], element) AddMenuItem(top_menu, menu[1], element)
element.TKRightClickMenu = top_menu element.TKRightClickMenu = top_menu
element.TKEntry.bind('<Button-3>', element._RightClickMenuCallback) element.TKEntry.bind('<Button-3>', element._RightClickMenuCallback)
row_should_expand = True
# ------------------------- COMBOBOX element ------------------------- # # ------------------------- COMBOBOX element ------------------------- #
elif element_type == ELEM_TYPE_INPUT_COMBO: elif element_type == ELEM_TYPE_INPUT_COMBO:
max_line_len = max([len(str(l)) for l in element.Values]) if len(element.Values) else 0 max_line_len = max([len(str(l)) for l in element.Values]) if len(element.Values) else 0
@ -8025,6 +8054,7 @@ def PackFormIntoFrame(form, containing_frame, toplevel_form):
element.TooltipObject = ToolTip(element.TKRadio, text=element.Tooltip, timeout=DEFAULT_TOOLTIP_TIME) element.TooltipObject = ToolTip(element.TKRadio, text=element.Tooltip, timeout=DEFAULT_TOOLTIP_TIME)
# ------------------------- SPIN element ------------------------- # # ------------------------- SPIN element ------------------------- #
elif element_type == ELEM_TYPE_INPUT_SPIN: elif element_type == ELEM_TYPE_INPUT_SPIN:
element = element # type: Spin
width, height = element_size width, height = element_size
width = 0 if auto_size_text else element_size[0] width = 0 if auto_size_text else element_size[0]
element.TKStringVar = tk.StringVar() element.TKStringVar = tk.StringVar()
@ -8069,6 +8099,7 @@ def PackFormIntoFrame(form, containing_frame, toplevel_form):
row_should_expand = True row_should_expand = True
# ------------------------- IMAGE element ------------------------- # # ------------------------- IMAGE element ------------------------- #
elif element_type == ELEM_TYPE_IMAGE: elif element_type == ELEM_TYPE_IMAGE:
element = element # type: Image
if element.Filename is not None: if element.Filename is not None:
photo = tk.PhotoImage(file=element.Filename) photo = tk.PhotoImage(file=element.Filename)
elif element.Data is not None: elif element.Data is not None:
@ -8197,7 +8228,7 @@ def PackFormIntoFrame(form, containing_frame, toplevel_form):
labeled_frame = element.Widget = tk.LabelFrame(tk_row_frame, text=element.Title, relief=element.Relief) labeled_frame = element.Widget = tk.LabelFrame(tk_row_frame, text=element.Title, relief=element.Relief)
element.TKFrame = labeled_frame element.TKFrame = labeled_frame
PackFormIntoFrame(element, labeled_frame, toplevel_form) PackFormIntoFrame(element, labeled_frame, toplevel_form)
labeled_frame.pack(side=tk.LEFT, padx=elementpad[0], pady=elementpad[1]) labeled_frame.pack(side=tk.LEFT, padx=elementpad[0], pady=elementpad[1], fill=tk.BOTH, expand=True)
if not element.Visible: if not element.Visible:
labeled_frame.pack_forget() labeled_frame.pack_forget()
if element.BackgroundColor != COLOR_SYSTEM_DEFAULT and element.BackgroundColor is not None: if element.BackgroundColor != COLOR_SYSTEM_DEFAULT and element.BackgroundColor is not None:
@ -8220,6 +8251,7 @@ def PackFormIntoFrame(form, containing_frame, toplevel_form):
AddMenuItem(top_menu, menu[1], element) AddMenuItem(top_menu, menu[1], element)
element.TKRightClickMenu = top_menu element.TKRightClickMenu = top_menu
labeled_frame.bind('<Button-3>', element._RightClickMenuCallback) labeled_frame.bind('<Button-3>', element._RightClickMenuCallback)
row_should_expand=True
# ------------------------- Tab element ------------------------- # # ------------------------- Tab element ------------------------- #
elif element_type == ELEM_TYPE_TAB: elif element_type == ELEM_TYPE_TAB:
element = element # type: Tab element = element # type: Tab
@ -8516,11 +8548,15 @@ def PackFormIntoFrame(form, containing_frame, toplevel_form):
else: else:
photo = tk.PhotoImage(file=node.icon) photo = tk.PhotoImage(file=node.icon)
node.photo = photo node.photo = photo
treeview.insert(node.parent, 'end', node.key, text=node.text, values=node.values, id = treeview.insert(element.KeyToID[node.parent], 'end', iid=None, text=node.text, values=node.values,
open=element.ShowExpanded, image=node.photo) open=element.ShowExpanded, image=node.photo)
element.IdToKey[id] = node.key
element.KeyToID[node.key] = id
else: else:
treeview.insert(node.parent, 'end', node.key, text=node.text, values=node.values, id = treeview.insert(element.KeyToID[node.parent], 'end', iid=None, text=node.text, values=node.values,
open=element.ShowExpanded) open=element.ShowExpanded)
element.IdToKey[id] = node.key
element.KeyToID[node.key] = id
for node in node.children: for node in node.children:
add_treeview_data(node) add_treeview_data(node)