erste Versuche für die Gui

This commit is contained in:
2024-01-10 13:46:36 +01:00
parent e249a4c750
commit 32146a0419
2 changed files with 257 additions and 0 deletions
+251
View File
@@ -0,0 +1,251 @@
import tkinter as tk
from tkinter import ttk
#import logging
#logger = logging.getLogger(__name__)
red_ids = ( '400102274', '400102275', '400102190', '400102198',
'400102161', '400102277', '400102163', '400102278',
'400102282', '400102284', '400102195', 'MA0000008',
'MA0000004', '929055170', '400102267', '400102235',
'400102236', 'MA0000006', '400102237', '400102238',
'400102239', '400102268', '829416159', '924031058',
'924031081', '822064091', '822066199', '822066200')
parent_children_mapping = {'400102196': ['400102125', '400102126', '400102130',
'400102161', '400102163', '400102165',
'400102166', '400102167', '400102168',
'400102190', '400102195', '400102198',
'400102246', '400102247', '400102267',
'400102272', '400102274', '400102275',
'400102277', '400102278', '400102282',
'400102284', '400102417', '720002003',
'721001034', '821114025', '822064091',
'822066085', '822996075', '829416061',
'829516004', '911021113', '911021181',
'911021259', '911091054', '911091096',
'911091097', '911251013', '912011009',
'919050006', '924031058',
'924031081'],
'400102282': ['822066026', '822066089', '919010052'],
'400102195': [ '822066075', '822066216',
'822066154', '822066101', '822064090',
'822066196', '400102129', '822066217',
'822066160', '822066215', '913041045',
'913011009', '911011057', '822064035',
'925011006', '911091041', '913051040',
'911021112', '911021166', '825006003',
'912041005', '911011014', '911011009',
'911021144', '911021001', '913011016',
'929055170', '913011010', '911021035',
'829416065', '712000151',
'712000100'],
'822066075': ['822066157', '822066162', '911261023'],
'822066162': [ '822064013'],
'822066196': ['MA0000008'],
'822066160': ['MA0000004'],
'822064035': ['822066065'],
'822064093': ['822066204', '822066205', '822066206', '822066207', '822066208'],
'822066220': ['924031033'],
'822064091': ['822066212', '822064093', '822066220',
'822066200', '912011010', '911021156',
'822066201', '911071027', '913011109',
'911011070', '913011001', '710005021',
'919010055', '720000008', '720000007'],
'400102267': ['400102235', '829416159', '829416077',
'829416079', '911021260', '911021147',
'911251014'],
'400102235': ['400102236', '400102237', '400102238',
'400102239', '400102268', '911021143',
'911021054', '911021055'],
'400102236': ['MA0000006'],
'829416159': ['829416089'],
'400102130': ['400102142'],
'821116004': ['822026004'],
'400102168': ['821116001'],
'821114025': ['911081007', '821116053'],
'400102167': ['821116004']}
""" using the MVC Pattern
- The model is responsible for managing the data of the application. It
receives user input from the controller.
- The view renders presentation of the model in a particular format.
- The controller responds to the user input and performs interactions on the
data model objects. The controller receives the input, optionally validates
it and then passes the input to the model.
"""
class Model():
def __init__(self):
pass
def set_tree_data(self, red_ids, parent_children_mapping):
self.red_ids = red_ids
self.parent_children_mapping = parent_children_mapping
def get_red_ids(self):
return self.red_ids
def get_parent_children(self):
return self.parent_children_mapping
def load():
pass
def save():
pass
class Controller():
def __init__(self):
pass
class View():
def __init__(self):
pass
class TreeView():
def __init__(self, frame):
# a treeview
self.tree = ttk.Treeview(frame)
# TODO hier anstatt root die Statistik rein schreiben.
self.tree.heading('#0', text='root', anchor=tk.W)
def set_red_ids(self, red_ids):
self.red_ids = red_ids
def set_parent_children(self, parent_children_mapping):
self.parent_children_mapping = parent_children_mapping
def clear(self):
self.tree.clipboard_clear()
def create(self):
# adding data of first column after root
pool = set()
for parent,children in self.parent_children_mapping.items():
if parent not in pool:
self.tree.insert('', tk.END, text=parent, iid=parent, open=True)
pool.add(parent)
cn = children
# sortiere die Zahlen im Baum immer aufsteigend
cn.sort(reverse=True)
for child_id in cn:
if child_id not in pool:
pool.add(child_id)
if child_id not in self.red_ids: rowtags = ('good')
else: rowtags = ('missing')
self.tree.insert('', tk.END, text=child_id, iid=child_id, tags=rowtags, open=True)
#self.tree.move(child_id, parent, 0)
# einmal über alles gehen und alle keys an die richtige Stelle schieben
for parent,children in self.parent_children_mapping.items():
for child_id in children:
self.tree.move(child_id, parent, 0)
# https://www.askpython.com/python-modules/tkinter/tkinter-colors
#self.tree.tag_configure('good', background='LawnGreen')
self.tree.tag_configure('good', background='white')
self.tree.tag_configure('missing', background='red')
# place the Treeview widget on the root window
self.tree.grid(row=0, column=0, sticky=tk.NSEW)
class PanedWindow():
"""Hauptfenster zweiteilen, um die Grösse rechts oder links zu verschieben"""
def __init__(self, frame):
self.pw = ttk.PanedWindow(frame, orient=tk.HORIZONTAL)
# Left listbox
left_list = tk.Listbox(frame)
left_list.pack(side=tk.LEFT)
self.pw.add(left_list)
self.left_list = left_list
# Right listbox
right_list = tk.Listbox(frame)
right_list.pack(side=tk.LEFT)
self.pw.add(right_list)
self.right_list = right_list
def get_handle(self):
return self.pw
def get_left(self):
return self.left_list
def get_right(self):
return self.right_list
class App():
def __init__(self, root):
self.root = root
self.root.geometry('500x700')
style = ttk.Style(self.root)
style.theme_use('classic')
# style.configure('Error.TLabel', foreground='white')
# style.configure('Error.TLabel', background='red')
# style.configure('Error.TLabel', font=('Helvetica', 12))
# style.configure('Error.TLabel', padding=(10, 10))
# paned window
self.pw = PanedWindow(self.root)
self.tv = TreeView(self.root)
left_list = self.pw.get_left()
right_list = self.pw.get_right()
# left_list.pack(side=tk.LEFT)
# right_list.pack(side=tk.LEFT)
# place the panedwindow on the root window
pw = self.pw.get_handle()
pw.pack(fill=tk.BOTH, expand=True)
message = 'This is an error message!'
label = ttk.Label(right_list, text=message, style='Error.TLabel')
label.pack(expand=True)
def set_tree_data(self, red_ids, parent_children_mapping):
self.red_ids = red_ids
self.parent_children_mapping = parent_children_mapping
self.tv.set_red_ids(self.red_ids)
self.tv.set_parent_children(self.parent_children_mapping)
self.tv.create()
def mainloop(self):
self.root.mainloop()
# class Navbar(tk.Frame): ...
# class Toolbar(tk.Frame): ...
# class Statusbar(tk.Frame): ...
# class Main(tk.Frame): ...
# class MainApp(tk.Frame):
# def __init__(self, parent, *args, **kwargs):
# tk.Frame.__init__(self, parent, *args, **kwargs)
# self.statusbar = Statusbar(self, ...)
# self.toolbar = Toolbar(self, ...)
# self.navbar = Navbar(self, ...)
# self.main = Main(self, ...)
# self.statusbar.pack(side="bottom", fill="x")
# self.toolbar.pack(side="top", fill="x")
# self.navbar.pack(side="left", fill="y")
# self.main.pack(side="right", fill="both", expand=True)
if __name__ == "__main__":
#logging.basicConfig(level=logging.DEBUG)
model = Model()
model.set_tree_data(red_ids, parent_children_mapping)
controller = Controller()
root = tk.Tk()
app = App(root)
app.set_tree_data(model.get_red_ids(), model.get_parent_children())
app.mainloop()