import tkinter as tk from tkinter import ttk from tkinter import filedialog import os import re #import logging #logger = logging.getLogger(__name__) def OnMouseWheel(self,event): self.scrollbar1.yview("scroll",event.delta,"units") return "break" class AllFrames(): """ enthält alle gleichen Methoden für die Widgets in der rechte Spalte """ def __init__(self, nrow=0): self.set_start_row(nrow) self._controller = None self._text_width = 40 self._entry_text_width = 45 self._combo_width = 42 def get_entry_text_width(self): return self._entry_text_width def get_combo_width(self): return self._combo_width def get_text_width(self): return self._text_width def get_rows(self): """gibt die Anzahl der von diesem Widget belegten Zeilen zurück""" return self.rownum def set_start_row(self, nrow): """setzt für diesen Frame die Anfangszeile""" if nrow < 0: raise Exception("this row can not be set") self.rownum = nrow def set_controller(self, controller): self._controller = controller def get_controller(self): return self._controller def callback(self, key, value): """ruft den Controller und damit die Businesslogic auf, dass dieser key gerade in die Oberfläche gesetzt wurde""" controller = self.get_controller() if controller: controller.callback(key, value) class TreeView(): def __init__(self, frame, nrow=0): # a treeview self.tree = ttk.Treeview(frame, height=65) # 'height' steuert Anzahl der sichtbaren Zeilen im Baum self.tree.grid(row=nrow, column=0, sticky=tk.NSEW) # add a scrollbar scrollbar = ttk.Scrollbar(frame, orient='vertical', command=self.tree.yview) self.tree.configure(yscroll=scrollbar.set) scrollbar.grid(row=nrow, column=1, sticky='ns') #self.tree.bind('<>', self.item_selected) # Einfachklick self.tree.bind('', self.item_selected) # Doppelklick: self.trid2sivasId = dict() def set_heading_text(self, parent_children_mapping, red_ids): done_items = set() undone_items = set() for parent,children in parent_children_mapping.items(): if parent is None: pass elif parent in red_ids: undone_items.add(parent) else: done_items.add(parent) for c in children: if c in red_ids: undone_items.add(c) else: done_items.add(c) num_done = len(done_items) num_undone = len(undone_items) if num_done + num_undone == 0: percentage = 0 else: percentage = round(num_done / (num_done + num_undone) * 100, 1) heading = "{percent}% ({done} ✔, {undone} ☐)".format(percent=percentage, done=num_done, undone=num_undone) self.tree.heading('#0', text=heading, anchor=tk.W) def set_controller(self, controller): self._controller = controller def refresh(self, parent_children_mapping, red_ids, orange_ids): self.clear() self.set_heading_text(parent_children_mapping, red_ids) self.create(parent_children_mapping, red_ids, orange_ids) def clear(self): for c in self.tree.get_children(): self.tree.delete(c) def _has_childs(self, sid, parent_children_mapping): '''gibt zurück ob sivas-id ein Zwischenknoten eines Baume ist, also kein Blatt hat''' return True if sid in parent_children_mapping else False def create(self, parent_children_mapping, red_ids, orange_ids): pool = dict() for parent, children in parent_children_mapping.items(): # parent erzeugen, falls es diese nicht schon gibt (check der pool ids) if parent is None: parent_id = None elif parent not in pool: if parent not in red_ids: rowtags = ('good') elif parent in orange_ids: rowtags = ('orange') else: rowtags = ('missing') parent_id = self.tree.insert('', tk.END, text=parent, tags=rowtags, open=True) self.trid2sivasId[parent_id] = parent # merken für Doppelklick pool[parent] = parent_id else: parent_id = pool[parent] for child in children: if child not in red_ids: rowtags = ('good') elif child in orange_ids: rowtags = ('orange') else: rowtags = ('missing') if self._has_childs(child, parent_children_mapping) == True: # wenn das Objekt ein Kind hat, könnte es bereits erzeugt worden sein if child not in pool: child_id = self.tree.insert('', tk.END, text=child, tags=rowtags, open=True) pool[child] = child_id self.trid2sivasId[child_id] = child # merken für Doppelklick else: child_id = pool[child] else: # die Blätter des Baumes kann man bedenkenlos immer bauen. Diese können redundante Texte haben. child_id = self.tree.insert('', tk.END, text=child, tags=rowtags, open=True) pool[child] = child_id # hier werden die keys - sivas Nummern auch überschrieben self.trid2sivasId[child_id] = child # merken der eindeutigen Zuordnung für den späteren Doppelklick if parent_id is not None: self.tree.move(child_id, parent_id, 'end') # 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('yellow', background='yellow') self.tree.tag_configure('orange', background='orange') self.tree.tag_configure('missing', background='red') def data_from_model(self): parent_children_mapping = self._controller.get_parent_children() red_ids = self._controller.get_red_ids() orange_ids = self._controller.get_orange_ids(red_ids) self.refresh(parent_children_mapping, red_ids, orange_ids) def item_selected(self, event): """callback of TK if an item in the tree has been selected """ trid = self.tree.selection()[0] # trage die neue ID ins Modell ein cid = self.trid2sivasId[trid] self._controller.set_current_item_id(cid) class LeftFrameAsm(AllFrames): def __init__(self, frame, nrow=0): AllFrames.__init__(self, nrow) self.frame = frame self.build_widgets() def build_widgets(self): frame = self.frame self.rownum = AllFrames.get_rows(self) col_left = 0 # Baugruppennummer self.asm_label = ttk.Label(frame, text="Baugruppennummer:" ) self.asm_label.grid(column=col_left, row=self.rownum, sticky=tk.W, padx=3, pady=3) self.rownum += 1 self.asm_number = tk.StringVar() asm_entry = ttk.Entry(frame, textvariable=self.asm_number, font=("Calibri",15)) asm_entry.grid(column=col_left, row=self.rownum, sticky=tk.W, padx=3, pady=3) self.rownum += 1 #search_iconpath = os.path.join(configs.get_cfg_path(), 'images', 'search.png') #search_icon = tk.PhotoImage(file=search_iconpath) # Resizing image to fit on button #photoimage = search_icon.subsample(3, 3) asm_search_button = ttk.Button( frame, text="Suche", #image=photoimage, compound = tk.LEFT, command=lambda: self.callback("cb_suche_asm", self.asm_number.get()) ) asm_search_button.grid(column=col_left, row=self.rownum, sticky=tk.EW, padx=3, pady=3) self.rownum += 1 asm_loadlocal_button = ttk.Button( frame, text="Lade lokal", #image=photoimage, compound = tk.LEFT, command=lambda: self.callback("cb_ladelokal_asm", self.asm_number.get()) ) asm_loadlocal_button.grid(column=col_left, row=self.rownum, sticky=tk.EW, padx=3, pady=3) self.rownum += 1 def get_data(self): return { "asm_id": self.asm_number.get(), } def data_from_model(self): self.clear() data = self.get_controller().get_all_gui_data() if 'asm_id' in data: self.asm_number.set(data["asm_id"]) def set_states(self): # not yet implemented. Not used pass def highlight_labels(self, labels): # not yet implemented. Not used pass def reset_labels(self): # not yet implemented. Not used pass def clear(self): # not yet implemented. Not used pass class RightFrameLabels(AllFrames): def __init__(self, frame, nrow=0): AllFrames.__init__(self, nrow) self.frame = frame self.build_widgets() def build_widgets(self): frame = self.frame self.rownum = AllFrames.get_rows(self) col_left = 0 # Teilenummer self.teilenummer_label = ttk.Label(frame, text="Teilenummer:", foreground='blue') self.teilenummer_label.grid(column=col_left, row=self.rownum, sticky=tk.W, padx=3, pady=3) self.teilenummer_text = tk.StringVar() teilenummer_entry = ttk.Entry(frame, textvariable=self.teilenummer_text, font=("Calibri",15), state="readonly") teilenummer_entry.grid(column=col_left+1, row=self.rownum, sticky=tk.W, padx=3, pady=3) teilenummer_entry.bind('<>', lambda event:self.callback("cb_teilenummer", self.teilenummer_text.get())) self.rownum += 1 separator2 = ttk.Separator(frame, orient='horizontal') separator2.grid(column=col_left, columnspan=3, row=self.rownum, sticky=tk.EW, padx=3, pady=3) self.rownum += 1 def get_data(self): return { "teilenummer": self.teilenummer_text.get(), } def data_from_model(self): self.clear() data = self.get_controller().get_all_gui_data() if 'teilenummer' in data: self.teilenummer_text.set(data["teilenummer"]) def set_states(self): data = self.get_controller().get_gui_states() if 'teilenummer' in data: self.teilenummer_text["state"] = data['teilenummer'] def highlight_labels(self, labels): if "Teilenummer" in labels: self.teilenummer_label.configure(foreground='red') def reset_labels(self): self.teilenummer_label.configure(foreground='blue') def clear(self): self.teilenummer_text.set("") class RightFramePDM(AllFrames): def __init__(self, frame, nrow=0): AllFrames.__init__(self, nrow) self.frame = frame self.build_widgets() def build_widgets(self): frame = self.frame self.rownum = AllFrames.get_rows(self) col_left = 0 # Datenbank Schulung oder Produktiv self.datenbank_label = ttk.Label(frame, text="Datenbank:", foreground='blue' ) self.datenbank_label.grid(column=col_left, row=self.rownum, sticky=tk.W, padx=3, pady=3) self.datenbank = tk.StringVar() self.datenbank_prod = ttk.Radiobutton(frame, text="Produktiv", variable=self.datenbank, value="Produktiv", command=lambda: self.callback('cb_datenbank_neu', self.datenbank.get())) self.datenbank_prod .grid(column=col_left+2, row=self.rownum, sticky=tk.W, padx=3, pady=3) self.rownum += 1 self.datenbank_schul = ttk.Radiobutton(frame, text="Schulung", variable=self.datenbank, value="Schulung", command=lambda: self.callback('cb_datenbank_neu', self.datenbank.get())) self.datenbank_schul .grid(column=col_left+2, row=self.rownum, sticky=tk.W, padx=3, pady=3) self.rownum += 1 # pdmkategorie self.pdmkategorie_label = ttk.Label(frame, text="PDM-Kategorie:", foreground='blue' ) self.pdmkategorie_label.grid(column=col_left, row=self.rownum, sticky=tk.W, padx=3, pady=3) self.pdm_category = tk.StringVar() self.pdmkategorie_combo = ttk.Combobox(frame, textvariable=self.pdm_category, width=AllFrames.get_combo_width(self)) self.pdmkategorie_combo['state'] = 'readonly' self.pdmkategorie_combo.bind('<>', lambda event:self.callback('cb_pdm_kategorie_neu', self.pdm_category.get())) self.pdmkategorie_combo.grid(column=col_left+2, row=self.rownum, sticky=tk.W, padx=3, pady=3) self.rownum += 1 # Neuaufbau self.neuaufbau_label = ttk.Label(frame, text="Neuaufbau:") self.neuaufbau_label.grid(column=col_left, row=self.rownum, sticky=tk.W, padx=3, pady=3) self.neuaufbau = tk.BooleanVar() self.neuaufbau_checkbutton = ttk.Checkbutton(frame, #text='ja', variable=self.neuaufbau, command=lambda:self.callback("cb_neuaufbau", self.neuaufbau.get()), onvalue=True, offvalue=False) self.neuaufbau_checkbutton.grid(column=col_left+2, row=self.rownum, sticky=tk.W, padx=3, pady=3) self.rownum += 1 # aus Halbzeug self.halbzeug_label = ttk.Label(frame, text="aus Halbzeug:") self.halbzeug_label.grid(column=col_left, row=self.rownum, sticky=tk.W, padx=3, pady=3) self.aus_halbzeug_neu = tk.BooleanVar() self.aushalbzeug_checkbutton = ttk.Checkbutton(frame, #text='neu', variable=self.aus_halbzeug_neu, command=lambda:self.callback("cb_aus_halbzeug_neu", self.aus_halbzeug_neu.get()), onvalue=True, offvalue=False) self.aushalbzeug_checkbutton.grid(column=col_left+2, row=self.rownum, sticky=tk.W, padx=3, pady=3) self.rownum += 1 # Halbzeugnummer self.halbzeugnummer_label = ttk.Label(frame, text="Halbzeugnummer:" ) self.halbzeugnummer_label.grid(column=col_left, row=self.rownum, sticky=tk.W, padx=3, pady=3) self.halbzeugnummer_neu = tk.StringVar() self.halbzeugnummer_neu_entry = ttk.Entry(frame, textvariable=self.halbzeugnummer_neu, width=AllFrames.get_entry_text_width(self)) self.halbzeugnummer_neu_entry.grid(column=col_left+2, row=self.rownum, sticky=tk.W, padx=3, pady=3) self.rownum += 1 # Halbzeuglänge self.halbzeuglaenge_label = ttk.Label(frame, text="Halbzeuglänge:" ) self.halbzeuglaenge_label.grid(column=col_left, row=self.rownum, sticky=tk.W, padx=3, pady=3) self.halbzeuglaenge_neu = tk.StringVar() self.halbzeuglaenge_neu_entry = ttk.Entry(frame, textvariable=self.halbzeuglaenge_neu, width=AllFrames.get_entry_text_width(self)) self.halbzeuglaenge_neu_entry.grid(column=col_left+2, row=self.rownum, sticky=tk.W, padx=3, pady=3) self.rownum += 1 # HalbzeugOberfläche self.halbzeugoberflaeche_label = ttk.Label(frame, text="Halbzeugoberfläche:") self.halbzeugoberflaeche_label.grid(column=col_left, row=self.rownum, sticky=tk.W, padx=3, pady=3) self.halbzeugoberflaeche_neu = tk.StringVar() self.halbzeugoberflaeche_combo = ttk.Combobox(frame, textvariable=self.halbzeugoberflaeche_neu, width=AllFrames.get_combo_width(self)) self.halbzeugoberflaeche_combo['state'] = 'readonly' self.halbzeugoberflaeche_combo.bind('<>', lambda event:self.callback('cb_halbzeugoberflaeche', self.halbzeugoberflaeche_neu.get())) self.halbzeugoberflaeche_combo.grid(column=col_left+2, row=self.rownum, sticky=tk.W, padx=3, pady=3) self.rownum += 1 # HalbzeugFarbe self.halbzeugfarbe_label = ttk.Label(frame, text="Halbzeugfarbe:", foreground='steel blue' ) self.halbzeugfarbe_label.grid(column=col_left, row=self.rownum, sticky=tk.W, padx=3, pady=3) self.halbzeugfarbe_neu = tk.StringVar() self.halbzeugfarbe_combo = ttk.Combobox(frame, textvariable=self.halbzeugfarbe_neu, width=AllFrames.get_combo_width(self)) self.halbzeugfarbe_combo['state'] = 'readonly' self.halbzeugfarbe_combo.bind('<>', lambda event:self.callback('cb_halbzeugfarbe', self.halbzeugfarbe_neu.get())) self.halbzeugfarbe_combo.grid(column=col_left+2, row=self.rownum, sticky=tk.W, padx=3, pady=3) self.rownum += 1 # Lebenszyklusstatus #lstatus = configs.Allgemein.get_options("Lebenszyklus") # Serie, Prototyp self.lebenszyklusstatus_label = ttk.Label(frame, text="Lebenszyklusstatus:", foreground='blue' ) self.lebenszyklusstatus_label.grid(column=col_left, row=self.rownum, sticky=tk.W, padx=3, pady=3) self.lebenszyklus_status_neu = tk.StringVar() self.lebenszyklusstatus_combo = ttk.Combobox(frame, textvariable=self.lebenszyklus_status_neu, width=AllFrames.get_combo_width(self)) self.lebenszyklusstatus_combo['state'] = 'readonly' self.lebenszyklusstatus_combo.bind('<>', lambda event:self.callback('cb_lebenszyklus_status_neu', self.lebenszyklus_status_neu.get())) self.lebenszyklusstatus_combo.grid(column=col_left+2, row=self.rownum, sticky=tk.W, padx=3, pady=3) self.rownum += 1 # 3D Model Filesearch self.model3d_label = ttk.Label(frame, text="3D-Modell:", foreground='blue') self.model3d_label.grid(column=col_left, row=self.rownum, sticky=tk.W, padx=3, pady=3) self.model3d_neu = tk.StringVar() self.model3d_combo = ttk.Combobox(frame, textvariable=self.model3d_neu, justify='right', width=AllFrames.get_combo_width(self)) self.model3d_combo['state'] = 'readonly' self.model3d_combo.bind('<>', lambda event:self.callback('cb_3Dmodel_neu', self.model3d_neu.get())) self.model3d_combo.grid(column=col_left+1, columnspan=2, row=self.rownum, sticky=tk.EW, padx=3, pady=3) self.rownum += 1 #lambda: self.callback("cb_speichern", None) self.suche3d_button = ttk.Button(frame, text="Durchsuchen..", command=lambda: self.callback("cb_3dsuchen", None)) self.suche3d_button.grid(column=col_left+2, row=self.rownum, sticky=tk.EW) self.rownum += 1 def get_data(self): return { "datenbank": self.datenbank.get(), "pdm_kategorie_neu": self.pdm_category.get(), "neuaufbau": self.neuaufbau.get(), "aus_halbzeug_neu": self.aus_halbzeug_neu.get(), "halbzeugnummer_neu": self.halbzeugnummer_neu.get(), "halbzeuglaenge_neu": self.halbzeuglaenge_neu.get(), "halbzeugoberflaeche_neu": self.halbzeugoberflaeche_neu.get(), "halbzeugfarbe_neu": self.halbzeugfarbe_neu.get(), "lebenszyklus_status_neu": self.lebenszyklus_status_neu.get(), "model3d_neu": self.model3d_neu.get(), # ab hier die Dropdowns der Oberfläche auslesen. "cb_pdm_kategorie_neu": self.pdmkategorie_combo['values'], "cb_lebenszyklus_status_neu": self.lebenszyklusstatus_combo['values'], "cb_halbzeugoberflaeche": self.halbzeugoberflaeche_combo['values'], "cb_halbzeugfarbe": self.halbzeugfarbe_combo['values'], "cb_3Dmodel_neu": self.model3d_combo['values'], } def data_from_model(self): self.clear() data = self.get_controller().get_all_gui_data() if 'datenbank' in data: self.datenbank.set(data["datenbank"]) if 'pdm_kategorie_neu' in data: self.pdm_category.set(data["pdm_kategorie_neu"]) if 'neuaufbau' in data: self.neuaufbau.set(data["neuaufbau"]) if 'halbzeugnummer_neu' in data: self.halbzeugnummer_neu.set(data["halbzeugnummer_neu"]) if 'halbzeuglaenge_neu' in data: self.halbzeuglaenge_neu.set(data["halbzeuglaenge_neu"]) if 'halbzeugoberflaeche_neu' in data: self.halbzeugoberflaeche_neu.set(data["halbzeugoberflaeche_neu"]) if 'halbzeugfarbe_neu' in data: self.halbzeugfarbe_neu.set(data["halbzeugfarbe_neu"]) if 'lebenszyklus_status_neu' in data: self.lebenszyklus_status_neu.set(data["lebenszyklus_status_neu"]) if 'model3d_neu' in data: self.model3d_neu.set(data["model3d_neu"]) if 'aus_halbzeug_neu' in data: self.aus_halbzeug_neu.set(data["aus_halbzeug_neu"]) # ab hier die Dropdowns der Oberfläche befüllen. if 'cb_pdm_kategorie_neu' in data: self.pdmkategorie_combo['values'] = data["cb_pdm_kategorie_neu"] if 'cb_lebenszyklus_status_neu' in data: self.lebenszyklusstatus_combo['values'] = data["cb_lebenszyklus_status_neu"] if 'cb_halbzeugoberflaeche' in data: self.halbzeugoberflaeche_combo['values'] = data["cb_halbzeugoberflaeche"] if 'cb_halbzeugfarbe' in data: self.halbzeugfarbe_combo['values'] = data["cb_halbzeugfarbe"] if 'cb_3Dmodel_neu' in data: self.model3d_combo['values'] = data["cb_3Dmodel_neu"] def set_states(self): data = self.get_controller().get_gui_states() # if 'datenbank' in data: # self.datenbank['state'] = data["datenbank"] if 'neuaufbau' in data: self.neuaufbau_checkbutton['state'] = data["neuaufbau"] if 'halbzeugnummer_neu' in data: self.halbzeugnummer_neu_entry['state'] = data["halbzeugnummer_neu"] if 'halbzeuglaenge_neu' in data: self.halbzeuglaenge_neu_entry['state'] = data["halbzeuglaenge_neu"] if 'aus_halbzeug_neu' in data: self.aushalbzeug_checkbutton['state'] = data["aus_halbzeug_neu"] # ab hier die Dropdowns der Oberfläche if 'cb_pdm_kategorie_neu' in data: self.pdmkategorie_combo['state'] = data["cb_pdm_kategorie_neu"] if 'cb_lebenszyklus_status_neu' in data: self.lebenszyklusstatus_combo['state'] = data["cb_lebenszyklus_status_neu"] if 'cb_halbzeugoberflaeche' in data: self.halbzeugoberflaeche_combo['state'] = data["cb_halbzeugoberflaeche"] if 'cb_halbzeugfarbe' in data: self.halbzeugfarbe_combo['state'] = data["cb_halbzeugfarbe"] if 'cb_3Dmodel_neu' in data: self.model3d_combo['state'] = data["cb_3Dmodel_neu"] # buttons if 'cb_3dsuchen' in data: self.suche3d_button['state'] =data["cb_3dsuchen"] def highlight_labels(self, labels): if "Datenbank" in labels: self.datenbank_label.configure(foreground='red' ) if "PDM-Kategorie" in labels: self.pdmkategorie_label.configure(foreground='red' ) if "Neuaufbau" in labels: self.neuaufbau_label.configure(foreground='red' ) if "Halbzeugnummer" in labels: self.halbzeugnummer_label.configure(foreground='red' ) if "Halbzeugoberfläche" in labels: self.halbzeugoberflaeche_label.configure(foreground='red' ) if "Halbzeugfarbe" in labels: self.halbzeugfarbe_label.configure(foreground='red' ) if "Lebenszyklusstatus" in labels: self.lebenszyklusstatus_label.configure(foreground='red' ) if "3D-Modell" in labels: self.model3d_label.configure(foreground='red') def reset_labels(self): self.datenbank_label.configure(foreground='blue' ) self.pdmkategorie_label.configure(foreground='blue' ) self.neuaufbau_label.configure(foreground='black') self.halbzeugnummer_label.configure(foreground='black') self.halbzeugoberflaeche_label.configure(foreground='black') self.halbzeugfarbe_label.configure(foreground='steel blue' ) self.lebenszyklusstatus_label.configure(foreground='blue' ) self.model3d_label.configure(foreground='blue') def clear(self): self.datenbank.set('') self.pdm_category.set('') self.neuaufbau.set(False) self.aus_halbzeug_neu.set(False) self.halbzeugnummer_neu.set('') self.halbzeuglaenge_neu.set('') self.halbzeugoberflaeche_neu.set('') self.halbzeugfarbe_neu.set('') self.lebenszyklus_status_neu.set('') self.model3d_neu.set('') self.pdmkategorie_combo['values'] = '' self.halbzeugoberflaeche_combo['values'] = '' self.halbzeugfarbe_combo['values'] = '' self.lebenszyklusstatus_combo['values'] = '' self.model3d_combo['values'] = '' class RightFrameBezeichnung(AllFrames): def __init__(self, frame, nrow=0): AllFrames.__init__(self, nrow) self.frame = frame self.build_widgets() def build_widgets(self): frame = self.frame self.rownum = AllFrames.get_rows(self) col_left = 0 # Feld, SIVAS-Werte, Überschriebene Werte feld_label = ttk.Label(frame, text="Feld" ) feld_label.grid(column=col_left, row=self.rownum, sticky=tk.W, padx=3, pady=3) Sivas_label = ttk.Label(frame, text="SIVAS-Werte" ) Sivas_label.grid(column=col_left+1, row=self.rownum, sticky=tk.W, padx=3, pady=3) transwritten_label = ttk.Label(frame, text="Überschriebene Werte" ) transwritten_label.grid(column=col_left+2, row=self.rownum, sticky=tk.W, padx=3, pady=3) feld_label.configure(font=("Helvetica", 12)) Sivas_label.configure(font=("Helvetica",12)) transwritten_label.configure(font=("Helvetica",12)) self.rownum += 1 separator = ttk.Separator(frame, orient='horizontal') separator.grid(column=col_left, columnspan=3, row=self.rownum, sticky=tk.EW, padx=3, pady=3) self.rownum += 1 # Bezeichnung 1 self.bezeichnung1_label = ttk.Label(frame, text="Bezeichnung 1:", foreground='blue' ) self.bezeichnung1_label.grid(column=col_left, row=self.rownum, sticky=tk.W, padx=3, pady=3) self.bezeichnung1_sivas = tk.StringVar() self.bezeichnung1_entry = ttk.Entry(frame, textvariable=self.bezeichnung1_sivas, width=AllFrames.get_entry_text_width(self), font=("Calibri",10), state="readonly") self.bezeichnung1_entry.grid(column=col_left+1, row=self.rownum, sticky=tk.W, padx=3, pady=3) self.bezeichnung1_neu = tk.StringVar() self.bezeichnung1_neu.trace_add('write', callback=self.trace_bezeichnung_neu) self.bezeichnung1_neu_entry = ttk.Entry(frame, textvariable=self.bezeichnung1_neu, width=AllFrames.get_entry_text_width(self), font=("Calibri",10)) self.bezeichnung1_neu_entry.grid(column=col_left+2, row=self.rownum, sticky=tk.W, padx=3, pady=3) self.rownum += 1 # Bezeichnung 2 self.bezeichnung2_label = ttk.Label(frame, text="Bezeichnung 2:" ) self.bezeichnung2_label.grid(column=col_left, row=self.rownum, sticky=tk.W, padx=3, pady=3) self.bezeichnung2_sivas = tk.StringVar() bezeichnung2_entry = ttk.Entry(frame, textvariable=self.bezeichnung2_sivas, state="readonly", width=AllFrames.get_entry_text_width(self)) bezeichnung2_entry.grid(column=col_left+1, row=self.rownum, sticky=tk.W, padx=3, pady=3) self.rownum += 1 separator = ttk.Separator(frame, orient='horizontal') separator.grid(column=col_left, columnspan=3, row=self.rownum, sticky=tk.EW, padx=3, pady=3) self.rownum += 1 def trace_bezeichnung_neu(self, var, index, mode): """ Spezial: Bei zu langem Eintrag die Farbe des Textes auffällig machen """ text = self.bezeichnung1_neu.get() if len(text) < 51: self.bezeichnung1_neu_entry.configure(foreground='black') else: self.bezeichnung1_neu_entry.configure(foreground='red') def get_data(self): return { "bezeichnung1_sivas": self.bezeichnung1_sivas.get(), "bezeichnung1_neu": self.bezeichnung1_neu.get(), "bezeichnung2_sivas": self.bezeichnung2_sivas.get(), } def data_from_model(self): self.clear() data = self.get_controller().get_all_gui_data() if 'bezeichnung1_sivas' in data: self.bezeichnung1_sivas.set(data["bezeichnung1_sivas"]) if 'bezeichnung1_neu' in data: self.bezeichnung1_neu.set(data["bezeichnung1_neu"]) if 'bezeichnung2_sivas' in data: self.bezeichnung2_sivas.set(data["bezeichnung2_sivas"]) def set_states(self): data = self.get_controller().get_gui_states() if 'bezeichnung1_sivas' in data: self.bezeichnung1_sivas['state'] = data["bezeichnung1_sivas"] if 'bezeichnung1_neu' in data: self.bezeichnung1_neu['state'] = data["bezeichnung1_neu"] if 'bezeichnung2_sivas' in data: self.bezeichnung2_sivas['state'] = data["bezeichnung2_sivas"] def highlight_labels(self, labels): if "Bezeichnung 1" in labels: self.bezeichnung1_label.configure(foreground='blue') if "Bezeichnung 2" in labels: self.bezeichnung2_label.configure(foreground='red') def reset_labels(self): self.bezeichnung1_label.configure(foreground='blue') self.bezeichnung2_label.configure(foreground='black') def clear(self): self.bezeichnung1_sivas.set('') self.bezeichnung1_neu.set('') self.bezeichnung2_sivas.set('') class RightFrameHalbzeugOhneS(AllFrames): def __init__(self, frame, nrow=0): AllFrames.__init__(self, nrow) self.frame = frame self.build_widgets() def build_widgets(self): frame = self.frame self.rownum = AllFrames.get_rows(self) col_left = 0 # categories = configs.Allgemein.get_options("Kategorien") # ruestcodes = configs.Allgemein.get_options("Ruestcode") # Halbzeug ohne Sägeliste self.halbzeugOhneSaege_label = ttk.Label(frame, text="Halbzeug ohne Sägeliste:", foreground='blue' ) self.halbzeugOhneSaege_label.grid(column=col_left, row=self.rownum, sticky=tk.W, padx=3, pady=3) self.halbzeugOhneSaege_sivas = tk.StringVar() halbzeugOhneSaege_entry = ttk.Entry(frame, textvariable=self.halbzeugOhneSaege_sivas, state="readonly", width=AllFrames.get_entry_text_width(self)) halbzeugOhneSaege_entry.grid(column=col_left+1, row=self.rownum, sticky=tk.W, padx=3, pady=3) self.halbzeugOhneSaege_neu = tk.StringVar() self.halbzeugOhneSaege_neu_combo = ttk.Combobox(frame, textvariable=self.halbzeugOhneSaege_neu, width=AllFrames.get_combo_width(self)) self.halbzeugOhneSaege_neu_combo['values'] = ['ja','nein'] self.halbzeugOhneSaege_neu_combo['state'] = 'readonly' self.halbzeugOhneSaege_neu_combo.bind('<>', lambda event:self.callback('cb_halbzeugOhneSaege_neu', self.halbzeugOhneSaege_neu.get())) self.halbzeugOhneSaege_neu_combo.grid(column=col_left+2, row=self.rownum, sticky=tk.W, padx=3, pady=3) self.rownum += 1 # Rüstcode self.ruestcode_label = ttk.Label(frame, text="Rüstcode:", foreground='blue' ) self.ruestcode_label.grid(column=col_left, row=self.rownum, sticky=tk.W, padx=3, pady=3) self.ruestcode_sivas = tk.StringVar() ruestcode_entry = ttk.Entry(frame, textvariable=self.ruestcode_sivas, state="readonly", width=AllFrames.get_entry_text_width(self)) ruestcode_entry.grid(column=col_left+1, row=self.rownum, sticky=tk.W, padx=3, pady=3) self.ruestcode_neu = tk.StringVar() self.ruestcode_neu_combo = ttk.Combobox(frame, textvariable=self.ruestcode_neu, width=AllFrames.get_combo_width(self)) #self.ruestcode_neu_combo['values'] = ruestcodes self.ruestcode_neu_combo['state'] = 'readonly' self.ruestcode_neu_combo.bind('<>', lambda event:self.callback('cb_ruestcode_neu', self.ruestcode_neu.get())) self.ruestcode_neu_combo.grid(column=col_left+2, row=self.rownum, sticky=tk.W, padx=3, pady=3) self.rownum += 1 # Fertigungsart self.fertigungsart_label = ttk.Label(frame, text="Fertigungsart:", foreground='steel blue' ) self.fertigungsart_label.grid(column=col_left, row=self.rownum, sticky=tk.W, padx=3, pady=3) self.fertigungsart_sivas = tk.StringVar() fertigungsart_entry = ttk.Entry(frame, textvariable=self.fertigungsart_sivas, state="readonly", width=AllFrames.get_entry_text_width(self)) fertigungsart_entry.grid(column=col_left+1, row=self.rownum, sticky=tk.W, padx=3, pady=3) self.fertigungsart_neu = tk.StringVar() self.fertigungsart_neu_combo = ttk.Combobox(frame, textvariable=self.fertigungsart_neu, width=AllFrames.get_combo_width(self)) #self.fertigungsart_neu_combo['values'] = categories self.fertigungsart_neu_combo['state'] = 'readonly' self.fertigungsart_neu_combo.bind('<>', lambda event:self.callback('cb_fertigungsart_neu', self.fertigungsart_neu.get())) self.fertigungsart_neu_combo.grid(column=col_left+2, row=self.rownum, sticky=tk.W, padx=3, pady=3) self.rownum += 1 # Allgmeintoleranz self.allgemeintoleranz_label = ttk.Label(frame, text="Allgemeintoleranz:", foreground='steel blue' ) self.allgemeintoleranz_label.grid(column=col_left, row=self.rownum, sticky=tk.W, padx=3, pady=3) self.allgemeintoleranz_sivas = tk.StringVar() allgemeintoleranz_entry = ttk.Entry(frame, textvariable=self.allgemeintoleranz_sivas, state="readonly", width=AllFrames.get_entry_text_width(self)) allgemeintoleranz_entry.grid(column=col_left+1, row=self.rownum, sticky=tk.W, padx=3, pady=3) self.allgemeintoleranz_neu = tk.StringVar() self.allgemeintoleranz_neu_combo = ttk.Combobox(frame, textvariable=self.allgemeintoleranz_neu, width=AllFrames.get_combo_width(self)) #self.allgemeintoleranz_neu_combo['values'] = categories self.allgemeintoleranz_neu_combo['state'] = 'readonly' self.allgemeintoleranz_neu_combo.bind('<>', lambda event:self.callback('cb_allgemeintoleranz_neu', self.allgemeintoleranz_neu.get())) self.allgemeintoleranz_neu_combo.grid(column=col_left+2, row=self.rownum, sticky=tk.W, padx=3, pady=3) self.rownum += 1 # FOS-Gruppe self.fosGruppe_label = ttk.Label(frame, text="FOS-Gruppe:", foreground='blue' ) self.fosGruppe_label.grid(column=col_left, row=self.rownum, sticky=tk.W, padx=3, pady=3) self.fosGruppe_sivas = tk.StringVar() fosGruppe_entry = ttk.Entry(frame, textvariable=self.fosGruppe_sivas, state="readonly", width=AllFrames.get_entry_text_width(self)) fosGruppe_entry.grid(column=col_left+1, row=self.rownum, sticky=tk.W, padx=3, pady=3) self.fosGruppe_neu = tk.StringVar() self.fosGruppe_neu_combo = ttk.Combobox(frame, textvariable=self.fosGruppe_neu, width=AllFrames.get_combo_width(self)) #self.fosGruppe_neu_combo['values'] = categories self.fosGruppe_neu_combo['state'] = 'readonly' self.fosGruppe_neu_combo.bind('<>', lambda event:self.callback('cb_fosGruppe_neu', self.fosGruppe_neu.get())) self.fosGruppe_neu_combo.grid(column=col_left+2, row=self.rownum, sticky=tk.W, padx=3, pady=3) self.rownum += 1 # Kalulationsart self.kalkulationsart_label = ttk.Label(frame, text="Kalkulationsart:", foreground='blue' ) self.kalkulationsart_label.grid(column=col_left, row=self.rownum, sticky=tk.W, padx=3, pady=3) self.kalkulationsart_sivas = tk.StringVar() kalkulationsart_entry = ttk.Entry(frame, textvariable=self.kalkulationsart_sivas, state="readonly", width=AllFrames.get_entry_text_width(self)) kalkulationsart_entry.grid(column=col_left+1, row=self.rownum, sticky=tk.W, padx=3, pady=3) self.kalkulationsart_neu = tk.StringVar() self.kalkulationsart_neu_combo = ttk.Combobox(frame, textvariable=self.kalkulationsart_neu, width=AllFrames.get_combo_width(self)) #self.kalkulationsart_neu_combo['values'] = categories self.kalkulationsart_neu_combo['state'] = 'readonly' self.kalkulationsart_neu_combo.bind('<>', lambda event:self.callback('cb_kalkulationsart_neu', self.kalkulationsart_neu.get())) self.kalkulationsart_neu_combo.grid(column=col_left+2, row=self.rownum, sticky=tk.W, padx=3, pady=3) self.rownum += 1 separator = ttk.Separator(frame, orient='horizontal') separator.grid(column=col_left, columnspan=3, row=self.rownum, sticky=tk.EW, padx=3, pady=3) self.rownum += 1 def get_data(self): return { "halbzeugOhneSaege_sivas": self.halbzeugOhneSaege_sivas.get(), "halbzeugOhneSaege_neu": self.halbzeugOhneSaege_neu.get(), "ruestcode_sivas": self.ruestcode_sivas.get(), "ruestcode_neu": self.ruestcode_neu.get(), "fertigungsart_sivas": self.fertigungsart_sivas.get(), "fertigungsart_neu": self.fertigungsart_neu.get(), "allgemeintoleranz_sivas": self.allgemeintoleranz_sivas.get(), "allgemeintoleranz_neu": self.allgemeintoleranz_neu.get(), "fosGruppe_sivas": self.fosGruppe_sivas.get(), "fosGruppe_neu": self.fosGruppe_neu.get(), "kalkulationsart_sivas": self.kalkulationsart_sivas.get(), "kalkulationsart_neu": self.kalkulationsart_neu.get(), # ab hier die Dropdowns der Oberfläche auslesen "cb_halbzeugOhneSaege_neu" :self.halbzeugOhneSaege_neu_combo['values'], "cb_ruestcode_neu" :self.ruestcode_neu_combo['values'], "cb_fertigungsart_neu" :self.fertigungsart_neu_combo['values'], "cb_allgemeintoleranz_neu" :self.allgemeintoleranz_neu_combo['values'], "cb_fosGruppe_neu" :self.fosGruppe_neu_combo['values'], "cb_kalkulationsart_neu" :self.kalkulationsart_neu_combo['values'] } def data_from_model(self): self.clear() data = self.get_controller().get_all_gui_data() if 'halbzeugOhneSaege_sivas' in data: self.halbzeugOhneSaege_sivas.set(data["halbzeugOhneSaege_sivas"]) if 'halbzeugOhneSaege_neu' in data: self.halbzeugOhneSaege_neu.set(data["halbzeugOhneSaege_neu"]) if 'ruestcode_sivas' in data: self.ruestcode_sivas.set(data["ruestcode_sivas"]) if 'ruestcode_neu' in data: self.ruestcode_neu.set(data["ruestcode_neu"]) if 'fertigungsart_sivas' in data: self.fertigungsart_sivas.set(data["fertigungsart_sivas"]) if 'fertigungsart_neu' in data: self.fertigungsart_neu.set(data["fertigungsart_neu"]) if 'allgemeintoleranz_sivas' in data: self.allgemeintoleranz_sivas.set(data["allgemeintoleranz_sivas"]) if 'allgemeintoleranz_neu' in data: self.allgemeintoleranz_neu.set(data["allgemeintoleranz_neu"]) if 'fosGruppe_sivas' in data: self.fosGruppe_sivas.set(data["fosGruppe_sivas"]) if 'fosGruppe_neu' in data: self.fosGruppe_neu.set(data["fosGruppe_neu"]) if 'kalkulationsart_sivas' in data: self.kalkulationsart_sivas.set(data["kalkulationsart_sivas"]) if 'kalkulationsart_neu' in data: self.kalkulationsart_neu.set(data["kalkulationsart_neu"]) # ab hier die Dropdowns der Oberfläche befüllen. if 'cb_halbzeugOhneSaege_neu' in data: self.halbzeugOhneSaege_neu_combo['values'] = data['cb_halbzeugOhneSaege_neu'] if 'cb_ruestcode_neu' in data: self.ruestcode_neu_combo['values'] = data['cb_ruestcode_neu'] if 'cb_fertigungsart_neu' in data: self.fertigungsart_neu_combo['values'] = data['cb_fertigungsart_neu'] if 'cb_allgemeintoleranz_neu' in data: self.allgemeintoleranz_neu_combo['values'] = data['cb_allgemeintoleranz_neu'] if 'cb_fosGruppe_neu' in data: self.fosGruppe_neu_combo['values'] = data['cb_fosGruppe_neu'] if 'cb_kalkulationsart_neu' in data: self.kalkulationsart_neu_combo['values'] = data['cb_kalkulationsart_neu'] def set_states(self): data = self.get_controller().get_gui_states() if 'halbzeugOhneSaege_sivas' in data: self.halbzeugOhneSaege_sivas['state'] = data["halbzeugOhneSaege_sivas"] if 'halbzeugOhneSaege_neu' in data: self.halbzeugOhneSaege_neu['state'] = data["halbzeugOhneSaege_neu"] if 'ruestcode_sivas' in data: self.ruestcode_sivas['state'] = data["ruestcode_sivas"] if 'ruestcode_neu' in data: self.ruestcode_neu['state'] = data["ruestcode_neu"] if 'fertigungsart_sivas' in data: self.fertigungsart_sivas['state'] = data["fertigungsart_sivas"] if 'fertigungsart_neu' in data: self.fertigungsart_neu['state'] = data["fertigungsart_neu"] if 'allgemeintoleranz_sivas' in data: self.allgemeintoleranz_sivas['state'] = data["allgemeintoleranz_sivas"] if 'allgemeintoleranz_neu' in data: self.allgemeintoleranz_neu['state'] = data["allgemeintoleranz_neu"] if 'fosGruppe_sivas' in data: self.fosGruppe_sivas['state'] = data["fosGruppe_sivas"] if 'fosGruppe_neu' in data: self.fosGruppe_neu['state'] = data["fosGruppe_neu"] if 'kalkulationsart_sivas' in data: self.kalkulationsart_sivas['state'] = data["kalkulationsart_sivas"] if 'kalkulationsart_neu' in data: self.kalkulationsart_neu['state'] = data["kalkulationsart_neu"] # ab hier die Dropdowns der Oberfläche befüllen. if 'cb_halbzeugOhneSaege_neu' in data: self.halbzeugOhneSaege_neu_combo['state'] = data['cb_halbzeugOhneSaege_neu'] if 'cb_ruestcode_neu' in data: self.ruestcode_neu_combo['state'] = data['cb_ruestcode_neu'] if 'cb_fertigungsart_neu' in data: self.fertigungsart_neu_combo['state'] = data['cb_fertigungsart_neu'] if 'cb_allgemeintoleranz_neu' in data: self.allgemeintoleranz_neu_combo['state'] = data['cb_allgemeintoleranz_neu'] if 'cb_fosGruppe_neu' in data: self.fosGruppe_neu_combo['state'] = data['cb_fosGruppe_neu'] if 'cb_kalkulationsart_neu' in data: self.kalkulationsart_neu_combo['state'] = data['cb_kalkulationsart_neu'] def highlight_labels(self, labels): if "Halbzeug ohne Sägeliste" in labels: self.halbzeugOhneSaege_label.configure(foreground='red') if "Rüstcode" in labels: self.ruestcode_label.configure(foreground='red') if "Fertigungsart" in labels: self.fertigungsart_label.configure(foreground='red') if "Allgemeintoleranz" in labels: self.allgemeintoleranz_label.configure(foreground='red') if "FOS-Gruppe" in labels: self.fosGruppe_label.configure(foreground='red') if "Kalkulationsart" in labels: self.kalkulationsart_label.configure(foreground='red') def reset_labels(self): self.halbzeugOhneSaege_label.configure(foreground='blue') self.ruestcode_label.configure(foreground='blue' ) self.fertigungsart_label.configure(foreground='steel blue') self.allgemeintoleranz_label.configure(foreground='steel blue') self.fosGruppe_label.configure(foreground='blue') self.kalkulationsart_label.configure(foreground='blue') def clear(self): self.halbzeugOhneSaege_sivas.set('') self.halbzeugOhneSaege_neu.set('') self.ruestcode_sivas.set('') self.ruestcode_neu.set('') self.fertigungsart_sivas.set('') self.fertigungsart_neu.set('') self.allgemeintoleranz_sivas.set('') self.allgemeintoleranz_neu.set('') self.fosGruppe_sivas.set('') self.fosGruppe_neu.set('') self.kalkulationsart_sivas.set('') self.kalkulationsart_neu.set('') self.halbzeugOhneSaege_neu_combo['values'] = '' self.ruestcode_neu_combo['values'] = '' self.fertigungsart_neu_combo['values'] = '' self.allgemeintoleranz_neu_combo['values'] = '' self.fosGruppe_neu_combo['values'] = '' self.kalkulationsart_neu_combo['values'] = '' class RightFrameBeschaffungsart(AllFrames): def __init__(self, frame, nrow=0): AllFrames.__init__(self, nrow) self.frame = frame self.build_widgets() def build_widgets(self): frame = self.frame self.rownum = AllFrames.get_rows(self) col_left = 0 # Beschaffungsart self.beschaffungsart_label = ttk.Label(frame, text="Beschaffungsart:", foreground='blue' ) self.beschaffungsart_label.grid(column=col_left, row=self.rownum, sticky=tk.W, padx=3, pady=3) self.beschaffungsart_sivas = tk.StringVar() beschaffungsart_entry = ttk.Entry(frame, textvariable=self.beschaffungsart_sivas, state="readonly", width=AllFrames.get_entry_text_width(self)) beschaffungsart_entry.grid(column=col_left+1, row=self.rownum, sticky=tk.W, padx=3, pady=3) self.beschaffungsart_neu = tk.StringVar() self.beschaffungsart_combo = ttk.Combobox(frame, textvariable=self.beschaffungsart_neu, width=AllFrames.get_combo_width(self)) #self.beschaffungsart_combo['values'] = categories self.beschaffungsart_combo['state'] = 'readonly' self.beschaffungsart_combo.bind('<>', lambda event:self.callback('cb_beschaffungsart_neu', self.beschaffungsart_neu.get())) self.beschaffungsart_combo.grid(column=col_left+2, row=self.rownum, sticky=tk.W, padx=3, pady=3) self.rownum += 1 # Mengeneinheit self.mengeneinheit_label = ttk.Label(frame, text="Mengeneinheit:", foreground='blue' ) self.mengeneinheit_label.grid(column=col_left, row=self.rownum, sticky=tk.W, padx=3, pady=3) self.mengeneinheit_sivas = tk.StringVar() mengeneinheit_entry = ttk.Entry(frame, textvariable=self.mengeneinheit_sivas, state="readonly", width=AllFrames.get_entry_text_width(self)) mengeneinheit_entry.grid(column=col_left+1, row=self.rownum, sticky=tk.W, padx=3, pady=3) self.mengeneinheit_neu = tk.StringVar() self.mengeneinheit_combo = ttk.Combobox(frame, textvariable=self.mengeneinheit_neu, width=AllFrames.get_combo_width(self)) #self.mengeneinheit_combo['values'] = categories self.mengeneinheit_combo['state'] = 'readonly' self.mengeneinheit_combo.bind('<>', lambda event:self.callback('cb_mengeneinheit_neu', self.mengeneinheit_neu.get())) self.mengeneinheit_combo.grid(column=col_left+2, row=self.rownum, sticky=tk.W, padx=3, pady=3) self.rownum += 1 # Halbzeug self.halbzeug_label = ttk.Label(frame, text="Halbzeug:", foreground='blue' ) self.halbzeug_label.grid(column=col_left, row=self.rownum, sticky=tk.W, padx=3, pady=3) self.halbzeug_sivas = tk.StringVar() halbzeug_entry = ttk.Entry(frame, textvariable=self.halbzeug_sivas, state="readonly", width=AllFrames.get_entry_text_width(self)) halbzeug_entry.grid(column=col_left+1, row=self.rownum, sticky=tk.W, padx=3, pady=3) self.halbzeug_neu = tk.StringVar() self.halbzeug_combo = ttk.Combobox(frame, textvariable=self.halbzeug_neu, width=AllFrames.get_combo_width(self)) self.halbzeug_combo['values'] = ['ja','nein'] self.halbzeug_combo['state'] = 'readonly' self.halbzeug_combo.bind('<>', lambda event:self.callback('cb_halbzeug_neu', self.halbzeug_neu.get())) self.halbzeug_combo.grid(column=col_left+2, row=self.rownum, sticky=tk.W, padx=3, pady=3) self.rownum += 1 separator = ttk.Separator(frame, orient='horizontal') separator.grid(column=col_left, columnspan=3, row=self.rownum, sticky=tk.EW, padx=3, pady=3) self.rownum += 1 def get_data(self): return { "beschaffungsart_sivas": self.beschaffungsart_sivas.get(), "beschaffungsart_neu": self.beschaffungsart_neu.get(), "mengeneinheit_sivas": self.mengeneinheit_sivas.get(), "mengeneinheit_neu": self.mengeneinheit_neu.get(), "halbzeug_sivas": self.halbzeug_sivas.get(), "halbzeug_neu": self.halbzeug_neu.get(), # ab hier die Dropdowns der Oberfläche auslesen. "cb_beschaffungsart_neu": self.beschaffungsart_combo['values'], "cb_mengeneinheit_neu": self.mengeneinheit_combo['values'], "cb_halbzeug_neu": self.halbzeug_combo['values'], } def data_from_model(self): self.clear() data = self.get_controller().get_all_gui_data() if "beschaffungsart_sivas" in data: self.beschaffungsart_sivas.set(data["beschaffungsart_sivas"]) if "beschaffungsart_neu" in data: self.beschaffungsart_neu.set(data["beschaffungsart_neu"]) if "mengeneinheit_sivas" in data: self.mengeneinheit_sivas.set(data["mengeneinheit_sivas"]) if "mengeneinheit_neu" in data: self.mengeneinheit_neu.set(data["mengeneinheit_neu"]) if "halbzeug_sivas" in data: self.halbzeug_sivas.set(data["halbzeug_sivas"]) if "halbzeug_neu" in data: self.halbzeug_neu.set(data["halbzeug_neu"]) # ab hier die Dropdowns der Oberfläche befüllen. if "cb_beschaffungsart_neu" in data: self.beschaffungsart_combo['values'] = data["cb_beschaffungsart_neu"] if "cb_mengeneinheit_neu" in data: self.mengeneinheit_combo['values'] = data["cb_mengeneinheit_neu"] if "cb_halbzeug_neu" in data: self.halbzeug_combo['values'] = data["cb_halbzeug_neu"] def set_states(self): data = self.get_controller().get_gui_states() if "beschaffungsart_sivas" in data: self.beschaffungsart_sivas['state'] = data["beschaffungsart_sivas"] if "beschaffungsart_neu" in data: self.beschaffungsart_neu['state'] = data["beschaffungsart_neu"] if "mengeneinheit_sivas" in data: self.mengeneinheit_sivas['state'] = data["mengeneinheit_sivas"] if "mengeneinheit_neu" in data: self.mengeneinheit_neu['state'] = data["mengeneinheit_neu"] if "halbzeug_sivas" in data: self.halbzeug_sivas['state'] = data["halbzeug_sivas"] if "halbzeug_neu" in data: self.halbzeug_neu['state'] = data["halbzeug_neu"] # ab hier die Dropdowns der Oberfläche befüllen. if "cb_beschaffungsart_neu" in data: self.beschaffungsart_combo['state'] = data["cb_beschaffungsart_neu"] if "cb_mengeneinheit_neu" in data: self.mengeneinheit_combo['state'] = data["cb_mengeneinheit_neu"] if "cb_halbzeug_neu" in data: self.halbzeug_combo['state'] = data["cb_halbzeug_neu"] def highlight_labels(self, labels): if "Beschaffungsart" in labels: self.beschaffungsart_label.configure(foreground='red' ) if "Mengeneinheit" in labels: self.mengeneinheit_label.configure(foreground='red' ) if "Halbzeug" in labels: self.halbzeug_label.configure(foreground='red' ) def reset_labels(self): self.beschaffungsart_label.configure(foreground='blue' ) self.mengeneinheit_label.configure(foreground='blue' ) self.halbzeug_label.configure(foreground='blue' ) def clear(self): self.beschaffungsart_sivas.set('') self.beschaffungsart_neu.set('') self.mengeneinheit_sivas.set('') self.mengeneinheit_neu.set('') self.halbzeug_sivas.set('') self.halbzeug_neu.set('') self.beschaffungsart_combo['values'] = '' self.mengeneinheit_combo['values'] = '' self.halbzeug_combo['values'] = '' class RightFrameTOSGruppe(AllFrames): def __init__(self, frame, nrow=0): AllFrames.__init__(self, nrow) self.frame = frame self.build_widgets() def build_widgets(self): frame = self.frame self.rownum = AllFrames.get_rows(self) col_left = 0 # TOS-Gruppe self.tosgruppe_label = ttk.Label(frame, text="TOS-Gruppe:", foreground='blue' ) self.tosgruppe_label.grid(column=col_left, row=self.rownum, sticky=tk.W, padx=3, pady=3) self.tosgruppe_sivas = tk.StringVar() tosgruppe_entry = ttk.Entry(frame, textvariable=self.tosgruppe_sivas, state="readonly", width=AllFrames.get_entry_text_width(self)) tosgruppe_entry.grid(column=col_left+1, row=self.rownum, sticky=tk.W, padx=3, pady=3) self.tosgruppe_neu = tk.StringVar() tosgruppe_neu_entry = ttk.Entry(frame, textvariable=self.tosgruppe_neu, width=AllFrames.get_entry_text_width(self)) tosgruppe_neu_entry.grid(column=col_left+2, row=self.rownum, sticky=tk.W, padx=3, pady=3) self.rownum += 1 # Dispogruppe self.dispogruppe_label = ttk.Label(frame, text="Dispogruppe:", foreground='blue' ) self.dispogruppe_label.grid(column=col_left, row=self.rownum, sticky=tk.W, padx=3, pady=3) self.dispogruppe_sivas = tk.StringVar() dispogruppe_entry = ttk.Entry(frame, textvariable=self.dispogruppe_sivas, state="readonly", width=AllFrames.get_entry_text_width(self)) dispogruppe_entry.grid(column=col_left+1, row=self.rownum, sticky=tk.W, padx=3, pady=3) self.dispogruppe_neu = tk.StringVar() self.dispogruppe_neu_combo = ttk.Combobox(frame, textvariable=self.dispogruppe_neu, width=AllFrames.get_combo_width(self)) #self.dispogruppe_neu_combo['values'] = categories self.dispogruppe_neu_combo['state'] = 'readonly' self.dispogruppe_neu_combo.bind('<>', lambda event:self.callback('cb_dispogruppe_neu', self.dispogruppe_neu.get())) self.dispogruppe_neu_combo.grid(column=col_left+2, row=self.rownum, sticky=tk.W, padx=3, pady=3) self.rownum += 1 # Dispolaufgruppe self.dispolaufgruppe_label = ttk.Label(frame, text="Dispolaufgruppe:", foreground='blue' ) self.dispolaufgruppe_label.grid(column=col_left, row=self.rownum, sticky=tk.W, padx=3, pady=3) self.dispolaufgruppe_sivas = tk.StringVar() dispolaufgruppe_entry = ttk.Entry(frame, textvariable=self.dispolaufgruppe_sivas, state="readonly", width=AllFrames.get_entry_text_width(self)) dispolaufgruppe_entry.grid(column=col_left+1, row=self.rownum, sticky=tk.W, padx=3, pady=3) self.dispolaufgruppe_neu = tk.StringVar() self.dispolaufgruppe_neu_combo = ttk.Combobox(frame, textvariable=self.dispolaufgruppe_neu, width=AllFrames.get_combo_width(self)) #self.dispolaufgruppe_neu_combo['values'] = categories self.dispolaufgruppe_neu_combo['state'] = 'readonly' self.dispolaufgruppe_neu_combo.bind('<>', lambda event:self.callback('cb_dispolaufgruppe_neu', self.dispolaufgruppe_neu.get())) self.dispolaufgruppe_neu_combo.grid(column=col_left+2, row=self.rownum, sticky=tk.W, padx=3, pady=3) self.rownum += 1 # Ersatz für self.ersatzfuer_label = ttk.Label(frame, text="Ersatz für:" ) self.ersatzfuer_label.grid(column=col_left, row=self.rownum, sticky=tk.W, padx=3, pady=3) self.ersatzfuer_sivas = tk.StringVar() ersatzfuer_entry = ttk.Entry(frame, textvariable=self.ersatzfuer_sivas, state="readonly", width=AllFrames.get_entry_text_width(self)) ersatzfuer_entry.grid(column=col_left+1, row=self.rownum, sticky=tk.W, padx=3, pady=3) self.ersatzfuer_neu = tk.StringVar() ersatzfuer_neu_entry = ttk.Entry(frame, textvariable=self.ersatzfuer_neu, width=AllFrames.get_entry_text_width(self)) ersatzfuer_neu_entry.grid(column=col_left+2, row=self.rownum, sticky=tk.W, padx=3, pady=3) self.rownum += 1 # Ersetzt durch self.ersetztdurch_label = ttk.Label(frame, text="Ersetzt durch:" ) self.ersetztdurch_label.grid(column=col_left, row=self.rownum, sticky=tk.W, padx=3, pady=3) self.ersetztdurch_sivas = tk.StringVar() ersetztdurch_entry = ttk.Entry(frame, textvariable=self.ersetztdurch_sivas, state="readonly", width=AllFrames.get_entry_text_width(self)) ersetztdurch_entry.grid(column=col_left+1, row=self.rownum, sticky=tk.W, padx=3, pady=3) self.ersetztdurch_neu = tk.StringVar() ersetztdurch_neu_entry = ttk.Entry(frame, textvariable=self.ersetztdurch_neu, width=AllFrames.get_entry_text_width(self)) ersetztdurch_neu_entry.grid(column=col_left+2, row=self.rownum, sticky=tk.W, padx=3, pady=3) self.rownum += 1 # Ersetzt durch # Hersteller self.hersteller_label = ttk.Label(frame, text="Hersteller:" ) self.hersteller_label.grid(column=col_left, row=self.rownum, sticky=tk.W, padx=3, pady=3) self.hersteller_sivas = tk.StringVar() hersteller_entry = ttk.Entry(frame, textvariable=self.hersteller_sivas, state="readonly", width=AllFrames.get_entry_text_width(self)) hersteller_entry.grid(column=col_left+1, row=self.rownum, sticky=tk.W, padx=3, pady=3) self.hersteller_neu = tk.StringVar() a = self.hersteller_neu.get() self.hersteller_neu_combo = ttk.Combobox(frame, textvariable=self.hersteller_neu, width=AllFrames.get_combo_width(self)) self.hersteller_neu_combo['state'] = 'readonly' self.hersteller_neu_combo.bind('<>', lambda event:self.callback('cb_hersteller_neu', self.hersteller_neu.get())) self.hersteller_neu_combo.grid(column=col_left+2, row=self.rownum, sticky=tk.W, padx=3, pady=3) self.rownum += 1 # Hersteller Teilenummer self.herstteilenr_label = ttk.Label(frame, text="Hersteller Teilenummer:" ) self.herstteilenr_label.grid(column=col_left, row=self.rownum, sticky=tk.W, padx=3, pady=3) self.herstteilenr_sivas = tk.StringVar() self.herstteilenr_sivas_entry = ttk.Entry(frame, textvariable=self.herstteilenr_sivas, state="readonly", width=AllFrames.get_entry_text_width(self)) self.herstteilenr_sivas_entry.grid(column=col_left+1, row=self.rownum, sticky=tk.W, padx=3, pady=3) self.herstteilenr_neu = tk.StringVar() self.herstteilenr_neu_entry = ttk.Entry(frame, textvariable=self.herstteilenr_neu, width=AllFrames.get_entry_text_width(self)) self.herstteilenr_neu_entry.grid(column=col_left+2, row=self.rownum, sticky=tk.W, padx=3, pady=3) self.rownum += 1 # Ersetzt durch separator = ttk.Separator(frame, orient='horizontal') separator.grid(column=col_left, columnspan=3, row=self.rownum, sticky=tk.EW, padx=3, pady=3) self.rownum += 1 def get_data(self): return { "tosgruppe_neu": self.tosgruppe_neu.get(), "tosgruppe_sivas": self.tosgruppe_sivas.get(), "dispogruppe_neu": self.dispogruppe_neu.get(), "dispogruppe_sivas": self.dispogruppe_sivas.get(), "dispolaufgruppe_neu": self.dispolaufgruppe_neu.get(), "dispolaufgruppe_sivas": self.dispolaufgruppe_sivas.get(), "hersteller_neu": self.hersteller_neu.get(), "hersteller_sivas": self.hersteller_sivas.get(), "ersatzfuer_neu": self.ersatzfuer_neu.get(), "ersatzfuer_sivas": self.ersatzfuer_sivas.get(), "ersetztdurch_neu": self.ersetztdurch_neu.get(), "ersetztdurch_sivas": self.ersetztdurch_sivas.get(), "herstteilenr_sivas": self.herstteilenr_sivas.get(), "herstteilenr_neu": self.herstteilenr_neu.get(), # ab hier die Dropdowns der Oberfläche auslesen. "cb_dispogruppe_neu": self.dispogruppe_neu_combo['values'], "cb_dispolaufgruppe_neu": self.dispolaufgruppe_neu_combo['values'], "cb_hersteller_neu": self.hersteller_neu_combo['values'], } def data_from_model(self): self.clear() data = self.get_controller().get_all_gui_data() if 'tosgruppe_sivas' in data: self.tosgruppe_sivas.set(data["tosgruppe_sivas"]) if 'tosgruppe_neu' in data: self.tosgruppe_neu.set(data["tosgruppe_neu"]) if 'dispogruppe_sivas' in data: self.dispogruppe_sivas.set(data["dispogruppe_sivas"]) if 'dispogruppe_neu' in data: self.dispogruppe_neu.set(data["dispogruppe_neu"]) if 'dispolaufgruppe_sivas' in data: self.dispolaufgruppe_sivas.set(data["dispolaufgruppe_sivas"]) if 'dispolaufgruppe_neu' in data: self.dispolaufgruppe_neu.set(data["dispolaufgruppe_neu"]) if 'ersatzfuer_sivas' in data: self.ersatzfuer_sivas.set(data["ersatzfuer_sivas"]) if 'ersatzfuer_neu' in data: self.ersatzfuer_neu.set(data["ersatzfuer_neu"]) if 'ersetztdurch_sivas' in data: self.ersetztdurch_sivas.set(data["ersetztdurch_sivas"]) if 'ersetztdurch_neu' in data: self.ersetztdurch_neu.set(data["ersetztdurch_neu"]) if 'hersteller_sivas' in data: self.hersteller_sivas.set(data["hersteller_sivas"]) if 'hersteller_neu' in data: self.hersteller_neu.set(data["hersteller_neu"]) if 'herstteilenr_sivas' in data: self.herstteilenr_sivas.set(data["herstteilenr_sivas"]) if 'herstteilenr_neu' in data: self.herstteilenr_neu.set(data["herstteilenr_neu"]) # ab hier die Dropdowns der Oberfläche befüllen. if "cb_dispogruppe_neu" in data: self.dispogruppe_neu_combo['values'] = data["cb_dispogruppe_neu"] if "cb_dispolaufgruppe_neu" in data: self.dispolaufgruppe_neu_combo['values'] = data["cb_dispolaufgruppe_neu"] if "cb_hersteller_neu" in data: self.hersteller_neu_combo['values'] = data["cb_hersteller_neu"] def set_states(self): data = self.get_controller().get_gui_states() if 'tosgruppe_sivas' in data: self.tosgruppe_sivas['state'] = data["tosgruppe_sivas"] if 'tosgruppe_neu' in data: self.tosgruppe_neu['state'] = data["tosgruppe_neu"] if 'dispogruppe_sivas' in data: self.dispogruppe_sivas['state'] = data["dispogruppe_sivas"] if 'dispogruppe_neu' in data: self.dispogruppe_neu['state'] = data["dispogruppe_neu"] if 'dispolaufgruppe_sivas' in data: self.dispolaufgruppe_sivas['state'] = data["dispolaufgruppe_sivas"] if 'dispolaufgruppe_neu' in data: self.dispolaufgruppe_neu['state'] = data["dispolaufgruppe_neu"] if 'ersatzfuer_sivas' in data: self.ersatzfuer_sivas['state'] = data["ersatzfuer_sivas"] if 'ersatzfuer_neu' in data: self.ersatzfuer_neu['state'] = data["ersatzfuer_neu"] if 'ersetztdurch_sivas' in data: self.ersetztdurch_sivas['state'] = data["ersetztdurch_sivas"] if 'ersetztdurch_neu' in data: self.ersetztdurch_neu['state'] = data["ersetztdurch_neu"] if 'hersteller_sivas' in data: self.hersteller_sivas['state'] = data["hersteller_sivas"] if 'hersteller_neu' in data: self.hersteller_neu['state'] = data["hersteller_neu"] if 'herstteilenr_sivas' in data: self.herstteilenr_sivas_entry['state'] = data["herstteilenr_sivas"] if 'herstteilenr_neu' in data: self.herstteilenr_neu_entry['state'] = data["herstteilenr_neu"] # ab hier die Dropdowns der Oberfläche befüllen. if "cb_dispogruppe_neu" in data: self.dispogruppe_neu_combo['state'] = data["cb_dispogruppe_neu"] if "cb_dispolaufgruppe_neu" in data: self.dispolaufgruppe_neu_combo['state'] = data["cb_dispolaufgruppe_neu"] if "cb_hersteller_neu" in data: self.hersteller_neu_combo['state'] = data["cb_hersteller_neu"] def highlight_labels(self, labels): if "TOS-Gruppe" in labels: self.tosgruppe_label.configure(foreground='red' ) if "Dispogruppe" in labels: self.dispogruppe_label.configure(foreground='red' ) if "Dispolaufgruppe" in labels: self.dispolaufgruppe_label.configure(foreground='red' ) if "Ersatz für" in labels: self.ersatzfuer_label.configure(foreground='red') if "Ersetzt durch" in labels: self.ersetztdurch_label.configure(foreground='red') if "Hersteller" in labels: self.hersteller_label.configure(foreground='red') if "Hersteller Teilenummer" in labels: self.herstteilenr_label.configure(foreground='red') def reset_labels(self): self.tosgruppe_label.configure(foreground='blue' ) self.dispogruppe_label.configure(foreground='blue' ) self.dispolaufgruppe_label.configure(foreground='blue' ) self.ersatzfuer_label.configure(foreground='black') self.ersetztdurch_label.configure(foreground='black') self.hersteller_label.configure(foreground='black') self.herstteilenr_label.configure(foreground='black') def clear(self): self.tosgruppe_sivas.set('') self.tosgruppe_neu.set('') self.dispogruppe_sivas.set('') self.dispogruppe_neu.set('') self.dispolaufgruppe_sivas.set('') self.dispolaufgruppe_neu.set('') self.ersatzfuer_sivas.set('') self.ersatzfuer_neu.set('') self.ersetztdurch_sivas.set('') self.ersetztdurch_neu.set('') self.hersteller_sivas.set('') self.hersteller_neu.set('') self.herstteilenr_sivas.set('') self.herstteilenr_neu.set('') self.dispogruppe_neu_combo['values'] = '' self.dispolaufgruppe_neu_combo['values'] = '' self.hersteller_neu_combo['values'] = '' class RightFrameWerkstoffdiskrepanz(AllFrames): def __init__(self, frame, nrow=0): AllFrames.__init__(self, nrow) self.frame = frame self.build_widgets() def build_widgets(self): frame = self.frame self.rownum = AllFrames.get_rows(self) col_left = 0 # wnamen = configs.Werkstoffe.get_werkstoff_namen() # Werkstoffdiskrepanz self.werkstoffdiskr_label = ttk.Label(frame, text="Werkstoffdiskrepanz:") self.werkstoffdiskr_label.grid(column=col_left, row=self.rownum, sticky=tk.W, padx=3, pady=3) self.werkstoffdiskr_neu= tk.BooleanVar() self.werkstoffdiskr_checkbutton = ttk.Checkbutton(frame, #text='ja', variable=self.werkstoffdiskr_neu, command=lambda: self.callback("cb_werkstoffdiskrepanz", self.werkstoffdiskr_neu.get()), onvalue=True, offvalue=False) self.werkstoffdiskr_checkbutton.grid(column=col_left+2, row=self.rownum, sticky=tk.W, padx=3, pady=3) self.rownum += 1 # Werkstofftyp self.werkstofftyp_label = ttk.Label(frame, text="Werkstofftyp:", foreground='steel blue' ) self.werkstofftyp_label.grid(column=col_left, row=self.rownum, sticky=tk.W, padx=3, pady=3) self.werkstofftyp_neu = tk.StringVar() self.werkstofftyp_neu_combo = ttk.Combobox(frame, textvariable=self.werkstofftyp_neu, width=AllFrames.get_combo_width(self)) # self.werkstofftyp_neu_combo['values'] = wnamen self.werkstofftyp_neu_combo['state'] = 'readonly' self.werkstofftyp_neu_combo.bind('<>', lambda event:self.callback('cb_werkstofftyp_neu', self.werkstofftyp_neu.get())) self.werkstofftyp_neu_combo.grid(column=col_left+2, row=self.rownum, sticky=tk.W, padx=3, pady=3) self.rownum += 1 # Material self.material_label = ttk.Label(frame, text="Material:", foreground='steel blue' ) self.material_label.grid(column=col_left, row=self.rownum, sticky=tk.W, padx=3, pady=3) self.material_sivas = tk.StringVar() material_entry = ttk.Entry(frame, textvariable=self.material_sivas, state="readonly", width=AllFrames.get_entry_text_width(self)) material_entry.grid(column=col_left+1, row=self.rownum, sticky=tk.W, padx=3, pady=3) self.material_neu = tk.StringVar() self.material_neu_combo = ttk.Combobox(frame, textvariable=self.material_neu, width=AllFrames.get_combo_width(self)) self.material_neu_combo['state'] = 'readonly' self.material_neu_combo.bind('<>', lambda event:self.callback('cb_material_neu', self.material_neu.get())) self.material_neu_combo.grid(column=col_left+2, row=self.rownum, sticky=tk.W, padx=3, pady=3) self.rownum += 1 # Oberfläche self.oberflaeche_label = ttk.Label(frame, text="Oberfläche:", foreground='steel blue' ) self.oberflaeche_label.grid(column=col_left, row=self.rownum, sticky=tk.W, padx=3, pady=3) self.oberflaeche_neu = tk.StringVar() self.oberflaeche_neu_combo = ttk.Combobox(frame, textvariable=self.oberflaeche_neu, width=AllFrames.get_combo_width(self)) self.oberflaeche_neu_combo['state'] = 'readonly' self.oberflaeche_neu_combo.bind('<>', lambda event:self.callback('cb_oberflaeche_neu', self.oberflaeche_neu.get())) self.oberflaeche_neu_combo.grid(column=col_left+2, row=self.rownum, sticky=tk.W, padx=3, pady=3) self.rownum += 1 # Farbe self.farbe_label = ttk.Label(frame, text="Farbe:", foreground='steel blue' ) self.farbe_label.grid(column=col_left, row=self.rownum, sticky=tk.W, padx=3, pady=3) self.farbe_neu = tk.StringVar() self.farbe_neu_combo = ttk.Combobox(frame, textvariable=self.farbe_neu, width=AllFrames.get_combo_width(self)) self.farbe_neu_combo['state'] = 'readonly' self.farbe_neu_combo.bind('<>', lambda event:self.callback('cb_farbe_neu', self.farbe_neu.get())) self.farbe_neu_combo.grid(column=col_left+2, row=self.rownum, sticky=tk.W, padx=3, pady=3) self.rownum += 1 separator = ttk.Separator(frame, orient='horizontal') separator.grid(column=col_left, columnspan=3, row=self.rownum, sticky=tk.EW, padx=3, pady=3) self.rownum += 1 def get_data(self): return { "werkstoffdiskr_neu": self.werkstoffdiskr_neu.get(), "werkstofftyp_neu": self.werkstofftyp_neu.get(), "material_sivas": self.material_sivas.get(), "material_neu": self.material_neu.get(), "oberflaeche_neu": self.oberflaeche_neu.get(), "farbe_neu": self.farbe_neu.get(), # ab hier die Dropdowns der Oberfläche "cb_werkstofftyp_neu": self.werkstofftyp_neu_combo['values'], "cb_material_neu": self.material_neu_combo['values'], "cb_oberflaeche_neu": self.oberflaeche_neu_combo['values'], "cb_farbe_neu": self.farbe_neu_combo['values'], } def data_from_model(self): self.clear() data = self.get_controller().get_all_gui_data() if 'werkstoffdiskr_neu' in data: self.werkstoffdiskr_neu.set(data["werkstoffdiskr_neu"]) if 'werkstofftyp_neu' in data: self.werkstofftyp_neu.set(data["werkstofftyp_neu"]) if 'material_sivas' in data: self.material_sivas.set(data["material_sivas"]) if 'material_neu' in data: self.material_neu.set(data["material_neu"]) if 'oberflaeche_neu' in data: self.oberflaeche_neu.set(data["oberflaeche_neu"]) if 'farbe_neu' in data: self.farbe_neu.set(data["farbe_neu"]) # ab hier die Dropdowns der Oberfläche befüllen. if 'cb_werkstofftyp_neu' in data: self.werkstofftyp_neu_combo['values'] = data["cb_werkstofftyp_neu"] if 'cb_material_neu' in data: self.material_neu_combo['values'] = data["cb_material_neu"] if 'cb_oberflaeche_neu' in data: self.oberflaeche_neu_combo['values'] = data["cb_oberflaeche_neu"] if 'cb_farbe_neu' in data: self.farbe_neu_combo['values'] = data["cb_farbe_neu"] def set_states(self): data = self.get_controller().get_gui_states() if 'werkstoffdiskr_neu' in data: self.werkstoffdiskr_checkbutton['state'] = data["werkstoffdiskr_neu"] if 'werkstofftyp_neu' in data: self.werkstofftyp_neu['state'] = data["werkstofftyp_neu"] if 'material_sivas' in data: self.material_sivas['state'] = data["material_sivas"] if 'material_neu' in data: self.material_neu['state'] = data["material_neu"] if 'oberflaeche_neu' in data: self.oberflaeche_neu['state'] = data["oberflaeche_neu"] if 'farbe_neu' in data: self.farbe_neu['state'] = data["farbe_neu"] # ab hier die Dropdowns der Oberfläche befüllen. if 'cb_werkstofftyp_neu' in data: self.werkstofftyp_neu_combo['state'] = data["cb_werkstofftyp_neu"] if 'cb_material_neu' in data: self.material_neu_combo['state'] = data["cb_material_neu"] if 'cb_oberflaeche_neu' in data: self.oberflaeche_neu_combo['state'] = data["cb_oberflaeche_neu"] if 'cb_farbe_neu' in data: self.farbe_neu_combo['state'] = data["cb_farbe_neu"] def highlight_labels(self, labels): if "Werkstoffdiskrepanz" in labels: self.werkstoffdiskr_label.configure(foreground='red') if "Werkstofftyp" in labels: self.werkstofftyp_label.configure(foreground='red') if "Material" in labels: self.material_label.configure(foreground='red') if "Oberfläche" in labels: self.oberflaeche_label.configure(foreground='red') if "Farbe" in labels: self.farbe_label.configure(foreground='red') def reset_labels(self): self.werkstoffdiskr_label.configure(foreground='black') self.werkstofftyp_label.configure(foreground='steel blue' ) self.material_label.configure(foreground='steel blue' ) self.oberflaeche_label.configure(foreground='steel blue' ) self.farbe_label.configure(foreground='steel blue' ) def clear(self): self.werkstoffdiskr_neu.set(False) self.werkstofftyp_neu.set('') self.material_sivas.set('') self.material_neu.set('') self.oberflaeche_neu.set('') self.farbe_neu.set('') self.werkstofftyp_neu_combo['values'] = '' self.material_neu_combo['values'] = '' self.oberflaeche_neu_combo['values'] = '' self.farbe_neu_combo['values'] = '' class RightFrameVersion(AllFrames): def __init__(self, frame, nrow=0): AllFrames.__init__(self, nrow) self.frame = frame self.build_widgets() def build_widgets(self): frame = self.frame self.rownum = AllFrames.get_rows(self) col_left = 0 # Version self.version_label = ttk.Label(frame, text="Version:" ) self.version_label.grid(column=col_left, row=self.rownum, sticky=tk.W, padx=3, pady=3) self.version_sivas = tk.StringVar() version_entry = ttk.Entry(frame, textvariable=self.version_sivas, state="readonly", width=AllFrames.get_entry_text_width(self)) version_entry.grid(column=col_left+1, row=self.rownum, sticky=tk.W, padx=3, pady=3) self.rownum += 1 # Änderungsindex self.aenderungsindex_label = ttk.Label(frame, text="Änderungsindex:", foreground='blue' ) self.aenderungsindex_label.grid(column=col_left, row=self.rownum, sticky=tk.W, padx=3, pady=3) self.aenderungsindex_sivas = tk.StringVar() aenderungsindex_entry = ttk.Entry(frame, textvariable=self.aenderungsindex_sivas, state="readonly", width=AllFrames.get_entry_text_width(self)) aenderungsindex_entry.grid(column=col_left+1, row=self.rownum, sticky=tk.W, padx=3, pady=3) self.aenderungsindex_neu = tk.StringVar() aenderungsindex_neu_entry = ttk.Entry(frame, textvariable=self.aenderungsindex_neu, width=AllFrames.get_entry_text_width(self)) aenderungsindex_neu_entry.grid(column=col_left+2, row=self.rownum, sticky=tk.W, padx=3, pady=3) self.rownum += 1 # Änderungstext self.aenderungstext_label = ttk.Label(frame, text="Änderungstext:", foreground='blue' ) self.aenderungstext_label.grid(column=col_left, row=self.rownum, sticky=tk.W, padx=3, pady=3) self.aenderungstext_sivas = tk.Text(frame, height=3, width=AllFrames.get_text_width(self), font=("Calibri",10)) self.aenderungstext_sivas.grid(column=col_left+1, row=self.rownum, sticky=tk.W, padx=3, pady=3) self.aenderungstext_neu = tk.Text(frame, height=3, width=AllFrames.get_text_width(self), font=("Calibri",10)) self.aenderungstext_neu.grid(column=col_left+2, row=self.rownum, sticky=tk.W, padx=3, pady=3) self.rownum += 1 # Freigabevermerk self.freigabevermerk_label = ttk.Label(frame, text="Freigabevermerk:", foreground='blue' ) self.freigabevermerk_label.grid(column=col_left, row=self.rownum, sticky=tk.W, padx=3, pady=3) self.freigabevermerk_sivas = tk.Text(frame, height=3, width=AllFrames.get_text_width(self), font=("Calibri",10)) self.freigabevermerk_sivas.grid(column=col_left+1, row=self.rownum, sticky=tk.W, padx=3, pady=3) self.freigabevermerk_neu = tk.Text(frame,height=3, width=AllFrames.get_text_width(self), font=("Calibri",10) ) self.freigabevermerk_neu.grid(column=col_left+2, row=self.rownum, sticky=tk.W, padx=3, pady=3) self.rownum += 1 separator = ttk.Separator(frame, orient='horizontal') separator.grid(column=col_left, columnspan=3, row=self.rownum, sticky=tk.EW, padx=3, pady=3) self.rownum += 1 def get_data(self): aenderungstext_sivas = self.aenderungstext_sivas.get('1.0', 'end') aenderungstext_neu = self.aenderungstext_neu.get('1.0', 'end') freigabevermerk_sivas = self.freigabevermerk_sivas.get('1.0', 'end') freigabevermerk_neu = self.freigabevermerk_neu.get('1.0', 'end') aenderungstext_sivas = re.sub(r"\n", "", aenderungstext_sivas, flags=re.I) aenderungstext_neu = re.sub(r"\n", "", aenderungstext_neu, flags=re.I) freigabevermerk_sivas = re.sub(r"\n", "", freigabevermerk_sivas, flags=re.I) freigabevermerk_neu = re.sub(r"\n", "", freigabevermerk_neu, flags=re.I) ret = { "version_sivas": self.version_sivas.get(), "aenderungsindex_sivas": self.aenderungsindex_sivas.get(), "aenderungsindex_neu": self.aenderungsindex_neu.get(), "aenderungstext_sivas": aenderungstext_sivas, "aenderungstext_neu": aenderungstext_neu, "freigabevermerk_sivas": freigabevermerk_sivas, "freigabevermerk_neu": freigabevermerk_neu } return ret def data_from_model(self): self.clear() data = self.get_controller().get_all_gui_data() if 'version_sivas' in data: self.version_sivas.set(data["version_sivas"]) if 'aenderungsindex_sivas' in data: self.aenderungsindex_sivas.set(data["aenderungsindex_sivas"]) if 'aenderungsindex_neu' in data: self.aenderungsindex_neu.set(data["aenderungsindex_neu"]) if 'aenderungstext_sivas' in data: text = data["aenderungstext_sivas"] if text: self.aenderungstext_sivas.insert('1.0', text) if 'aenderungstext_neu' in data: text = data["aenderungstext_neu"] if text: self.aenderungstext_neu.insert('1.0', text) if 'freigabevermerk_sivas' in data: text = data["freigabevermerk_sivas"] if text: self.freigabevermerk_sivas.insert('1.0', text) if 'freigabevermerk_neu' in data: text = data["freigabevermerk_neu"] if text: self.freigabevermerk_neu.insert('1.0', text) def set_states(self): data = self.get_controller().get_gui_states() if 'version_sivas' in data: self.version_sivas['state'] = data["version_sivas"] if 'aenderungsindex_sivas' in data: self.aenderungsindex_sivas['state'] = data["aenderungsindex_sivas"] if 'aenderungsindex_neu' in data: self.aenderungsindex_neu['state'] = data["aenderungsindex_neu"] if 'aenderungstext_sivas' in data: self.aenderungstext_sivas['state'] = data["aenderungstext_sivas"] if 'aenderungstext_neu' in data: self.aenderungstext_neu['state'] = data["freigabevermerk_neu"] if 'freigabevermerk_sivas' in data: self.freigabevermerk_sivas['state'] = data["freigabevermerk_neu"] if 'freigabevermerk_neu' in data: self.freigabevermerk_neu['state'] = data["freigabevermerk_neu"] def highlight_labels(self, labels): if "Version" in labels: self.version_label.configure(foreground='red') if "Änderungsindex" in labels: self.aenderungsindex_label.configure(foreground='red') if "Änderungstext" in labels: self.aenderungstext_label.configure(foreground='red') if "Freigabevermerk" in labels: self.freigabevermerk_label.configure(foreground='red') def reset_labels(self): self.version_label.configure(foreground='black') self.aenderungsindex_label.configure(foreground='blue' ) self.aenderungstext_label.configure(foreground='blue' ) self.freigabevermerk_label.configure(foreground='blue' ) def clear(self): self.version_sivas.set('') self.aenderungsindex_sivas.set('') self.aenderungsindex_neu.set('') self.aenderungstext_sivas.delete('1.0', 'end') self.aenderungstext_neu.delete('1.0', 'end') self.freigabevermerk_sivas.delete('1.0', 'end') self.freigabevermerk_neu.delete('1.0', 'end') class RightFrameZusatzinfos(AllFrames): def __init__(self, frame, nrow=0): AllFrames.__init__(self, nrow) self.frame = frame self.build_widgets() def build_widgets(self): frame = self.frame self.rownum = AllFrames.get_rows(self) col_left = 0 # Zusatzinformationen automatisch self.zusatzinfos_auto_label = ttk.Label(frame, text="Zusatzinformationen\nautomatisch:") self.zusatzinfos_auto_label.grid(column=col_left, row=self.rownum, sticky=tk.W, padx=3, pady=3) self.zusatzinfos_auto_text = tk.Text(frame, height=3, width=AllFrames.get_text_width(self), font=("Calibri",10)) self.zusatzinfos_auto_text.grid(column=col_left+1, columnspan=2, row=self.rownum, sticky=tk.EW+tk.NS, padx=3, pady=3) self.rownum += 1 # Zusatzinformationen Benutzerdefiniert self.zusatzinfos_bendef_label = ttk.Label(frame, text="Zusatzinformationen\nBenutzerdefiniert:") self.zusatzinfos_bendef_label.grid(column=col_left, row=self.rownum, sticky=tk.W, padx=3, pady=3) self.zusatzinfos_bendef_text = tk.Text(frame, height=3, width=AllFrames.get_text_width(self), font=("Calibri",10)) self.zusatzinfos_bendef_text.grid(column=col_left+1, columnspan=2, row=self.rownum, sticky=tk.EW+tk.NS, padx=3, pady=3) self.rownum += 1 separator = ttk.Separator(frame, orient='horizontal') separator.grid(column=col_left, columnspan=3, row=self.rownum, sticky=tk.EW, padx=3, pady=3) self.rownum += 1 speichern_button = ttk.Button(frame, text="Speichern", command=lambda: self.callback("cb_speichern", None)) speichern_button.grid(column=col_left, row=self.rownum, sticky=tk.EW, padx=3, pady=3) migrieren_button = ttk.Button(frame, text="migrieren", command=lambda: self.callback("cb_migrieren", None)) migrieren_button.grid(column=col_left+1, row=self.rownum, sticky=tk.EW, padx=3, pady=3) zuruecksetzen_button = ttk.Button(frame, text="zurücksetzen", command=lambda: self.callback("cb_zurücksetzen", None)) zuruecksetzen_button.grid(column=col_left+2, row=self.rownum, sticky=tk.EW, padx=3, pady=3) def get_data(self): zusatzinfos_auto_text = self.zusatzinfos_auto_text.get('1.0', 'end') zusatzinfos_bendef_text = self.zusatzinfos_bendef_text.get('1.0', 'end') zusatzinfos_auto_text = re.sub(r"\n", "", zusatzinfos_auto_text, flags=re.I) zusatzinfos_bendef_text = re.sub(r"\n", "", zusatzinfos_bendef_text, flags=re.I) ret = { "zusatzinfos_auto_text": zusatzinfos_auto_text, "zusatzinfos_bendef_text": zusatzinfos_bendef_text } return ret def data_from_model(self): self.clear() data = self.get_controller().get_all_gui_data() if 'zusatzinfos_auto_text' in data: text = data["zusatzinfos_auto_text"] if text: self.zusatzinfos_auto_text.insert('1.0', text) if 'zusatzinfos_bendef_text' in data: text = data["zusatzinfos_bendef_text"] if text: self.zusatzinfos_bendef_text.insert('1.0', text) def set_states(self): data = self.get_controller().get_gui_states() if 'zusatzinfos_auto_text' in data: self.zusatzinfos_auto_text['state'] = data["zusatzinfos_auto_text"] if 'zusatzinfos_bendef_text' in data: self.zusatzinfos_bendef_text['state'] = data["zusatzinfos_bendef_text"] def highlight_labels(self, labels): if "Zusatzinformationen automatisch" in labels: self.zusatzinfos_auto_label.configure(foreground='red') if "Zusatzinformationen Benutzerdefiniert" in labels: self.zusatzinfos_bendef_label.configure(foreground='red') def reset_labels(self): self.zusatzinfos_auto_label.configure(foreground='black') self.zusatzinfos_bendef_label.configure(foreground='black') def clear(self): self.zusatzinfos_auto_text.delete('1.0', 'end') self.zusatzinfos_bendef_text.delete('1.0', 'end') class App(): def __init__(self, root, config): """Standardgui mit Baum zur Anwahl der Teile des Assemblies""" self._root = root self._config = config self.build_widgets() def build_widgets(self): """ baue alle Frames der Gui auf """ # Defaultgrösse des Fensters Dimension = self._config.Gui.get('Fenster', 'Dimension') self._root.geometry(Dimension) style = ttk.Style(self._root) style.theme_use('clam') # gesamtes Fenster durch Scrollbar, aber auch mit Mausrad verschieben #self._root.bind('', self.OnMouseWheel) container = ttk.Frame(self._root) container.pack() # hier im Canvas ist der linke und Rechte Frame drin # CanvasBreite gesteuert durch gui.cfg width = self._config.Gui.get('Fenster', 'CanvasBreite') height = self._config.Gui.get('Fenster', 'CanvasHoehe') self._canvas = tk.Canvas(container, width=width, height=height) self._canvas.pack(side="left", fill="both", expand=True) # zum Verschieben des Canvas: Eine globale Scrollbar ganz rechts vscrollbar = ttk.Scrollbar(container, orient='vertical', command=self._canvas.yview) vscrollbar.pack(side="left", fill="y", expand=False) # verknüpfe Scrollbar und Canvas self._canvas.bind( '', lambda e: self._canvas.configure( scrollregion=self._canvas.bbox("all") ) ) self._canvas.configure(yscrollcommand=vscrollbar.set) # Canvas-Größe anpassen self._canvas.update_idletasks() self._canvas.config(scrollregion=self._canvas.bbox("all")) inner_frame = ttk.Frame(self._canvas) self._canvas.create_window((0, 0), window=inner_frame, anchor="nw") # einen linken und rechten Rahmen darin # left_frame = ttk.Frame(inner_frame, width=200, height=800) left_frame = ttk.Frame(inner_frame) #left_frame.grid(row=0, column=0, padx=10, pady=3) left_frame.pack(side='left', expand=False) # right_frame = ttk.Frame(inner_frame, width=650, height=800) right_frame = ttk.Frame(inner_frame) #right_frame.grid(row=0, column=1, padx=10, pady=3) right_frame.pack(side='left', expand=True) # self._canvas.columnconfigure(0, weight=1) # self._canvas.columnconfigure(1, weight=6) # left_frame.columnconfigure(0, weight=1) # right_frame.columnconfigure(0, weight=6) self.lf1 = LeftFrameAsm(left_frame, 0) nrows = self.lf1.get_rows() self.lf2 = TreeView(left_frame, nrows) self.rf1 = RightFrameLabels(right_frame, 0) nrows = self.rf1.get_rows() self.rf2 = RightFramePDM(right_frame, nrows) nrows = self.rf2.get_rows() self.rf3 = RightFrameBezeichnung(right_frame, nrows) nrows = self.rf3.get_rows() self.rf4 = RightFrameHalbzeugOhneS(right_frame, nrows) nrows = self.rf4.get_rows() self.rf5 = RightFrameBeschaffungsart(right_frame, nrows) nrows = self.rf5.get_rows() self.rf6 = RightFrameTOSGruppe(right_frame, nrows) nrows = self.rf6.get_rows() self.rf7 = RightFrameWerkstoffdiskrepanz(right_frame, nrows) nrows = self.rf7.get_rows() self.rf8 = RightFrameVersion(right_frame, nrows) nrows = self.rf8.get_rows() self.rf9 = RightFrameZusatzinfos(right_frame, nrows) nrows = self.rf9.get_rows() def data_from_model(self): """ methode zum Auslesen aller Daten der Oberfläche aus dem Modell """ self.lf1.data_from_model() self.lf2.data_from_model() self.rf1.data_from_model() self.rf2.data_from_model() self.rf3.data_from_model() self.rf4.data_from_model() self.rf5.data_from_model() self.rf6.data_from_model() self.rf7.data_from_model() self.rf8.data_from_model() self.rf9.data_from_model() def clear_leftframes(self): self.lf1.clear() self.lf2.clear() def clear_rightframes(self): self.rf1.clear() self.rf2.clear() self.rf3.clear() self.rf4.clear() self.rf5.clear() self.rf6.clear() self.rf7.clear() self.rf8.clear() self.rf9.clear() def clear(self): self.clear_rightframes() self.clear_leftframes() def set_states(self): # not used. So not implemented: #self.lf1.set_states() #self.lf2.set_states() self.rf1.set_states() self.rf2.set_states() self.rf3.set_states() self.rf4.set_states() self.rf5.set_states() self.rf6.set_states() self.rf7.set_states() self.rf8.set_states() self.rf9.set_states() def highlight_labels(self, labels): self.rf1.highlight_labels(labels) self.rf2.highlight_labels(labels) self.rf3.highlight_labels(labels) self.rf4.highlight_labels(labels) self.rf5.highlight_labels(labels) self.rf6.highlight_labels(labels) self.rf7.highlight_labels(labels) self.rf8.highlight_labels(labels) self.rf9.highlight_labels(labels) def reset_labels(self): self.rf1.reset_labels() self.rf2.reset_labels() self.rf3.reset_labels() self.rf4.reset_labels() self.rf5.reset_labels() self.rf6.reset_labels() self.rf7.reset_labels() self.rf8.reset_labels() self.rf9.reset_labels() def data_from_view(self, key=None): ret = dict() ret.update(self.lf1.get_data()) #self.lf2.get_data() tree hat kein get_data ret.update(self.rf1.get_data()) ret.update(self.rf2.get_data()) ret.update(self.rf3.get_data()) ret.update(self.rf4.get_data()) ret.update(self.rf5.get_data()) ret.update(self.rf6.get_data()) ret.update(self.rf7.get_data()) ret.update(self.rf8.get_data()) ret.update(self.rf9.get_data()) if key: return ret[key] else: return ret def set_controller(self, controller): """ merken des Handels auf den Controller in jedem Widget""" self._controller = controller self.lf1.set_controller(controller) self.lf2.set_controller(controller) self.rf1.set_controller(controller) self.rf2.set_controller(controller) self.rf3.set_controller(controller) self.rf4.set_controller(controller) self.rf5.set_controller(controller) self.rf6.set_controller(controller) self.rf7.set_controller(controller) self.rf8.set_controller(controller) self.rf9.set_controller(controller) def mainloop(self): self._root.mainloop() def OnMouseWheel(self,event): self._canvas.yview("scroll", event.delta, "units") return "break" def suche_3d(self): """create a new window with the file search dialog""" toplevel = tk.Toplevel() toplevel.title("search Window") selected = filename = filedialog.askopenfilename( parent=toplevel, initialdir= os.getcwd(), title="please select .par or .asm file", filetypes=[("Part-Dokumente", ".par"), ("Assembly-Dokumente", ".asm")] ) toplevel.destroy() return selected if __name__ == "__main__": """ using the Model-View-Controller (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. <--fills gui -- --manipulates--> --user input-> <--give model data-- """