Skip to content

Commit

Permalink
Refactored KeyValueEntry, no change to API
Browse files Browse the repository at this point in the history
  • Loading branch information
slightlynybbled committed Jun 26, 2017
1 parent eed610f commit 0db9456
Show file tree
Hide file tree
Showing 3 changed files with 105 additions and 38 deletions.
26 changes: 22 additions & 4 deletions examples/key_value_test.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,11 +3,29 @@

root = tk.Tk()

kv = tk_tools.KeyValueEntry(root)
kv = tk_tools.KeyValueEntry(
root, ['key0', 'key1', 'key2'],
title='help',
unit_labels=['one', 'two', 'three'],
defaults=['', 'two', 'three'],
enables=[True, False, True],
on_change_callback=lambda: print('works')
)
kv.pack()

kv.add(key='key0')
kv.add(key='key1')
kv.add(key='key2')
kv.add_row('key3')
kv.add_row('key4', enable=False)
kv.add_row('key5', unit_label='five')

kv.load(
{
'key0': '1',
'key1': '2',
'key2': '3',
'key3': '4',
'key4': '5',
'key5': '6'
}
)

root.mainloop()
7 changes: 7 additions & 0 deletions readme.md
Original file line number Diff line number Diff line change
Expand Up @@ -235,3 +235,10 @@ def callback():

ssb.add_callback(callback)
```

# Log

## v0.2.0

* Added SmartSpinBox
* Changed `DropDown` to `SmartOptionMenu`
110 changes: 76 additions & 34 deletions tk_tools/groups.py
Original file line number Diff line number Diff line change
Expand Up @@ -250,60 +250,100 @@ def __init__(self, parent, keys: list, defaults: list=None,
padx=5, pady=5,
**options)

self.defaults = defaults
# some checks before proceeding
if defaults:
if len(keys) != len(defaults):
raise ValueError('unit_labels length does not match keys length')
if unit_labels:
if len(keys) != len(unit_labels):
raise ValueError('unit_labels length does not match keys length')
if enables:
if len(keys) != len(enables):
raise ValueError('enables length does not match keys length')

row_offset = 0
columns = 3 if unit_labels else 2
self.keys = []
self.values = []
self.defaults = []
self.unit_labels = []
self.enables = []
self.callback = on_change_callback

if title:
if title is not None:
self.title = tk.Label(self, text=title)
self.title.grid(row=row_offset, column=0, columnspan=columns)
row_offset += 1
self.title.grid(row=0, column=0, columnspan=3)
else:
self.title = None

def callback(event):
on_change_callback()
for i in range(len(keys)):
self.add_row(
key=keys[i],
default=defaults[i] if defaults else None,
unit_label=unit_labels[i] if unit_labels else None,
enable=enables[i] if enables else None
)

self.keys = []
self.values = []
self.units = []
for i, key in enumerate(keys):
label = tk.Label(self, text=key)
label.grid(row=row_offset, column=0, sticky='E')
self.keys.append(label)
def add_row(self, key, default=None, unit_label=None, enable=None):
"""
Add a single row and re-draw as necessary
:param key: the name and dict accessor
:param default: the default value
:param unit_label: the label that should be applied at the right of the entry
:param enable: the 'enabled' state (defaults to true)
:return:
"""
self.keys.append(tk.Label(self, text=key))

self.defaults.append(default)
self.unit_labels.append(tk.Label(self, text=unit_label if unit_label else ''))
self.enables.append(enable)
self.values.append(tk.Entry(self))

entry = tk.Entry(self)
entry.grid(row=row_offset, column=1)
self.values.append(entry)
row_offset = 1 if self.title is not None else 0

if self.defaults:
entry.insert(0, self.defaults[i])
for i in range(len(self.keys)):
self.keys[i].grid_forget()

if enables:
if not enables[i]:
entry.config(state='disabled')
self.keys[i].grid(row=row_offset, column=0, sticky='e')
self.values[i].grid(row=row_offset, column=1)

if unit_labels:
unit = tk.Label(self, text=unit_labels[i])
unit.grid(row=row_offset, column=2, sticky='W')
self.units.append(unit)
if self.unit_labels[i]:
self.unit_labels[i].grid(row=row_offset, column=3, sticky='w')

if self.defaults[i]:
self.values[i].config(state=tk.NORMAL)
self.values[i].delete(0, tk.END)
self.values[i].insert(0, self.defaults[i])

if on_change_callback:
entry.bind('<Return>', callback)
entry.bind('<Tab>', callback)
if self.enables[i] in [True, None]:
self.values[i].config(state=tk.NORMAL)
elif self.enables[i] is False:
self.values[i].config(state=tk.DISABLED)

row_offset += 1

# strip <Return> and <Tab> bindings, add callbacks to all entries
self.values[i].unbind('<Return>')
self.values[i].unbind('<Tab>')

if self.callback is not None:
def callback(event):
self.callback()

self.values[i].bind('<Return>', callback)
self.values[i].bind('<Tab>', callback)

def reset(self):
"""
Clears all entries
:return: None
"""
for i, entry in enumerate(self.values):
entry.delete(0, tk.END)
for i in range(len(self.values)):
self.values[i].delete(0, tk.END)

if self.defaults is not None:
entry.insert(0, self.defaults[i])
if self.defaults[i] is not None:
self.values[i].insert(0, self.defaults[i])

def change_enables(self, enables_list: list):
"""
Expand All @@ -316,6 +356,8 @@ def change_enables(self, enables_list: list):
for i, entry in enumerate(self.values):
if enables_list[i]:
entry.config(state=tk.NORMAL)
else:
entry.config(state=tk.DISABLED)

def load(self, data: dict):
"""
Expand Down

0 comments on commit 0db9456

Please sign in to comment.