(self, element, name, headers, lst, datastore=None)
| 1494 | ) |
| 1495 | |
| 1496 | def _make_table(self, element, name, headers, lst, datastore=None): |
| 1497 | wrap = ttk.LabelFrame(element, text=name) |
| 1498 | tree = ttk.Treeview(wrap, column=headers, show="headings", height=4) |
| 1499 | vsb = ttk.Scrollbar(wrap, orient="vertical", command=tree.yview) |
| 1500 | vsb.pack(side="right", fill="y") |
| 1501 | tree.configure(yscrollcommand=vsb.set) |
| 1502 | for h in headers: |
| 1503 | tree.column(h, anchor=tk.CENTER) |
| 1504 | tree.heading(h, text=h) |
| 1505 | for i, row in enumerate(lst): |
| 1506 | tree.insert(parent="", index="end", iid=i, values=row) |
| 1507 | tree.pack(fill="x", padx=10, pady=10) |
| 1508 | |
| 1509 | def _update_datastore(): |
| 1510 | children = [tree.item(x, "values") for x in tree.get_children()] |
| 1511 | (self._data if datastore is None else datastore)[name] = children |
| 1512 | |
| 1513 | _update_datastore() |
| 1514 | |
| 1515 | class EditDialog(tksd.Dialog): |
| 1516 | def __init__(self, *args, **kwargs): |
| 1517 | self.data = {} |
| 1518 | self.initial_values = kwargs.pop("values", {}) |
| 1519 | self.success = False |
| 1520 | super(EditDialog, self).__init__(*args, **kwargs) |
| 1521 | |
| 1522 | def body(diag, frame): |
| 1523 | self._make_fields( |
| 1524 | frame, |
| 1525 | [(x, diag.initial_values.get(x, "")) for x in headers], |
| 1526 | datastore=diag.data, |
| 1527 | ) |
| 1528 | return frame |
| 1529 | |
| 1530 | def ok(self, *args, **kwargs): |
| 1531 | self.success = True |
| 1532 | super(EditDialog, self).ok(*args, **kwargs) |
| 1533 | |
| 1534 | def values(self): |
| 1535 | return tuple(x.get() for x in self.data.values()) |
| 1536 | |
| 1537 | def add(): |
| 1538 | dialog = EditDialog(title="Add", parent=tree) |
| 1539 | if dialog.success: |
| 1540 | i = len(tree.get_children()) |
| 1541 | tree.insert(parent="", index="end", iid=i, values=dialog.values()) |
| 1542 | _update_datastore() |
| 1543 | |
| 1544 | def edit(): |
| 1545 | selected = tree.focus() |
| 1546 | if not selected: |
| 1547 | return |
| 1548 | values = dict(zip(headers, tree.item(selected, "values"))) |
| 1549 | dialog = EditDialog(title="Edit", parent=tree, values=values) |
| 1550 | if dialog.success: |
| 1551 | tree.item(selected, values=dialog.values()) |
| 1552 | _update_datastore() |
| 1553 |
no test coverage detected