diff --git a/generator.exe b/generator.exe deleted file mode 100644 index fdf6093..0000000 Binary files a/generator.exe and /dev/null differ diff --git a/generator.pyw b/generator.pyw new file mode 100644 index 0000000..73e2aa4 --- /dev/null +++ b/generator.pyw @@ -0,0 +1,3245 @@ +""" +# Generator CSV +# Wersja 4.0 +# Autorzy: Mateusz Skoczek +# styczeń 2019 - wrzesień 2020 +# dla ZSP Sobolew +""" + + + + + +# ------------------------------------- # Import bibliotek # ------------------------------------ # + +# Biblioteki główne +import sys as SS +import os as OS +import time as TM +import codecs as CD +import pathlib as PT +import shutil as SU + + +# Biblioteki interfejsu graficznego +import tkinter as TK +from tkinter import ttk as TKttk +from tkinter import messagebox as TKmsb +from tkinter import filedialog as TKfld + +from PIL import ImageTk as PLitk +from PIL import Image as PLimg + + + + + +# --------------------------------- # Główne zmienne globalne # --------------------------------- # + +class VAR: + # Informacje o programie + programName = 'Generator CSV' + programVersion = '4.0' + programVersionStage = '' + programVersionBuild = '20254' + programCustomer = 'ZSP Sobolew' + programAuthors = ['Mateusz Skoczek'] + programToW = ['styczeń', '2019', 'wrzesień', '2020'] + + # Dozwolone kodowanie plików + allowedCoding = ['utf-8', 'ANSI', 'iso-8859-2'] + + # Dozwolone znaki + allowedCharactersInSeparator = ['`', '~', '!', '@', '#', '$', '%', '^', '&', '(', ')', '-', '_', '=', '+', '[', ']', ' ', '?', '/', '>', '.', '<', ',', '"', "'", ':', ';', '|'] + + # Katalog APPDATA + appdataPath = PT.Path.home() / 'Appdata/Roaming' + + + + + + +# -------------------------------------- # Okna dialogowe # ------------------------------------- # + +# Lista komunikatów +MSGlist = { + 'E0000' : 'none', + 'E0001' : 'Wystąpił błąd podczas inicjalizacji katalogu z plikami konfiguracyjnymi programu w katalogu %APPDATA%', + 'E0002' : 'Wystąpił błąd podczas ładowania pliku konfiguracyjnego (config.cfg)', + 'E0003' : 'Niepoprawne dane w pliku konfiguracyjnym (config.cfg)', + 'E0004' : 'Wystąpił błąd podczas ładowania pliku stylu (style.cfg)', + 'E0005' : 'Niepoprawne dane w pliku stylu (style.cfg)', + 'E0006' : 'Niepoprawne dane w pliku formatu', + 'E0007' : 'Wymagany przynajmniej jeden plik wejściowy', + 'E0008' : 'Nie można odnaleźć jednego z powyższych plików', + 'E0009' : 'Nie można odnaleźć jednego z powyższych format presetów', + 'E0010' : 'Nie można przetworzyć danych z plików wejściowych z pomocą podanych format presetów', + 'E0011' : 'Niepoprawne dane w plikach wejściowych', + 'E0012' : 'Nie można przetworzyć danych na format wyjściowy', + 'E0013' : 'Nie można utworzyć plików wejściowych', + 'E0014' : 'Nie można zapisać plików wejściowych', + 'E0015' : 'Nie można usunąć wybranych format presetów', + 'E0016' : 'Nie można uruchomić pliku instrukcji (documentation/index.html)', + 'E0017' : 'Nie można zapisać pliku formatu', + 'A0001' : 'Czy chcesz zapisać? Zostanie utworzony nowy plik', + 'A0002' : 'Czy chcesz zapisać? Plik zostanie nadpisany', + 'A0003' : 'Czy chcesz rozpocząć przetwarzanie plików?', + 'A0004' : 'Czy chcesz zapisać?', + 'A0005' : 'Czy na pewno chcesz przywrócić domyślne ustawienia ogólne?', + 'A0006' : 'Czy na pewno chcesz przywrócić domyślne ustawienia wyglądu?', + 'A0007' : 'Czy na pewno chcesz usunąc zaznaczone format presety?', + 'A0008' : 'Nie znaleziono informacji o wersji programu w katalogu programu w APPDATA. Nastąpi zresetowanie katalogu programu w APPDATA oraz utworzenie kopii zapasowej dotychczasowej zawartości. Czy chcesz kontynuować?', + 'A0009' : 'Została zainstalowana nowa wersja programu. Nastąpi zresetowanie katalogu programu w APPDATA oraz utworzenie kopii zapasowej dotychczasowej zawartości. Czy chcesz kontynuować?', + 'I0001' : 'Operacja ukończona pomyślnie', + 'I0002' : 'Aplikacja zostanie zamknięta w celu przeładowania ustawień', +} + + +# Funkcja odpowiedzialna za wywoływanie komunikatów dialogowych +def MSG(code, terminate, *optionalInfo): + try: + optionalInfo[0] + except: + optionalInfo = [''] + + # Błędy + if code[0] == 'E': + TKmsb.showerror('Wystąpił błąd!', '%s\n%s' % (MSGlist[code], optionalInfo[0])) + if terminate: + SS.exit(0) + + # Informacja + elif code[0] == 'I': + TKmsb.showinfo('Informacja', '%s\n%s' % (MSGlist[code], optionalInfo[0])) + if terminate: + SS.exit(0) + + # Ostrzeżenie + elif code[0] == 'W': + TKmsb.showwarning('Ostrzeżenie', '%s\n%s' % (MSGlist[code], optionalInfo[0])) + if terminate: + SS.exit(0) + + # Zapytania + elif code[0] == 'A': + if TKmsb.askokcancel('Pytanie', '%s\n%s' % (MSGlist[code], optionalInfo[0])): + return True + else: + return False + + + + + +# ------------------------- # Sprawdzanie katalogu programu w APPDATA # ------------------------- # + +class checkAppdata: + def __init__(self): + if 'Generator CSV' in [x for x in OS.listdir(VAR.appdataPath)]: + if 'version' in [x for x in OS.listdir(str(VAR.appdataPath) + '\Generator CSV')]: + versionFile = CD.open((str(VAR.appdataPath) + r'\Generator CSV\version'), 'r', 'utf-8') + if versionFile.read() == VAR.programVersionBuild: + versionFile.close() + if 'config.cfg' not in [x for x in OS.listdir(str(VAR.appdataPath) + '\Generator CSV')]: + self.__restoreCFG('config') + if 'style.cfg' not in [x for x in OS.listdir(str(VAR.appdataPath) + '\Generator CSV')]: + self.__restoreCFG('style') + if 'format-presets' not in [x for x in OS.listdir(str(VAR.appdataPath) + '\Generator CSV')]: + self.__createFormatPresetsDir() + else: + versionFile.close() + if MSG('A0009', False): + self.__resetAppdata() + MSG('I0002', True) + else: SS.exit(0) + else: + if MSG('A0008', False): + self.__resetAppdata() + MSG('I0002', True) + else: SS.exit(0) + else: self.__buildAppdata() + + + # Budowanie katalogu programu + def __buildAppdata(self): + try: + OS.mkdir(str(VAR.appdataPath) + '\Generator CSV') + + versionFile = CD.open((str(VAR.appdataPath) + r'\Generator CSV\version'), 'w', 'utf-8') + versionFile.write(VAR.programVersionBuild) + versionFile.close() + except Exception as exceptInfo: + MSG('E0001', True, exceptInfo) + + self.__restoreCFG('config') + self.__restoreCFG('style') + self.__createFormatPresetsDir() + + + # Resetowanie katalogu programu + def __resetAppdata(self): + try: + if 'Generator CSV_old' in [x for x in OS.listdir(str(VAR.appdataPath) + '\Generator CSV')]: + SU.rmtree(str(VAR.appdataPath) + '\Generator CSV\Generator CSV_old') + OS.rename((str(VAR.appdataPath) + '\Generator CSV'), (str(VAR.appdataPath) + '\Generator CSV_old')) + except Exception as exceptInfo: + MSG('E0001', True, exceptInfo) + + self.__buildAppdata() + + try: + SU.move((str(VAR.appdataPath) + '\Generator CSV_old'), (str(VAR.appdataPath) + '\Generator CSV\Generator CSV_old')) + except Exception as exceptInfo: + MSG('E0001', True, exceptInfo) + + + # Przywracanie plików konfiguracyjnych + def __restoreCFG(self, configFileName): + try: + SU.copy(('configs\%s.cfg' % configFileName), str(VAR.appdataPath) + ('\Generator CSV\%s.cfg' % configFileName)) + except Exception as exceptInfo: + MSG('E0001', True, exceptInfo) + + + # Tworzenie katalogu przechowującego format presety + def __createFormatPresetsDir(self): + try: + OS.mkdir(str(VAR.appdataPath) + r'\Generator CSV\format-presets') + except Exception as exceptInfo: + MSG('E0001', True, exceptInfo) + + + +checkAppdata() + + + + + +# ------------------ # Ładowanie głównego pliku konfiguracyjnego 'config.cfg' # ----------------- # + +class CFG: + def R(self, record): + self.__checkIfFileExist(False) + content = {} + for x in CD.open((str(VAR.appdataPath) + '\Generator CSV\config.cfg'), 'r', 'utf-8').read().strip('\r').split('\n'): + x = x.split(' = ') + try: + name = x[0].split('(')[0] + var = x[1] + type = x[0].split('(')[1].strip(')') + content[name] = [var, type] + except: + continue + checkingOutput = self.__checkIfRecordExist(content, record) + if not checkingOutput[0]: + MSG('E0003', True, checkingOutput[1]) + var = content[record] + if var[1] == 'S': + # String + var = var[0].strip('\r') + return var + elif var[1] == 'Sc': + # Integer + checkingOutput = self.__checkSc(record, var[0]) + if checkingOutput[0]: + return checkingOutput[1] + else: + MSG('E0003', True, checkingOutput[1]) + elif var[1] == 'I': + # Integer + checkingOutput = self.__checkI(False, record, var[0]) + if checkingOutput[0]: + return checkingOutput[1] + else: + MSG('E0003', True, checkingOutput[1]) + elif var[1] == 'D': + # Date (DD.MM.RRRR HH:MM:SS) + checkingOutput = self.__checkD(False, record, var[0]) + if checkingOutput[0]: + return checkingOutput[1] + else: + MSG('E0003', True, checkingOutput[1]) + elif var[1] == 'MSAs': + # Multiple Specified Arrays - schoolData + checkingOutput = self.__checkMSAs(False, record, var[0]) + if checkingOutput[0]: + return checkingOutput[1] + else: + MSG('E0003', True, checkingOutput[1]) + elif var[1] == 'B': + # Boolean + checkingOutput = self.__checkB(False, record, var[0]) + if checkingOutput[0]: + return checkingOutput[1] + else: + MSG('E0003', True, checkingOutput[1]) + else: + MSG('E0003', True, 'Nie można rozpoznać typu klucza %s' % record) + + def W(self, changes): + self.__checkIfFileExist(True) + file = CD.open(str(VAR.appdataPath) + '\Generator CSV\config.cfg', 'r', 'utf-8').read().split('\n') + if file[-1] == '': + file = file[:-1] + content = {} + for x in file: + x = x.split(' = ') + try: + name = x[0].split('(')[0] + var = x[1] + type = x[0].split('(')[1].strip(')') + content[name] = [var, type] + except Exception as exceptInfo: + MSG('E0003', False, exceptInfo) + for x in changes: + name = x + var = changes[name] + type = (content[name])[1] + if type == 'S': + # String + pass + elif type == 'Sc': + # Integer + checkingOutput = self.__checkSc(name, var) + if checkingOutput[0]: + var = checkingOutput[1] + else: + MSG('E0006', False, checkingOutput[1]) + return False + elif type == 'I': + # Integer + checkingOutput = self.__checkI(True, name, var) + if checkingOutput[0]: + var = checkingOutput[1] + else: + MSG('E0006', False, checkingOutput[1]) + return False + elif type == 'D': + # Date (DD.MM.RRRR HH:MM:SS) + checkingOutput = self.__checkD(True, name, var) + if checkingOutput[0]: + var = checkingOutput[1] + else: + MSG('E0006', False, checkingOutput[1]) + return False + elif type == 'MSAs': + # Multiple Specified Arrays - schoolData + checkingOutput = self.__checkMSAs(True, name, var) + if checkingOutput[0]: + var = checkingOutput[1] + else: + MSG('E0006', False, checkingOutput[1]) + return False + elif type == 'B': + # Boolean + checkingOutput = self.__checkB(True, name, var) + if checkingOutput[0]: + var = checkingOutput[1] + else: + MSG('E0006', False, checkingOutput[1]) + return False + else: + MSG('E0003', False, 'Nie można rozpoznać typu klucza %s' % name) + return False + content[name] = [var, type] + with CD.open(str(VAR.appdataPath) + '\Generator CSV\config.cfg', 'w', 'utf-8') as file: + for x in content: + file.write('%s(%s) = %s\n' % (x, (content[x])[1], (content[x][0]))) + return True + + + # Funkcje sprawdzające istnienie + def __checkIfFileExist(self, write): + if write: + try: + checkAppdata() + file = open((str(VAR.appdataPath) + '\Generator CSV\config.cfg'), 'a') + except Exception as exceptInfo: + MSG('E0002', True, exceptInfo) + return False + else: + if not file.writable(): + MSG('E0002', False, 'Plik tylko do odczytu') + return False + else: + return True + else: + try: + checkAppdata() + open(str(VAR.appdataPath) + '\Generator CSV\config.cfg') + except Exception as exceptInfo: + MSG('E0002', True, exceptInfo) + + def __checkIfRecordExist(self, content, record): + if record in list(content.keys()): + return [True] + else: + return [False, 'Brak danych - klucz: %s' % record] + + + # Funkcje sprawdzające poprawność recordu + def __checkI(self, write, record, var): + if write: + try: + var = int(var) + except: + return (False, 'Niepoprawne dane - klucz: %s' % record) + var = str(var) + else: + try: + var = int(var) + except: + return (False, 'Niepoprawne dane - klucz: %s' % record) + return [True, var] + + def __checkD(self, write, record, var): + if write: + varX = '' + if var['D'] == None: + varX += '*' + else: + try: + var['D'] = int(var['D']) + except: + return (False, 'Niepoprawne dane - klucz: %s' % record) + if int(var['D']) > 31 or int(var['D']) < 1: + return (False, 'Niepoprawne dane - klucz: %s' % record) + day = str(var['D']) + if len(day) == 1: + day = '0' + day + varX += day + varX += '.' + if var['M'] == None: + varX += '*' + else: + try: + var['M'] = int(var['M']) + except: + return (False, 'Niepoprawne dane - klucz: %s' % record) + if int(var['M']) > 12 or int(var['M']) < 1: + return (False, 'Niepoprawne dane - klucz: %s' % record) + month = str(var['M']) + if len(month) == 1: + month = '0' + month + varX += month + varX += '.' + if var['Y'] == None: + varX += '*' + else: + try: + var['Y'] = int(var['Y']) + except: + return (False, 'Niepoprawne dane - klucz: %s' % record) + if int(var['Y']) == 0: + return (False, 'Niepoprawne dane - klucz: %s' % record) + varX += str(var['Y']) + varX += ' ' + if var['h'] == None: + varX += '*' + else: + try: + var['h'] = int(var['h']) + except: + return (False, 'Niepoprawne dane - klucz: %s' % record) + if int(var['h']) > 23 or int(var['h']) < 1: + return (False, 'Niepoprawne dane - klucz: %s' % record) + hour = str(var['h']) + if len(hour) == 1: + hour = '0' + hour + varX += hour + varX += ':' + if var['m'] == None: + varX += '*' + else: + try: + var['m'] = int(var['m']) + except: + return (False, 'Niepoprawne dane - klucz: %s' % record) + if int(var['m']) > 59 or int(var['m']) < 0: + return (False, 'Niepoprawne dane - klucz: %s' % record) + minute = str(var['m']) + if len(minute) == 1: + minute = '0' + minute + varX += minute + varX += ':' + if var['s'] == None: + varX += '*' + else: + try: + var['s'] = int(var['s']) + except: + return (False, 'Niepoprawne dane - klucz: %s' % record) + if int(var['s']) > 59 or int(var['s']) < 0: + return (False, 'Niepoprawne dane - klucz: %s' % record) + seconds = str(var['s']) + if len(seconds) == 1: + seconds = '0' + seconds + varX += seconds + var = varX + else: + varToReturn = {} + var = var.split(' ') + try: + var[0] = var[0].split('.') + var[1] = var[1].split(':') + var = var[0] + var[1] + dateLabels = ['D', 'M', 'Y', 'h', 'm', 's'] + if len(var) != len(dateLabels): + return (False, 'Niepoprawne dane - klucz: %s' % record) + index = 0 + for x in var: + x = x.strip('\r') + if x != '*': + try: + x = int(x) + except: + return (False, 'Niepoprawne dane - klucz: %s' % record) + varToReturn[dateLabels[index]] = int(x) + else: + varToReturn[dateLabels[index]] = None + index += 1 + except: + return (False, 'Niepoprawne dane - klucz: %s' % record) + var = varToReturn + return [True, var] + + def __checkMSAs(self, write, record, var): + if write: + varX = [] + while var.count(''): + var.remove('') + for x in var: + check = x.split(' | ') + if len(check) != 3: + return (False, 'Niepoprawne dane - klucz: %s' % record) + try: + checkX = int(check[1]) + except: + return (False, 'Niepoprawne dane - klucz: %s' % record) + if not (check[2] == '0' or check[2] == '1'): + return (False, 'Niepoprawne dane - klucz: %s' % record) + x = x.replace(' | ', ', ') + x = '[' + x + ']' + varX.append(x) + var = '|'.join(varX) + else: + var = var.split('|') + var = [x.strip('\r').strip('[').strip(']').split(', ') for x in var] + newVar = [] + for x in var: + if len(x) != 3: + return (False, 'Niepoprawne dane - klucz: %s' % record) + try: + if x[2] == '0': + x[2] = False + elif x[2] == '1': + x[2] = True + else: + return (False, 'Niepoprawne dane - klucz: %s' % record) + x = [x[0], int(x[1]), x[2]] + newVar.append(x) + except: + return (False, 'Niepoprawne dane - klucz: %s' % record) + var = newVar + return [True, var] + + def __checkSc(self, record, var): + var = var.strip('\r') + if var not in VAR.allowedCoding: + return [False, 'Niepoprawne dane - klucz: %s' % record] + return [True, var] + + def __checkB(self, write, record, var): + if write: + if var: + var = '1' + else: + var = '0' + else: + try: + var = int(var) + except: + return [False, 'Niepoprawne dane - klucz: %s' % record] + if var != 0 and var != 1: + return [False, 'Niepoprawne dane - klucz: %s' % record] + else: + if var == 0: + var = False + else: + var = True + return [True, var] + + + +CFG = CFG() + + + + + +# -------------------- # Ładowanie pliku konfiguracyjnego stylu 'style.cfg' # ------------------- # + +class GUI: + # Odczytywanie pojedyńczej zmiennej z pliku + def R(self, record): + self.__checkIfFileExist() + content = {} + for x in CD.open((str(VAR.appdataPath) + '\Generator CSV\style.cfg'), 'r', 'utf-8').read().strip('\r').split('\n'): + x = x.split(' = ') + try: + name = x[0].split('(')[0] + var = x[1] + type = x[0].split('(')[1].strip(')') + content[name] = [var.strip('\r'), type] + except: + continue + checkingOutput = self.__checkIfRecordExist(content, record) + if not checkingOutput[0]: + MSG('E0005', True, checkingOutput[1]) + var = content[record] + if var[1] == 'I': + # Integer + checkingOutput = self.__checkI(record, var[0]) + if checkingOutput[0]: + return checkingOutput[1] + else: + MSG('E0005', True, checkingOutput[1]) + elif var[1] == 'B': + # Boolean + checkingOutput = self.__checkB(record, var[0]) + if checkingOutput[0]: + return checkingOutput[1] + else: + MSG('E0005', True, checkingOutput[1]) + elif var[1] == 'C': + # Color + checkingOutput = self.__checkC(record, var[0]) + if checkingOutput[0]: + return checkingOutput[1] + else: + MSG('E0005', True, checkingOutput[1]) + elif var[1] == 'P': + # Path + checkingOutput = self.__checkP(record, var[0]) + if checkingOutput[0]: + return checkingOutput[1] + else: + MSG('E0005', True, checkingOutput[1]) + elif (var[1])[:2] == 'FA': + # From Array + checkingOutput = self.__checkFA(record, var[0], (var[1])[2:]) + if checkingOutput[0]: + return checkingOutput[1] + else: + MSG('E0005', True, checkingOutput[1]) + elif var[1] == 'F': + # Font + checkingOutput = self.__checkF(record, var[0]) + if checkingOutput[0]: + return checkingOutput[1] + else: + MSG('E0005', True, checkingOutput[1]) + else: + MSG('E0005', True, 'Nie można rozpoznać typu klucza %s' % record) + + # Funkcje sprawdzające istnienie + def __checkIfFileExist(self): + try: + checkAppdata() + open(str(VAR.appdataPath) + '\Generator CSV\style.cfg') + except Exception as exceptInfo: + checkAppdata() + + def __checkIfRecordExist(self, content, record): + if record in list(content.keys()): + return [True] + else: + return [False, 'Brak danych - klucz: %s' % record] + + + # Funkcje sprawdzające poprawność rekordu + def __checkI(self, record, var): + try: + var = int(var) + except: + return (False, 'Niepoprawne dane - klucz: %s' % record) + return [True, var] + + def __checkB(self, record, var): + try: + var = int(var) + except: + return [False, 'Niepoprawne dane - klucz: %s' % record] + if var != 0 and var != 1: + return [False, 'Niepoprawne dane - klucz: %s' % record] + else: + if var == 0: + var = False + else: + var = True + return [True, var] + + def __checkC(self, record, var): + if len(var) != 7: + return [False, 'Niepoprawne dane - klucz: %s' % record] + else: + if var[0] != '#': + return [False, 'Niepoprawne dane - klucz: %s' % record] + return [True, var] + + def __checkP(self, record, var): + try: + check = open(var) + except: + return [False, 'Niepoprawne dane - klucz: %s' % record] + return [True, var] + + def __checkFA(self, record, var, array): + arrays = { + 'position' : ['nw', 'ne', 'en', 'es', 'se', 'sw', 'ws', 'wn'], + 'anchor' : ['center', 'nw', 'n', 'ne', 'w', 'e', 'sw', 's', 'se'], + 'relief' : ['flat', 'raised', 'sunken', 'groove', 'ridge'], + 'fill' : ['x', 'y', 'both'], + 'activestyle' : ['dotbox', 'none', 'underline'] + } + if var not in arrays[array]: + return [False, 'Niepoprawne dane - klucz: %s' % record] + return [True, var] + + def __checkF(self, record, var): + try: + check = int(var.split(';')[1]) + except: + return [False, 'Niepoprawne dane - klucz: %s' % record] + else: + var = (var.split(';')[0], int(var.split(';')[1])) + return [True, var] + + + +GUI = GUI() + + + + + +# ------------------------------- # Zarządzanie plikami formatu # ------------------------------- # + +class FMT: + # Odczytywanie pojedyńczej zmiennej z pliku + def R(self, preset, record): + self.__checkIfFolderExist() + if preset in self.getList(): + path = str(VAR.appdataPath) + '/Generator CSV/format-presets/%s.fmt' % preset + file = CD.open(path, 'r', 'utf-8').read().strip('\r').split('\n') + content = {} + for x in file: + x = x.split(' = ') + try: + name = x[0].split('(')[0] + var = x[1] + type = x[0].split('(')[1].strip(')') + content[name] = [var, type] + except: + continue + checkingOutput = self.__checkIfRecordExist(content, record) + if not checkingOutput[0]: + MSG('E0006', False, checkingOutput[1]) + var = content[record] + if var[1] == 'B': + # Boolean + checkingOutput = self.__checkB(False, record, var[0]) + if checkingOutput[0]: + return checkingOutput[1] + else: + MSG('E0006', False, checkingOutput[1]) + elif var[1] == 'Ss': + # String - separator + checkingOutput = self.__checkSs(record, var[0]) + if checkingOutput[0]: + return checkingOutput[1] + else: + MSG('E0006', False, checkingOutput[1]) + elif var[1] == 'As': + # Array - separator + checkingOutput = self.__checkAs(False, record, var[0]) + if checkingOutput[0]: + return checkingOutput[1] + else: + MSG('E0006', False, checkingOutput[1]) + elif var[1] == 'I': + # Integer + checkingOutput = self.__checkI(False, record, var[0]) + if checkingOutput[0]: + return checkingOutput[1] + else: + MSG('E0006', False, checkingOutput[1]) + elif var[1] == 'Sc': + # Integer + checkingOutput = self.__checkSc(record, var[0]) + if checkingOutput[0]: + return checkingOutput[1] + else: + MSG('E0006', False, checkingOutput[1]) + else: + MSG('E0006', True, 'Nie można rozpoznać typu klucza %s' % record) + else: + content = { + "student" : True, + "personSeparator" : '', + "rowSeparator" : '', + "dataSeparators" : [], + "loginRow" : 0, + "loginPositionInRow" : 0, + "fnameRow" : 0, + "fnamePositionInRow" : 0, + "lnameRow" : 0, + "lnamePositionInRow" : 0, + "schoolRow" : 0, + "schoolPositionInRow" : 0, + "classRow" : 0, + "classPositionInRow" : 0, + "inputCoding" : 'utf-8', + } + var = content[record] + return var + + # Zapisywanie zmian w pliku + def W(self, preset, changes): + self.__checkIfFolderExist() + if preset in self.getList(): + file = CD.open(str(VAR.appdataPath) + '/Generator CSV/format-presets/%s.fmt' % preset, 'r', 'utf-8').read().split('\n') + if file[-1] == '': + file = file[:-1] + content = {} + for x in file: + x = x.split(' = ') + try: + name = x[0].split('(')[0] + var = x[1] + type = x[0].split('(')[1].strip(')') + content[name] = [var, type] + except Exception as exceptInfo: + MSG('E0006', False, exceptInfo) + else: + content = { + "student" : ['1', 'B'], + "personSeparator" : ['', 'Ss'], + "rowSeparator" : ['', 'Ss'], + "dataSeparators" : ['', 'As'], + "loginRow" : ['0', 'I'], + "loginPositionInRow" : ['0', 'I'], + "fnameRow" : ['0', 'I'], + "fnamePositionInRow" : ['0', 'I'], + "lnameRow" : ['0', 'I'], + "lnamePositionInRow" : ['0', 'I'], + "schoolRow" : ['0', 'I'], + "schoolPositionInRow" : ['0', 'I'], + "classRow" : ['0', 'I'], + "classPositionInRow" : ['0', 'I'], + "inputCoding" : ['utf-8', 'Sc'] + } + for x in changes: + name = x + var = changes[name] + type = (content[name])[1] + if type == 'B': + checkingOutput = self.__checkB(True, name, var) + if checkingOutput[0]: + var = checkingOutput[1] + else: + MSG('E0006', False, checkingOutput[1]) + return False + elif type == 'Ss': + checkingOutput = self.__checkSs(name, var) + if checkingOutput[0]: + var = checkingOutput[1] + else: + MSG('E0006', False, checkingOutput[1]) + return False + elif type == 'As': + checkingOutput = self.__checkAs(True, name, var) + if checkingOutput[0]: + var = checkingOutput[1] + else: + MSG('E0006', False, checkingOutput[1]) + return False + elif type == 'I': + # Integer + checkingOutput = self.__checkI(True, name, var) + if checkingOutput[0]: + var = checkingOutput[1] + else: + MSG('E0006', False, checkingOutput[1]) + return False + elif type == 'Sc': + checkingOutput = self.__checkSc(name, var) + if checkingOutput[0]: + var = checkingOutput[1] + else: + MSG('E0006', False, checkingOutput[1]) + return False + else: + MSG('E0006', False, 'Nie można rozpoznać typu klucza %s' % name) + return False + content[name] = [var, type] + try: + with CD.open(str(VAR.appdataPath) + '/Generator CSV/format-presets/%s.fmt' % preset, 'w', 'utf-8') as file: + for x in content: + file.write('%s(%s) = %s\n' % (x, (content[x])[1], (content[x][0]))) + except Exception as exceptInfo: + MSG('E0017', False, exceptInfo) + return False + return True + + + # Funkcja zwracająca listę presetów + def getList(self): + self.__checkIfFolderExist() + filesList = OS.listdir(str(VAR.appdataPath) + '/Generator CSV/format-presets') + formatPresetsList = [] + for x in filesList: + if x[-4:] == '.fmt': + formatPresetsList.append(x[:-4]) + else: + continue + return formatPresetsList + + + # Funkcje sprawdzające istnienie + def __checkIfFolderExist(self): + checkAppdata() + + def __checkIfRecordExist(self, content, record): + if record in list(content.keys()): + return [True] + else: + return [False, 'Brak danych - klucz: %s' % record] + + + # Funkcje sprawdzające poprawność rekordu + def __checkB(self, write, record, var): + if write: + if var == True: + var = '1' + elif var == False: + var = '0' + else: + return [False, 'Niepoprawne dane - klucz: %s' % record] + else: + try: + var = int(var) + except: + return [False, 'Niepoprawne dane - klucz: %s' % record] + if var != 0 and var != 1: + return [False, 'Niepoprawne dane - klucz: %s' % record] + else: + if var == 0: + var = False + else: + var = True + return [True, var] + + def __checkSs(self, record, var): + check = var + check = check.strip('') + for x in check: + if x not in VAR.allowedCharactersInSeparator: + return [False, 'Niepoprawne dane - klucz: %s' % record] + return [True, var] + + def __checkAs(self, write, record, var): + if write: + check = var + for x in check: + x = x.strip('') + for y in x: + if y not in VAR.allowedCharactersInSeparator: + return [False, 'Niepoprawne dane - klucz: %s' % record] + var = str(var) + else: + new_contentVar = (var)[2:-2].split("', '") + check = new_contentVar + for x in check: + x = x.strip('') + for y in x: + if y not in VAR.allowedCharactersInSeparator: + return [False, 'Niepoprawne dane - klucz: %s' % record] + var = new_contentVar + return [True, var] + + def __checkI(self, write, record, var): + if write: + try: + var = int(var) + except: + return (False, 'Niepoprawne dane - klucz: %s' % record) + var = str(var) + else: + try: + var = int(var) + except: + return (False, 'Niepoprawne dane - klucz: %s' % record) + return [True, var] + + def __checkSc(self, record, var): + if var not in VAR.allowedCoding: + return [False, 'Niepoprawne dane - klucz: %s' % record] + return [True, var] + + + +FMT = FMT() + + + + + +# ---------------------------------- # Przetwarzanie plików # ----------------------------------- # + +class dataProcess: + def start(self, files): + checkingOutput = [] + + testOutput = self.__checkIfAtLeastOneInputFileIsFilled(files[:-1]) + checkingOutput.append(testOutput[0]) + if not testOutput[0]: + return checkingOutput + filledFiles = testOutput[1] + + testOutput = self.__checkIfInputFilesIsReadable(files[:-1], filledFiles) + checkingOutput.append(testOutput) + if not testOutput: + return checkingOutput + + testOutput = self.__checkIfInputFilesFormatPresetsExist(files[:-1], filledFiles) + checkingOutput.append(testOutput) + if not testOutput: + return checkingOutput + + input = [] + for x in filledFiles: + input.append(files[x]) + output = files[-1] + + try: + data = self.__getData(input) + except: + checkingOutput.append(False) + return checkingOutput + else: + checkingOutput.append(True) + + for x in data: + student = x[0] + login = x[1] + loginCheckingOutput = self.__checkLogin(login, student) + if not loginCheckingOutput[0]: + loginCheckingOutput[1] = loginCheckingOutput[1] + str(x[1:]) + checkingOutput.append(loginCheckingOutput) + return checkingOutput + fname = x[2] + fnameCheckingOutput = self.__checkFname(fname) + if not fnameCheckingOutput[0]: + fnameCheckingOutput[1] = fnameCheckingOutput[1] + str(x[1:]) + checkingOutput.append(fnameCheckingOutput) + return checkingOutput + lname = x[3] + lnameCheckingOutput = self.__checkLname(lname) + if not lnameCheckingOutput[0]: + lnameCheckingOutput[1] = lnameCheckingOutput[1] + str(x[1:]) + checkingOutput.append(lnameCheckingOutput) + return checkingOutput + if student: + school = x[4] + schoolCheckingOutput = self.__checkSchool(school) + if not schoolCheckingOutput[0]: + schoolCheckingOutput[1] = schoolCheckingOutput[1] + str(x[1:]) + checkingOutput.append(schoolCheckingOutput) + return checkingOutput + classX = x[5] + classCheckingOutput = self.__checkClass(classX, school) + if not classCheckingOutput[0]: + classCheckingOutput[1] = classCheckingOutput[1] + str(x[1:]) + checkingOutput.append(classCheckingOutput) + return checkingOutput + checkingOutput.append([True]) + amount = len(data) + + try: + data = self.__processData(data) + except: + checkingOutput.append(False) + return checkingOutput + else: + checkingOutput.append(True) + + testOutput = self.__checkIfCreatingOutputFilesIsPossible(files[-1]) + checkingOutput.append(testOutput) + if not testOutput: + return checkingOutput + + try: + self.__saveData(output, data) + except: + checkingOutput.append([False]) + return checkingOutput + else: + checkingOutput.append([True, amount]) + return checkingOutput + + + # Funkcje sprawdzające istnienie + def __checkIfAtLeastOneInputFileIsFilled(self, files): + filledFiles = [] + index = 0 + for x in files: + if not (x[0] == '' or x[1] == ''): + filledFiles.append(index) + index += 1 + if len(filledFiles) != 0: + return [True, filledFiles] + else: + return [False] + + def __checkIfInputFilesIsReadable(self, files, filledFiles): + for x in filledFiles: + try: + check = CD.open((files[x])[0], 'r', FMT.R((files[x])[1], 'inputCoding')) + except: + return False + return True + + def __checkIfInputFilesFormatPresetsExist(self, files, filledFiles): + for x in filledFiles: + if (files[x])[1] not in FMT.getList(): + return False + return True + + def __checkIfCreatingOutputFilesIsPossible(self, files): + if files[0] == files[1]: + return False + try: + check = CD.open(files[0], 'w', CFG.R('mailOutputCoding')) + check = CD.open(files[1], 'w', CFG.R('officeOutputCoding')) + except: + return False + return True + + + # Funkcje sprawdzające poprawność + def __checkLogin(self, var, student): + if student and var[-1] != 'u': + return [False, 'Brak końcówki "u" w loginie ucznia: '] + if student: + try: + x = int(var[:-1]) + except: + return [False, 'Niedozwolone znaki w loginie osoby: '] + else: + try: + x = int(var) + except: + return [False, 'Niedozwolone znaki w loginie osoby: '] + return [True] + + def __checkFname(self, var): + if not var.isalpha(): + return [False, 'Niedozwolone znaki w imieniu osoby: '] + return [True] + + def __checkLname(self, var): + if not var.isalpha(): + return [False, 'Niedozwolone znaki w nazwisku osoby: '] + return [True] + + def __checkSchool(self, var): + allowedSchools = [x[0] for x in CFG.R('schoolData')] + if var not in allowedSchools: + return [False, 'Niewspierana szkoła w danych osoby: '] + return [True] + + def __checkClass(self, var, school): + if len(var) != 2: + return [False, 'Niepoprawny format klasy w danych osoby: '] + if not var[0].isdigit(): + return [False, 'Niepoprawny format klasy w danych osoby: '] + if not var[1].isalpha(): + return [False, 'Niepoprawny format klasy w danych osoby: '] + schoolData = {} + for x in CFG.R('schoolData'): + schoolData[x[0]] = x[1] + if int(var[0]) == 0 or int(var[0]) > schoolData[school]: + return [False, 'Numer klasy nie zgadza się z ilością klas szkoły w danych osoby: '] + return [True] + + + + # Funkcje operujące na danych + def __getData(self, input): + data = [] + for x in input: + path = x[0] + format = x[1] + personSeparator = FMT.R(format, 'personSeparator').replace('', '\r\n') + linesSeparator = FMT.R(format, 'rowSeparator').replace('', '\r\n') + dataSeparators = [x.replace('', '\n') for x in FMT.R(format, 'dataSeparators')] + loginLocation = [FMT.R(format, 'loginRow'), FMT.R(format, 'loginPositionInRow')] + fnameLocation = [FMT.R(format, 'fnameRow'), FMT.R(format, 'fnamePositionInRow')] + lnameLocation = [FMT.R(format, 'lnameRow'), FMT.R(format, 'lnamePositionInRow')] + schoolLocation = [FMT.R(format, 'schoolRow'), FMT.R(format, 'schoolPositionInRow')] + classLocation = [FMT.R(format, 'classRow'), FMT.R(format, 'classPositionInRow')] + student = FMT.R(format, 'student') + file = CD.open(path, 'r', FMT.R(format, 'inputCoding')).read().split(personSeparator) + for x in file: + lines = x.split(linesSeparator) + dataX = [] + for line in lines: + line = [line] + for a in dataSeparators: + line2 = [] + for b in line: + line2 += b.split(a) + line = line2 + dataX.append(line) + login = dataX[loginLocation[0] - 1][loginLocation[1] - 1] + fname = dataX[fnameLocation[0] - 1][fnameLocation[1] - 1] + lname = dataX[lnameLocation[0] - 1][lnameLocation[1] - 1] + if student: + school = dataX[schoolLocation[0] - 1][schoolLocation[1] - 1] + classX = dataX[classLocation[0] - 1][classLocation[1] - 1] + data.append([student, login, fname, lname, school, classX]) + else: + data.append([student, login, fname, lname]) + return data + + def __processData(self, data): + mailData = [] + officeData = [] + schoolData = {} + for x in CFG.R('schoolData'): + schoolData[x[0]] = [x[1], x[2]] + for x in data: + mail = '' + office = '' + mail += x[2].lower().replace('ę', 'e').replace('ó', 'o').replace('ą', 'a').replace('ś', 's').replace('ł', 'l').replace('ż', 'z').replace('ź', 'z').replace('ć', 'c').replace('ń', 'n') + mail += '.' + mail += x[3].lower().replace('ę', 'e').replace('ó', 'o').replace('ą', 'a').replace('ś', 's').replace('ł', 'l').replace('ż', 'z').replace('ź', 'z').replace('ć', 'c').replace('ń', 'n') + if x[0]: + classIndicator = '' + actualYear = TM.localtime() + schoolDuration = (schoolData[x[4]])[0] + if actualYear[1] < CFG.R('schoolyearStart')['M'] or (actualYear[1] == CFG.R('schoolyearStart')['M'] and actualYear[2] < CFG.R('schoolyearStart')['D']): + yearOfGraduation = actualYear[0] + (schoolDuration - int((x[5])[0])) + else: + yearOfGraduation = actualYear[0] + (schoolDuration - int((x[5])[0])) + 1 + mail += str(yearOfGraduation) + if (schoolData[x[4]])[1]: + mail += x[4].lower() + else: + mail += (x[5])[1].lower() + mail += '@' + mail += CFG.R('domain') + office += mail + mail += ',' + mail += x[1] + mail += ':' + mail += (x[2])[0].lower().replace('ę', 'e').replace('ó', 'o').replace('ą', 'a').replace('ś', 's').replace('ł', 'l').replace('ż', 'z').replace('ź', 'z').replace('ć', 'c').replace('ń', 'n').upper() + mail += (x[3])[0].lower().replace('ę', 'e').replace('ó', 'o').replace('ą', 'a').replace('ś', 's').replace('ł', 'l').replace('ż', 'z').replace('ź', 'z').replace('ć', 'c').replace('ń', 'n').upper() + mail += ',' + mail += str(CFG.R('quota')) + office += ',' + office += x[2] + office += ',' + office += x[3] + office += ',' + office += '%s %s' % (x[2], x[3]) + office += ',' + if x[0]: + office += 'uczeń' + else: + office += 'nauczyciel' + office += ',' + if x[0]: + office += str(yearOfGraduation) + if (schoolData[x[4]])[1]: + office += x[4].lower() + else: + office += (x[5])[1].lower() + office += ',' + office += ',' + office += ',' + office += ',' + office += ',' + office += ',' + office += ',' + office += ',' + office += ',' + office += CFG.R('country') + mailData.append(mail) + officeData.append(office) + return [mailData, officeData] + + def __saveData(self, output, data): + mailPath = output[0] + officePath = output[1] + mailData = data[0] + officeData = data[1] + with CD.open(mailPath, 'w', CFG.R('mailOutputCoding')) as mail: + if CFG.R('ifHeadlineInMail'): + mail.write(CFG.R('headlineInMail') + '\n') + mail.write('\n'.join(mailData)) + with CD.open(officePath, 'w', CFG.R('officeOutputCoding')) as office: + if CFG.R('ifHeadlineInOffice'): + office.write(CFG.R('headlineInOffice') + '\n') + office.write('\n'.join(officeData)) + + + +dataProcess = dataProcess() + + + + + +# ------------------------------------------- # GUI # ------------------------------------------- # + +class mainWindow: + def __init__(self, master): + # Okno + self.master = master + master.title('%s %s %s' % (VAR.programName, VAR.programVersion, VAR.programVersionStage)) + master.geometry('%ix%i' % (GUI.R('windowWidth'), GUI.R('windowHeight'))) + master.resizable(width = GUI.R('windowWidthResizable'), height = GUI.R('windowHeightResizable')) + master.configure(bg = GUI.R('windowMainBG')) + master.iconbitmap(GUI.R('mainIcon')) + + + + + # Theme + TKttk.Style().theme_create("main", parent = "default", settings = { + "mainMenu.TNotebook": { + "configure": { + "background": GUI.R('mainMenuBG'), + "tabposition": GUI.R('mainMenuPosition'), + "borderwidth": GUI.R('tabFramesBorderWidth'), + }, + }, + "mainMenu.TNotebook.Tab": { + "configure": { + "background": GUI.R('unselectedTabBG'), + "borderwidth": GUI.R('menuTabsBorderWidth'), + "padding": GUI.R('menuTabsPadding'), + }, + "map": { + "background": [ + ("selected", GUI.R('selectedTabBG')), + ("disabled", GUI.R('disabledTabBG')), + ] + } + }, + "mainMenuTabFrame.TFrame": { + "configure": { + "background": GUI.R('tabFrameBG'), + }, + }, + "tabHeader.TLabel": { + "configure": { + "font": GUI.R('headerFont'), + "background": GUI.R('headerBG'), + "foreground": GUI.R('headerTextColor'), + "padding": GUI.R('headerPadding'), + "anchor": GUI.R('headerTextAnchor'), + }, + }, + "contentTabFrame.TFrame": { + "configure": { + "background": GUI.R('contentTabFrameBG'), + }, + }, + "layoutFrame.TFrame": { + "configure": { + "background": GUI.R('layoutFrameBG'), + }, + }, + "label1.TLabel": { + "configure": { + "background": GUI.R('label1BG'), + "foreground": GUI.R('label1TextColor'), + "font": GUI.R('label1Font'), + }, + }, + "label2.TLabel": { + "configure": { + "background": GUI.R('label2BG'), + "foreground": GUI.R('label2TextColor'), + "font" : GUI.R('label2Font') + }, + }, + "label3.TLabel": { + "configure": { + "background": GUI.R('label3BG'), + "foreground": GUI.R('label3TextColor'), + "font" : GUI.R('label3Font') + }, + }, + "label4.TLabel": { + "configure": { + "background": GUI.R('label4BG'), + "foreground": GUI.R('label4TextColor'), + "font": GUI.R('label4Font'), + }, + }, + "combobox1.TCombobox": { + "configure": { + "arrowcolor": GUI.R('combobox1ArrowColor'), + "background": GUI.R('combobox1ButtonColor'), + "bordercolor": GUI.R('combobox1BorderColor'), + "fieldbackground": GUI.R('combobox1FieldBackground'), + "foreground": GUI.R('combobox1TextColor'), + "relief": GUI.R('combobox1Relief'), + "borderwidth": GUI.R('combobox1BorderWidth'), + "padding": GUI.R('combobox1Padding'), + }, + }, + "combobox2.TCombobox": { + "configure": { + "arrowcolor": GUI.R('combobox2ArrowColor'), + "background": GUI.R('combobox2ButtonColor'), + "bordercolor": GUI.R('combobox2BorderColor'), + "fieldbackground": GUI.R('combobox2FieldBackground'), + "foreground": GUI.R('combobox2TextColor'), + "relief": GUI.R('combobox2Relief'), + "borderwidth": GUI.R('combobox2BorderWidth'), + "padding": GUI.R('combobox2Padding'), + }, + }, + "button1.TButton": { + "configure": { + "anchor": GUI.R('button1TextAnchor'), + "background": GUI.R('button1Background'), + "foreground": GUI.R('button1Foreground'), + "padding": GUI.R('button1Padding'), + }, + }, + "button2.TButton": { + "configure": { + "anchor": GUI.R('button2TextAnchor'), + "background": GUI.R('button2Background'), + "padding": GUI.R('button2Padding'), + }, + }, + "separator1.TSeparator": { + "configure": { + "background": GUI.R('separator1BG'), + }, + }, + "spinbox1.TSpinbox": { + "configure": { + "arrowcolor": GUI.R('spinbox1ArrowColor'), + "fieldbackground": GUI.R('spinbox1FieldBackground'), + "relief": GUI.R('spinbox1Relief'), + "borderwidth": GUI.R('spinbox1BorderWidth'), + "foreground": GUI.R('spinbox1TextColor'), + "background": GUI.R('spinbox1ButtonColor'), + "padding" : GUI.R('spinbox1Padding'), + }, + }, + "entry1.TEntry": { + "configure": { + "fieldbackground": GUI.R('entry1FieldBackground'), + "relief": GUI.R('entry1Relief'), + "borderwidth": GUI.R('entry1BorderWidth'), + "padding": GUI.R('entry1Padding'), + "foreground": GUI.R('entry1TextColor'), + }, + }, + }) + TKttk.Style().theme_use("main") + + + + + # Menu główne + self.mainMenu = TKttk.Notebook(master, width = master.winfo_width() - (2 * GUI.R('menuTabsPadding') + GUI.R('tabIconsSize')), height = master.winfo_height()) + self.mainMenu.config(style = "mainMenu.TNotebook") + self.mainMenu.grid(row = 0) + + # Ikona + self.iconTab = TKttk.Frame(self.mainMenu) + self.iconTabImg = PLimg.open(GUI.R('iconTabIcon')) + self.iconTabImg = self.iconTabImg.resize((GUI.R('tabIconsSize'), GUI.R('tabIconsSize')), PLimg.ANTIALIAS) + self.iconTabImg = PLitk.PhotoImage(self.iconTabImg) + self.mainMenu.add(self.iconTab, image = self.iconTabImg, state = TK.DISABLED) + + + + + # TAB1 - Generator #################################################### + + self.generateTab = TKttk.Frame(self.mainMenu) + self.generateTab.config(style = "mainMenuTabFrame.TFrame") + self.generateTabImg = PLimg.open(GUI.R('generateTabIcon')) + self.generateTabImg = self.generateTabImg.resize((GUI.R('tabIconsSize'), GUI.R('tabIconsSize')), PLimg.ANTIALIAS) + self.generateTabImg = PLitk.PhotoImage(self.generateTabImg) + self.mainMenu.add(self.generateTab, image = self.generateTabImg, state = TK.NORMAL) + + + # Nagłówek + self.generateHeader = TKttk.Label(self.generateTab) + self.generateHeader.config(style = 'tabHeader.TLabel') + self.generateHeader.config(text = 'GENERATOR CSV') + self.generateHeader.pack(fill = GUI.R('headerFill')) + + + # Zawartość + self.generateFrame = TKttk.Frame(self.generateTab) + self.generateFrame.config(style = 'contentTabFrame.TFrame') + self.generateFrame.pack(fill = GUI.R('contentTabFrameFill'), expand = GUI.R('contentTabFrameExpand'), padx = GUI.R('tabFramePadding'), pady = GUI.R('tabFramePadding')) + + + # (1) Pliki ################################################# + + self.generateFilesFrame = TKttk.Frame(self.generateFrame) + self.generateFilesFrame.config(style = 'layoutFrame.TFrame') + self.generateFilesFrame.pack(fill = TK.BOTH, expand = 1) + + # (2) Pliki wejściowe ############################# + + self.generateInputFilesFrame = TKttk.Frame(self.generateFilesFrame) + self.generateInputFilesFrame.config(style = 'layoutFrame.TFrame') + self.generateInputFilesFrame.pack(fill = TK.BOTH, expand = 1, padx = GUI.R('outsidelayoutFramesPadX')) + + # (3) Plik źródłowy 1 ################### + + self.GIF1Frame = TKttk.Frame(self.generateInputFilesFrame) + self.GIF1Frame.config(style = 'layoutFrame.TFrame') + self.GIF1Frame.pack(fill = TK.X, expand = 1, pady = int((GUI.R('GIFFrameSeparators')/2))) + + # "Plik źródłowy (1)" + self.GIF1Label = TKttk.Label(self.GIF1Frame) + self.GIF1Label.config(style = 'label1.TLabel') + self.GIF1Label.config(width = GUI.R('generateFilesLabelWidth')) + self.GIF1Label.config(anchor = GUI.R('generateFilesLabelAnchor')) + self.GIF1Label.config(padding = ('0 0 %s 0' % str(2 * GUI.R('generateInputFilesPadding')))) + self.GIF1Label.config(text = 'Plik źródłowy (1)') + self.GIF1Label.pack(side = TK.LEFT) + + # Plik żródłowy (1) - Ustawienia + self.GIF1SFrame = TKttk.Frame(self.GIF1Frame) + self.GIF1SFrame.config(style = 'layoutFrame.TFrame') + self.GIF1SFrame.pack(side = TK.RIGHT, fill = TK.X, expand = 1) + + # Lokalizacja + self.GIF1SLocalizationFrame = TKttk.Frame(self.GIF1SFrame) + self.GIF1SLocalizationFrame.config(style = 'layoutFrame.TFrame') + self.GIF1SLocalizationFrame.pack(side = TK.TOP, fill = TK.X, expand = 1, pady = GUI.R('generateInputFilesPadding')) + + # Lokalizacja - Entry + self.GIF1SLocalizationEntryVar = TK.StringVar() + self.GIF1SLocalizationEntry = TKttk.Entry(self.GIF1SLocalizationFrame) + self.GIF1SLocalizationEntry.config(style = 'entry1.TEntry') + self.GIF1SLocalizationEntry.config(textvariable = self.GIF1SLocalizationEntryVar) + self.GIF1SLocalizationEntry.pack(side = TK.LEFT, expand = 1, fill = TK.X, padx = GUI.R('generateInputFilesPadding')) + + # Lokalizacja - Button + self.GIF1SLocalizationButton = TKttk.Button(self.GIF1SLocalizationFrame) + self.GIF1SLocalizationButton.config(style = 'button1.TButton') + self.GIF1SLocalizationButton.config(text = 'Przeglądaj') + self.GIF1SLocalizationButton.config(command = self.GIF1SLocalizationButtonAction) + self.GIF1SLocalizationButton.pack(side = TK.RIGHT, padx = GUI.R('generateInputFilesPadding')) + + # Format + self.GIF1SFormatFrame = TKttk.Frame(self.GIF1SFrame) + self.GIF1SFormatFrame.config(style = 'layoutFrame.TFrame') + self.GIF1SFormatFrame.pack(side = TK.BOTTOM, fill = TK.X, expand = 1, pady = GUI.R('generateInputFilesPadding')) + + # Format - Label + self.GIF1SFormatLabel = TKttk.Label(self.GIF1SFormatFrame) + self.GIF1SFormatLabel.config(style = 'label2.TLabel') + self.GIF1SFormatLabel.config(text = 'Format') + self.GIF1SFormatLabel.pack(side = TK.LEFT, padx = GUI.R('generateInputFilesPadding')) + + # Format - Combobox + self.GIF1SFormatComboboxVar = TK.StringVar() + self.GIF1SFormatCombobox = TKttk.Combobox(self.GIF1SFormatFrame) + self.GIF1SFormatCombobox.config(style = 'combobox1.TCombobox') + self.GIF1SFormatCombobox.option_add("*TCombobox*Listbox.background", GUI.R('combobox1ListBoxBackground')) + self.GIF1SFormatCombobox.option_add("*TCombobox*Listbox.foreground", GUI.R('combobox1ListBoxForeground')) + self.GIF1SFormatCombobox.option_add("*TCombobox*Listbox.selectBackground", GUI.R('combobox1ListBoxSelectBackground')) + self.GIF1SFormatCombobox.option_add("*TCombobox*Listbox.selectForeground", GUI.R('combobox1ListBoxSelectForeground')) + self.GIF1SFormatCombobox.config(state = 'readonly') + self.GIF1SFormatCombobox.config(textvariable = self.GIF1SFormatComboboxVar) + self.GIF1SFormatCombobox['values'] = tuple(FMT.getList()) + self.GIF1SFormatCombobox.pack(side = TK.LEFT, expand = 1, fill = TK.X, padx = GUI.R('generateInputFilesPadding')) + + ######################################### + + # (3) Plik źródłowy 2 ################### + + self.GIF2Frame = TKttk.Frame(self.generateInputFilesFrame) + self.GIF2Frame.config(style = 'layoutFrame.TFrame') + self.GIF2Frame.pack(fill = TK.X, expand = 1, pady = int((GUI.R('GIFFrameSeparators')/2))) + + # "Plik źródłowy (1)" + self.GIF2Label = TKttk.Label(self.GIF2Frame) + self.GIF2Label.config(style = 'label1.TLabel') + self.GIF2Label.config(width = GUI.R('generateFilesLabelWidth')) + self.GIF2Label.config(anchor = GUI.R('generateFilesLabelAnchor')) + self.GIF2Label.config(padding = ('0 0 %s 0' % str(2 * GUI.R('generateInputFilesPadding')))) + self.GIF2Label.config(text = 'Plik źródłowy (2)') + self.GIF2Label.pack(side = TK.LEFT) + + # Plik żródłowy (1) - Ustawienia + self.GIF2SFrame = TKttk.Frame(self.GIF2Frame) + self.GIF2SFrame.config(style = 'layoutFrame.TFrame') + self.GIF2SFrame.pack(side = TK.RIGHT, fill = TK.X, expand = 1) + + # Lokalizacja + self.GIF2SLocalizationFrame = TKttk.Frame(self.GIF2SFrame) + self.GIF2SLocalizationFrame.config(style = 'layoutFrame.TFrame') + self.GIF2SLocalizationFrame.pack(side = TK.TOP, fill = TK.X, expand = 1, pady = GUI.R('generateInputFilesPadding')) + + # Lokalizacja - Entry + self.GIF2SLocalizationEntryVar = TK.StringVar() + self.GIF2SLocalizationEntry = TKttk.Entry(self.GIF2SLocalizationFrame) + self.GIF2SLocalizationEntry.config(style = 'entry1.TEntry') + self.GIF2SLocalizationEntry.config(textvariable = self.GIF2SLocalizationEntryVar) + self.GIF2SLocalizationEntry.pack(side = TK.LEFT, expand = 1, fill = TK.X, padx = GUI.R('generateInputFilesPadding')) + + # Lokalizacja - Button + self.GIF2SLocalizationButton = TKttk.Button(self.GIF2SLocalizationFrame) + self.GIF2SLocalizationButton.config(style = 'button1.TButton') + self.GIF2SLocalizationButton.config(text = 'Przeglądaj') + self.GIF2SLocalizationButton.config(command = self.GIF2SLocalizationButtonAction) + self.GIF2SLocalizationButton.pack(side = TK.RIGHT, padx = GUI.R('generateInputFilesPadding')) + + # Format + self.GIF2SFormatFrame = TKttk.Frame(self.GIF2SFrame) + self.GIF2SFormatFrame.config(style = 'layoutFrame.TFrame') + self.GIF2SFormatFrame.pack(side = TK.BOTTOM, fill = TK.X, expand = 1, pady = GUI.R('generateInputFilesPadding')) + + # Format - Label + self.GIF2SFormatLabel = TKttk.Label(self.GIF2SFormatFrame) + self.GIF2SFormatLabel.config(style = 'label2.TLabel') + self.GIF2SFormatLabel.config(text = 'Format') + self.GIF2SFormatLabel.pack(side = TK.LEFT, padx = GUI.R('generateInputFilesPadding')) + + # Format - Combobox + self.GIF2SFormatComboboxVar = TK.StringVar() + self.GIF2SFormatCombobox = TKttk.Combobox(self.GIF2SFormatFrame) + self.GIF2SFormatCombobox.config(style = 'combobox1.TCombobox') + self.GIF2SFormatCombobox.option_add("*TCombobox*Listbox.background", GUI.R('combobox1ListBoxBackground')) + self.GIF2SFormatCombobox.option_add("*TCombobox*Listbox.foreground", GUI.R('combobox1ListBoxForeground')) + self.GIF2SFormatCombobox.option_add("*TCombobox*Listbox.selectBackground", GUI.R('combobox1ListBoxSelectBackground')) + self.GIF2SFormatCombobox.option_add("*TCombobox*Listbox.selectForeground", GUI.R('combobox1ListBoxSelectForeground')) + self.GIF2SFormatCombobox.config(state = 'readonly') + self.GIF2SFormatCombobox.config(textvariable = self.GIF2SFormatComboboxVar) + self.GIF2SFormatCombobox['values'] = tuple(FMT.getList()) + self.GIF2SFormatCombobox.pack(side = TK.LEFT, expand = 1, fill = TK.X, padx = GUI.R('generateInputFilesPadding')) + + ######################################### + + # (3) Plik źródłowy 3 ################### + + self.GIF3Frame = TKttk.Frame(self.generateInputFilesFrame) + self.GIF3Frame.config(style = 'layoutFrame.TFrame') + self.GIF3Frame.pack(fill = TK.X, expand = 1, pady = int((GUI.R('GIFFrameSeparators')/2))) + + # "Plik źródłowy (1)" + self.GIF3Label = TKttk.Label(self.GIF3Frame) + self.GIF3Label.config(style = 'label1.TLabel') + self.GIF3Label.config(width = GUI.R('generateFilesLabelWidth')) + self.GIF3Label.config(anchor = GUI.R('generateFilesLabelAnchor')) + self.GIF3Label.config(padding = ('0 0 %s 0' % str(2 * GUI.R('generateInputFilesPadding')))) + self.GIF3Label.config(text = 'Plik źródłowy (3)') + self.GIF3Label.pack(side = TK.LEFT) + + # Plik żródłowy (1) - Ustawienia + self.GIF3SFrame = TKttk.Frame(self.GIF3Frame) + self.GIF3SFrame.config(style = 'layoutFrame.TFrame') + self.GIF3SFrame.pack(side = TK.RIGHT, fill = TK.X, expand = 1) + + # Lokalizacja + self.GIF3SLocalizationFrame = TKttk.Frame(self.GIF3SFrame) + self.GIF3SLocalizationFrame.config(style = 'layoutFrame.TFrame') + self.GIF3SLocalizationFrame.pack(side = TK.TOP, fill = TK.X, expand = 1, pady = GUI.R('generateInputFilesPadding')) + + # Lokalizacja - Entry + self.GIF3SLocalizationEntryVar = TK.StringVar() + self.GIF3SLocalizationEntry = TKttk.Entry(self.GIF3SLocalizationFrame) + self.GIF3SLocalizationEntry.config(style = 'entry1.TEntry') + self.GIF3SLocalizationEntry.config(textvariable = self.GIF3SLocalizationEntryVar) + self.GIF3SLocalizationEntry.pack(side = TK.LEFT, expand = 1, fill = TK.X, padx = GUI.R('generateInputFilesPadding')) + + # Lokalizacja - Button + self.GIF3SLocalizationButton = TKttk.Button(self.GIF3SLocalizationFrame) + self.GIF3SLocalizationButton.config(style = 'button1.TButton') + self.GIF3SLocalizationButton.config(text = 'Przeglądaj') + self.GIF3SLocalizationButton.config(command = self.GIF3SLocalizationButtonAction) + self.GIF3SLocalizationButton.pack(side = TK.RIGHT, padx = GUI.R('generateInputFilesPadding')) + + # Format + self.GIF3SFormatFrame = TKttk.Frame(self.GIF3SFrame) + self.GIF3SFormatFrame.config(style = 'layoutFrame.TFrame') + self.GIF3SFormatFrame.pack(side = TK.BOTTOM, fill = TK.X, expand = 1, pady = GUI.R('generateInputFilesPadding')) + + # Format - Label + self.GIF3SFormatLabel = TKttk.Label(self.GIF3SFormatFrame) + self.GIF3SFormatLabel.config(style = 'label2.TLabel') + self.GIF3SFormatLabel.config(text = 'Format') + self.GIF3SFormatLabel.pack(side = TK.LEFT, padx = GUI.R('generateInputFilesPadding')) + + # Format - Combobox + self.GIF3SFormatComboboxVar = TK.StringVar() + self.GIF3SFormatCombobox = TKttk.Combobox(self.GIF3SFormatFrame) + self.GIF3SFormatCombobox.config(style = 'combobox1.TCombobox') + self.GIF3SFormatCombobox.option_add("*TCombobox*Listbox.background", GUI.R('combobox1ListBoxBackground')) + self.GIF3SFormatCombobox.option_add("*TCombobox*Listbox.foreground", GUI.R('combobox1ListBoxForeground')) + self.GIF3SFormatCombobox.option_add("*TCombobox*Listbox.selectBackground", GUI.R('combobox1ListBoxSelectBackground')) + self.GIF3SFormatCombobox.option_add("*TCombobox*Listbox.selectForeground", GUI.R('combobox1ListBoxSelectForeground')) + self.GIF3SFormatCombobox.config(state = 'readonly') + self.GIF3SFormatCombobox.config(textvariable = self.GIF3SFormatComboboxVar) + self.GIF3SFormatCombobox['values'] = tuple(FMT.getList()) + self.GIF3SFormatCombobox.pack(side = TK.LEFT, expand = 1, fill = TK.X, padx = GUI.R('generateInputFilesPadding')) + + ######################################### + + # (3) Plik źródłowy 4 ################### + + self.GIF4Frame = TKttk.Frame(self.generateInputFilesFrame) + self.GIF4Frame.config(style = 'layoutFrame.TFrame') + self.GIF4Frame.pack(fill = TK.X, expand = 1, pady = int((GUI.R('GIFFrameSeparators')/2))) + + # "Plik źródłowy (1)" + self.GIF4Label = TKttk.Label(self.GIF4Frame) + self.GIF4Label.config(style = 'label1.TLabel') + self.GIF4Label.config(width = GUI.R('generateFilesLabelWidth')) + self.GIF4Label.config(anchor = GUI.R('generateFilesLabelAnchor')) + self.GIF4Label.config(padding = ('0 0 %s 0' % str(2 * GUI.R('generateInputFilesPadding')))) + self.GIF4Label.config(text = 'Plik źródłowy (4)') + self.GIF4Label.pack(side = TK.LEFT) + + # Plik żródłowy (1) - Ustawienia + self.GIF4SFrame = TKttk.Frame(self.GIF4Frame) + self.GIF4SFrame.config(style = 'layoutFrame.TFrame') + self.GIF4SFrame.pack(side = TK.RIGHT, fill = TK.X, expand = 1) + + # Lokalizacja + self.GIF4SLocalizationFrame = TKttk.Frame(self.GIF4SFrame) + self.GIF4SLocalizationFrame.config(style = 'layoutFrame.TFrame') + self.GIF4SLocalizationFrame.pack(side = TK.TOP, fill = TK.X, expand = 1, pady = GUI.R('generateInputFilesPadding')) + + # Lokalizacja - Entry + self.GIF4SLocalizationEntryVar = TK.StringVar() + self.GIF4SLocalizationEntry = TKttk.Entry(self.GIF4SLocalizationFrame) + self.GIF4SLocalizationEntry.config(style = 'entry1.TEntry') + self.GIF4SLocalizationEntry.config(textvariable = self.GIF4SLocalizationEntryVar) + self.GIF4SLocalizationEntry.pack(side = TK.LEFT, expand = 1, fill = TK.X, padx = GUI.R('generateInputFilesPadding')) + + # Lokalizacja - Button + self.GIF4SLocalizationButton = TKttk.Button(self.GIF4SLocalizationFrame) + self.GIF4SLocalizationButton.config(style = 'button1.TButton') + self.GIF4SLocalizationButton.config(text = 'Przeglądaj') + self.GIF4SLocalizationButton.config(command = self.GIF4SLocalizationButtonAction) + self.GIF4SLocalizationButton.pack(side = TK.RIGHT, padx = GUI.R('generateInputFilesPadding')) + + # Format + self.GIF4SFormatFrame = TKttk.Frame(self.GIF4SFrame) + self.GIF4SFormatFrame.config(style = 'layoutFrame.TFrame') + self.GIF4SFormatFrame.pack(side = TK.BOTTOM, fill = TK.X, expand = 1, pady = GUI.R('generateInputFilesPadding')) + + # Format - Label + self.GIF4SFormatLabel = TKttk.Label(self.GIF4SFormatFrame) + self.GIF4SFormatLabel.config(style = 'label2.TLabel') + self.GIF4SFormatLabel.config(text = 'Format') + self.GIF4SFormatLabel.pack(side = TK.LEFT, padx = GUI.R('generateInputFilesPadding')) + + # Format - Combobox + self.GIF4SFormatComboboxVar = TK.StringVar() + self.GIF4SFormatCombobox = TKttk.Combobox(self.GIF4SFormatFrame) + self.GIF4SFormatCombobox.config(style = 'combobox1.TCombobox') + self.GIF4SFormatCombobox.option_add("*TCombobox*Listbox.background", GUI.R('combobox1ListBoxBackground')) + self.GIF4SFormatCombobox.option_add("*TCombobox*Listbox.foreground", GUI.R('combobox1ListBoxForeground')) + self.GIF4SFormatCombobox.option_add("*TCombobox*Listbox.selectBackground", GUI.R('combobox1ListBoxSelectBackground')) + self.GIF4SFormatCombobox.option_add("*TCombobox*Listbox.selectForeground", GUI.R('combobox1ListBoxSelectForeground')) + self.GIF4SFormatCombobox.config(state = 'readonly') + self.GIF4SFormatCombobox.config(textvariable = self.GIF4SFormatComboboxVar) + self.GIF4SFormatCombobox['values'] = tuple(FMT.getList()) + self.GIF4SFormatCombobox.pack(side = TK.LEFT, expand = 1, fill = TK.X, padx = GUI.R('generateInputFilesPadding')) + + ######################################### + + ################################################### + + # (2) Separator1 ################################## + + self.generateSeparator1 = TKttk.Separator(self.generateFilesFrame) + self.generateSeparator1.config(style = 'separator1.TSeparator') + self.generateSeparator1.config(orient = TK.HORIZONTAL) + self.generateSeparator1.pack(fill = TK.X, pady = GUI.R('generateHorizontalSeparatorPadY')) + + ################################################### + + # (2) Pliki wyjściowe ############################# + + self.generateOutputFilesFrame = TKttk.Frame(self.generateFilesFrame) + self.generateOutputFilesFrame.config(style = 'layoutFrame.TFrame') + self.generateOutputFilesFrame.pack(fill = TK.X, padx = GUI.R('outsidelayoutFramesPadX')) + + # (3) Poczta ############################ + + self.GOFMailFrame = TKttk.Frame(self.generateOutputFilesFrame) + self.GOFMailFrame.config(style = 'layoutFrame.TFrame') + self.GOFMailFrame.pack(pady = GUI.R('generateOutputFilesPadding'), fill = TK.X, expand = 1) + + # "Poczta" + self.GOFMailLabel = TKttk.Label(self.GOFMailFrame) + self.GOFMailLabel.config(style = 'label1.TLabel') + self.GOFMailLabel.config(width = GUI.R('generateFilesLabelWidth')) + self.GOFMailLabel.config(anchor = GUI.R('generateFilesLabelAnchor')) + self.GOFMailLabel.config(text = 'Poczta') + self.GOFMailLabel.pack(side = TK.LEFT) + + # Plik poczty - Lokalizacja (Entry) + self.GOFMailEntryVar = TK.StringVar() + self.GOFMailEntry = TKttk.Entry(self.GOFMailFrame) + self.GOFMailEntry.config(style = 'entry1.TEntry') + self.GOFMailEntry.config(textvariable = self.GOFMailEntryVar) + self.GOFMailEntry.pack(padx = 2 * GUI.R('generateOutputFilesPadding'), side = TK.LEFT, fill = TK.X, expand = 1) + + # Plik poczty - Lokalizacja (Button) + self.GOFMailButton = TKttk.Button(self.GOFMailFrame) + self.GOFMailButton.config(style = 'button1.TButton') + self.GOFMailButton.config(text = 'Przeglądaj') + self.GOFMailButton.config(command = self.GOFMailButtonAction) + self.GOFMailButton.pack(side = TK.LEFT) + + ######################################### + + # (3) Office ############################ + + self.GOFOfficeFrame = TKttk.Frame(self.generateOutputFilesFrame) + self.GOFOfficeFrame.config(style = 'layoutFrame.TFrame') + self.GOFOfficeFrame.pack(pady = GUI.R('generateOutputFilesPadding'), fill = TK.X, expand = 1) + + # "Office" + self.GOFOfficeLabel = TKttk.Label(self.GOFOfficeFrame) + self.GOFOfficeLabel.config(style = 'label1.TLabel') + self.GOFOfficeLabel.config(width = GUI.R('generateFilesLabelWidth')) + self.GOFOfficeLabel.config(anchor = GUI.R('generateFilesLabelAnchor')) + self.GOFOfficeLabel.config(text = 'Office') + self.GOFOfficeLabel.pack(side = TK.LEFT) + + # Plik office - Lokalizacja (Entry) + self.GOFOfficeEntryVar = TK.StringVar() + self.GOFOfficeEntry = TKttk.Entry(self.GOFOfficeFrame) + self.GOFOfficeEntry.config(style = 'entry1.TEntry') + self.GOFOfficeEntry.config(textvariable = self.GOFOfficeEntryVar) + self.GOFOfficeEntry.pack(padx = 2 * GUI.R('generateOutputFilesPadding'), side = TK.LEFT, fill = TK.X, expand = 1) + + # Plik office - Lokalizacja (Button) + self.GOFOfficeButton = TKttk.Button(self.GOFOfficeFrame) + self.GOFOfficeButton.config(style = 'button1.TButton') + self.GOFOfficeButton.config(text = 'Przeglądaj') + self.GOFOfficeButton.config(command = self.GOFOfficeButtonAction) + self.GOFOfficeButton.pack(side = TK.LEFT) + + ######################################### + + ################################################### + + ############################################################# + + # (1) Separator2 ########################################### + + self.generateSeparator2 = TKttk.Separator(self.generateFrame) + self.generateSeparator2.config(style = 'separator1.TSeparator') + self.generateSeparator2.config(orient = TK.HORIZONTAL) + self.generateSeparator2.pack(fill = TK.X, pady = GUI.R('generateHorizontalSeparatorPadY')) + + ############################################################# + + # (1) Przyciski ############################################# + + self.generateButtonsFrame = TKttk.Frame(self.generateFrame) + self.generateButtonsFrame.config(style = 'layoutFrame.TFrame') + self.generateButtonsFrame.pack(fill = TK.X, padx = GUI.R('outsidelayoutFramesPadX')) + + # Przycisk "START" + self.generateStartButton = TKttk.Button(self.generateButtonsFrame) + self.generateStartButton.config(style = 'button1.TButton') + self.generateStartButton.config(padding = GUI.R('generateStartButtonPadding')) + self.generateStartButton.config(text = 'START') + self.generateStartButton.config(command = self.generateStartButtonAction) + self.generateStartButton.pack(side = TK.LEFT, fill = TK.X, expand = 1, pady = GUI.R('generateStartButtonPadY')) + + ############################################################## + + ####################################################################### + + + + + # TAB3 - Format ####################################################### + + self.formatTab = TKttk.Frame(self.mainMenu) + self.formatTab.config(style = "mainMenuTabFrame.TFrame") + self.formatTabImg = PLimg.open(GUI.R('formatTabIcon')) + self.formatTabImg = self.formatTabImg.resize((GUI.R('tabIconsSize'), GUI.R('tabIconsSize')), PLimg.ANTIALIAS) + self.formatTabImg = PLitk.PhotoImage(self.formatTabImg) + self.mainMenu.add(self.formatTab, image = self.formatTabImg, state = TK.NORMAL) + + + # Nagłówek + self.formatHeader = TKttk.Label(self.formatTab) + self.formatHeader.config(style = 'tabHeader.TLabel') + self.formatHeader.config(text = 'FORMAT DANYCH') + self.formatHeader.pack(fill = GUI.R('headerFill')) + + + # Zawartość + self.formatFrame = TKttk.Frame(self.formatTab) + self.formatFrame.config(style = 'contentTabFrame.TFrame') + self.formatFrame.pack(fill = GUI.R('contentTabFrameFill'), expand = GUI.R('contentTabFrameExpand'), padx = GUI.R('tabFramePadding'), pady = GUI.R('tabFramePadding')) + + + # (1) Ładowanie presetu ##################################### + + self.loadingPresetFrame = TKttk.Frame(self.formatFrame) + self.loadingPresetFrame.config(style = 'layoutFrame.TFrame') + self.loadingPresetFrame.pack(fill = TK.X, side = TK.TOP, padx = GUI.R('outsidelayoutFramesPadX')) + + # "Wybierz preset do edycji lub wpisz nazwę nowego" + self.loadingListLabel = TKttk.Label(self.loadingPresetFrame) + self.loadingListLabel.config(style = 'label1.TLabel') + self.loadingListLabel.config(text = 'Wybierz preset do edycji lub wpisz nazwę nowego') + self.loadingListLabel.pack(side = TK.LEFT) + + # Rozwijana lista presetów + self.loadingListVar = TK.StringVar() + self.loadingList = TKttk.Combobox(self.loadingPresetFrame) + self.loadingList.config(textvariable = self.loadingListVar) + self.loadingList.config(style = 'combobox2.TCombobox') + self.loadingList.option_add("*TCombobox*Listbox.background", GUI.R('combobox2ListBoxBackground')) + self.loadingList.option_add("*TCombobox*Listbox.foreground", GUI.R('combobox2ListBoxForeground')) + self.loadingList.option_add("*TCombobox*Listbox.selectBackground", GUI.R('combobox2ListBoxSelectBackground')) + self.loadingList.option_add("*TCombobox*Listbox.selectForeground", GUI.R('combobox2ListBoxSelectForeground')) + self.loadingList.pack(side = TK.LEFT, padx = GUI.R('loadingListPadX'), fill = TK.X, expand = 1) + self.loadingList['values'] = tuple(FMT.getList()) + + # Przycisk "WCZYTAJ" + self.loadingButton = TKttk.Button(self.loadingPresetFrame) + self.loadingButton.config(style = 'button1.TButton') + self.loadingButton.config(command = self.loadingButtonAction) + self.loadingButton.config(width = GUI.R('loadingButtonWidth')) + self.loadingButton.config(text = 'WCZYTAJ') + self.loadingButton.pack(side = TK.RIGHT) + + ############################################################# + + # (1) Separator 1 ########################################### + + self.formatSeparator1 = TKttk.Separator(self.formatFrame) + self.formatSeparator1.config(style = 'separator1.TSeparator') + self.formatSeparator1.config(orient = TK.HORIZONTAL) + self.formatSeparator1.pack(fill = TK.X, pady = GUI.R('formatHorizontalSeparatorPadY')) + + ############################################################# + + # (1) Edycja presetu ######################################## + + self.editingPresetFrame = TKttk.Frame(self.formatFrame) + self.editingPresetFrame.config(style = 'layoutFrame.TFrame') + self.editingPresetFrame.pack(fill = TK.BOTH, expand = 1, padx = GUI.R('outsidelayoutFramesPadX')) + + # (2) Ustawienia ################################## + + self.editingPresetSettingsFrame = TKttk.Frame(self.editingPresetFrame) + self.editingPresetSettingsFrame.config(style = 'layoutFrame.TFrame') + self.editingPresetSettingsFrame.pack(fill = TK.BOTH, expand = 1) + + # (3) Inne ustawienia ################### + + self.editingPresetOSFrame = TKttk.Frame(self.editingPresetSettingsFrame) + self.editingPresetOSFrame.config(style = 'layoutFrame.TFrame') + self.editingPresetOSFrame.pack(fill = TK.BOTH, expand = 1, side = TK.LEFT) + + # (5) Typ osoby ############### + + self.EPOSTypeFrame = TKttk.Frame(self.editingPresetOSFrame) + self.EPOSTypeFrame.config(style = 'layoutFrame.TFrame') + self.EPOSTypeFrame.pack(fill = TK.X, expand = 1, pady = GUI.R('EPOSTypeFramePadY')) + + # "Typ osoby" + self.EPOSTypeLabel = TKttk.Label(self.EPOSTypeFrame) + self.EPOSTypeLabel.config(style = 'label1.TLabel') + self.EPOSTypeLabel.config(width = GUI.R('EPOSLabelWidth')) + self.EPOSTypeLabel.config(anchor = GUI.R('EPOSLabelAnchor')) + self.EPOSTypeLabel.config(text = 'Typ osoby') + self.EPOSTypeLabel.pack(side = TK.LEFT) + + # Radiobutton + self.EPOSTypeVar = TK.BooleanVar(value = True) + + self.EPOSTypeStudentRadiobutton = TK.Radiobutton(self.EPOSTypeFrame) + self.EPOSTypeStudentRadiobutton.config(background = GUI.R('radiobutton1Background')) + self.EPOSTypeStudentRadiobutton.config(foreground = GUI.R('radiobutton1TextColor')) + self.EPOSTypeStudentRadiobutton.config(selectcolor = GUI.R('radiobutton1IndicatorBackground')) + self.EPOSTypeStudentRadiobutton.config(activebackground = GUI.R('radiobutton1Background')) + self.EPOSTypeStudentRadiobutton.config(activeforeground = GUI.R('radiobutton1TextColor')) + self.EPOSTypeStudentRadiobutton.config(variable = self.EPOSTypeVar) + self.EPOSTypeStudentRadiobutton.config(value = True) + self.EPOSTypeStudentRadiobutton.config(state = TK.DISABLED) + self.EPOSTypeStudentRadiobutton.config(text = 'Uczniowie') + self.EPOSTypeStudentRadiobutton.pack(side = TK.RIGHT, fill = TK.X, expand = 1) + + self.EPOSTypeTeacherRadiobutton = TK.Radiobutton(self.EPOSTypeFrame) + self.EPOSTypeTeacherRadiobutton.config(background = GUI.R('radiobutton1Background')) + self.EPOSTypeTeacherRadiobutton.config(foreground = GUI.R('radiobutton1TextColor')) + self.EPOSTypeTeacherRadiobutton.config(selectcolor = GUI.R('radiobutton1IndicatorBackground')) + self.EPOSTypeTeacherRadiobutton.config(activebackground = GUI.R('radiobutton1Background')) + self.EPOSTypeTeacherRadiobutton.config(activeforeground = GUI.R('radiobutton1TextColor')) + self.EPOSTypeTeacherRadiobutton.config(variable = self.EPOSTypeVar) + self.EPOSTypeTeacherRadiobutton.config(value = False) + self.EPOSTypeTeacherRadiobutton.config(state = TK.DISABLED) + self.EPOSTypeTeacherRadiobutton.config(text = 'Nauczyciele') + self.EPOSTypeTeacherRadiobutton.pack(side = TK.RIGHT, fill = TK.X, expand = 1) + + ##################### + + # (5) Separator pomiedzy osobami + + self.EPOSPersonSeparatorFrame = TKttk.Frame(self.editingPresetOSFrame) + self.EPOSPersonSeparatorFrame.config(style = 'layoutFrame.TFrame') + self.EPOSPersonSeparatorFrame.pack(fill = TK.X, expand = 1, pady = GUI.R('EPOSPersonSeparatorFramePadY')) + + # "Separator pomiędzy osobami" + self.EPOSPersonSeparatorLabel = TKttk.Label(self.EPOSPersonSeparatorFrame) + self.EPOSPersonSeparatorLabel.config(style = 'label1.TLabel') + self.EPOSPersonSeparatorLabel.config(width = GUI.R('EPOSLabelWidth')) + self.EPOSPersonSeparatorLabel.config(anchor = GUI.R('EPOSLabelAnchor')) + self.EPOSPersonSeparatorLabel.config(text = 'Separator pomiędzy osobami') + self.EPOSPersonSeparatorLabel.pack(side = TK.LEFT) + + # Entry - Separator pomiedzy osobami + self.EPOSPersonSeparatorVar = TK.StringVar() + self.EPOSPersonSeparatorEntry = TKttk.Entry(self.EPOSPersonSeparatorFrame) + self.EPOSPersonSeparatorEntry.config(style = 'entry1.TEntry') + self.EPOSPersonSeparatorEntry.config(textvariable = self.EPOSPersonSeparatorVar) + self.EPOSPersonSeparatorEntry.config(state = TK.DISABLED) + self.EPOSPersonSeparatorEntry.pack(side = TK.RIGHT, fill = TK.X, expand = 1) + + ##################### + + # (5) Separator pomiedzy wierszami + + self.EPOSRowSeparatorFrame = TKttk.Frame(self.editingPresetOSFrame) + self.EPOSRowSeparatorFrame.config(style = 'layoutFrame.TFrame') + self.EPOSRowSeparatorFrame.pack(fill = TK.X, expand = 1, pady = GUI.R('EPOSRowSeparatorFramePadY')) + + # "Separator pomiędzy wierszami" + self.EPOSRowSeparatorLabel = TKttk.Label(self.EPOSRowSeparatorFrame) + self.EPOSRowSeparatorLabel.config(style = 'label1.TLabel') + self.EPOSRowSeparatorLabel.config(width = GUI.R('EPOSLabelWidth')) + self.EPOSRowSeparatorLabel.config(anchor = GUI.R('EPOSLabelAnchor')) + self.EPOSRowSeparatorLabel.config(text = 'Separator pomiędzy wierszami') + self.EPOSRowSeparatorLabel.pack(side = TK.LEFT) + + # Entry - Separator pomiedzy wierszami + self.EPOSRowSeparatorVar = TK.StringVar() + self.EPOSRowSeparatorEntry = TKttk.Entry(self.EPOSRowSeparatorFrame) + self.EPOSRowSeparatorEntry.config(style = 'entry1.TEntry') + self.EPOSRowSeparatorEntry.config(textvariable = self.EPOSRowSeparatorVar) + self.EPOSRowSeparatorEntry.config(state = TK.DISABLED) + self.EPOSRowSeparatorEntry.pack(side = TK.RIGHT, fill = TK.X, expand = 1) + + ##################### + + # (5) Separatory pomiedzy danymi + + self.EPOSDataSeparatorFrame = TKttk.Frame(self.editingPresetOSFrame) + self.EPOSDataSeparatorFrame.config(style = 'layoutFrame.TFrame') + self.EPOSDataSeparatorFrame.pack(fill = TK.BOTH, expand = 1, pady = GUI.R('EPOSDataSeparatorFramePadY')) + + # "Separatory pomiędzy danymi" + self.EPOSDataSeparatorLabel = TKttk.Label(self.EPOSDataSeparatorFrame) + self.EPOSDataSeparatorLabel.config(style = 'label1.TLabel') + self.EPOSDataSeparatorLabel.config(width = GUI.R('EPOSLabelWidth')) + self.EPOSDataSeparatorLabel.config(anchor = GUI.R('EPOSLabelAnchor')) + self.EPOSDataSeparatorLabel.config(text = 'Separatory pomiędzy danymi') + self.EPOSDataSeparatorLabel.pack(side = TK.LEFT) + + # Entry - Separator pomiedzy wierszami + self.EPOSDataSeparatorText = TK.Text(self.EPOSDataSeparatorFrame) + self.EPOSDataSeparatorText.config(state = TK.DISABLED) + self.EPOSDataSeparatorText.config(background = GUI.R('text1Background')) + self.EPOSDataSeparatorText.config(foreground = GUI.R('text1TextColor')) + self.EPOSDataSeparatorText.config(relief = GUI.R('text1Relief')) + self.EPOSDataSeparatorText.pack(side = TK.TOP, fill = TK.BOTH) + + ##################### + + ############################### + + # (5) Separator 2 ############# + + self.formatSeparator2 = TKttk.Separator(self.editingPresetSettingsFrame) + self.formatSeparator2.config(style = 'separator1.TSeparator') + self.formatSeparator2.config(orient = TK.VERTICAL) + self.formatSeparator2.pack(fill = TK.Y, padx = GUI.R('formatVerticalSeparatorPadY'), side = TK.LEFT) + + ############################### + + # (5) Lokalizacja danych ###### + + self.editingPresetDLFrame = TKttk.Frame(self.editingPresetSettingsFrame) + self.editingPresetDLFrame.config(style = 'layoutFrame.TFrame') + self.editingPresetDLFrame.pack(fill = TK.BOTH, side = TK.RIGHT) + self.editingPresetDLFrame.grid_columnconfigure(1, weight = 1) + self.editingPresetDLFrame.grid_columnconfigure(2, weight = 1) + + # C1 - "Wiersz" + self.EPDLC1Label = TKttk.Label(self.editingPresetDLFrame) + self.EPDLC1Label.config(style = 'label1.TLabel') + self.EPDLC1Label.config(text = 'Wiersz') + self.EPDLC1Label.grid(row = 0, column = 1, padx = GUI.R('EPDataLocalizationPadX'), pady = GUI.R('EPDataLocalizationPadY')) + + # C2 - "Pozycja w wierszu" + self.EPDLC2Label = TKttk.Label(self.editingPresetDLFrame) + self.EPDLC2Label.config(style = 'label1.TLabel') + self.EPDLC2Label.config(justify = TK.CENTER) + self.EPDLC2Label.config(text = 'Pozycja\nw wierszu') + self.EPDLC2Label.grid(row = 0, column = 2, padx = GUI.R('EPDataLocalizationPadX'), pady = GUI.R('EPDataLocalizationPadY')) + + # W1 - "Login" + self.EPDLW1Label = TKttk.Label(self.editingPresetDLFrame) + self.EPDLW1Label.config(style = 'label1.TLabel') + self.EPDLW1Label.config(text = 'Login') + self.EPDLW1Label.grid(row = 1, column = 0, padx = GUI.R('EPDataLocalizationPadX'), pady = GUI.R('EPDataLocalizationPadY')) + + # Lokalizacja loginu (wiersz) + self.EPDLLoginRowVar = TK.IntVar() + self.EPDLLoginRowSpinbox = TKttk.Spinbox(self.editingPresetDLFrame) + self.EPDLLoginRowSpinbox.config(textvariable = self.EPDLLoginRowVar) + self.EPDLLoginRowSpinbox.config(from_ = 0) + self.EPDLLoginRowSpinbox.config(to = 1000000) + self.EPDLLoginRowSpinbox.config(state = TK.DISABLED) + self.EPDLLoginRowSpinbox.config(style = 'spinbox1.TSpinbox') + self.EPDLLoginRowSpinbox.grid(row = 1, column = 1, padx = GUI.R('EPDataLocalizationPadX'), pady = GUI.R('EPDataLocalizationPadY')) + + # Lokalizacja loginu (pozycja w wierszu) + self.EPDLLoginPosInRowVar = TK.IntVar() + self.EPDLLoginPosInRowSpinbox = TKttk.Spinbox(self.editingPresetDLFrame) + self.EPDLLoginPosInRowSpinbox.config(textvariable = self.EPDLLoginPosInRowVar) + self.EPDLLoginPosInRowSpinbox.config(from_ = 0) + self.EPDLLoginPosInRowSpinbox.config(to = 1000000) + self.EPDLLoginPosInRowSpinbox.config(state = TK.DISABLED) + self.EPDLLoginPosInRowSpinbox.config(style = 'spinbox1.TSpinbox') + self.EPDLLoginPosInRowSpinbox.grid(row = 1, column = 2, padx = GUI.R('EPDataLocalizationPadX'), pady = GUI.R('EPDataLocalizationPadY')) + + # W2 - "Imię" + self.EPDLW2Label = TKttk.Label(self.editingPresetDLFrame) + self.EPDLW2Label.config(style = 'label1.TLabel') + self.EPDLW2Label.config(text = 'Imię') + self.EPDLW2Label.grid(row = 2, column = 0, padx = GUI.R('EPDataLocalizationPadX'), pady = GUI.R('EPDataLocalizationPadY')) + + # Lokalizacja imienia (wiersz) + self.EPDLFnameRowVar = TK.IntVar() + self.EPDLFnameRowSpinbox = TKttk.Spinbox(self.editingPresetDLFrame) + self.EPDLFnameRowSpinbox.config(textvariable = self.EPDLFnameRowVar) + self.EPDLFnameRowSpinbox.config(from_ = 0) + self.EPDLFnameRowSpinbox.config(to = 1000000) + self.EPDLFnameRowSpinbox.config(state = TK.DISABLED) + self.EPDLFnameRowSpinbox.config(style = 'spinbox1.TSpinbox') + self.EPDLFnameRowSpinbox.grid(row = 2, column = 1, padx = GUI.R('EPDataLocalizationPadX'), pady = GUI.R('EPDataLocalizationPadY')) + + # Lokalizacja imienia (pozycja w wierszu) + self.EPDLFnamePosInRowVar = TK.IntVar() + self.EPDLFnamePosInRowSpinbox = TKttk.Spinbox(self.editingPresetDLFrame) + self.EPDLFnamePosInRowSpinbox.config(textvariable = self.EPDLFnamePosInRowVar) + self.EPDLFnamePosInRowSpinbox.config(from_ = 0) + self.EPDLFnamePosInRowSpinbox.config(to = 1000000) + self.EPDLFnamePosInRowSpinbox.config(state = TK.DISABLED) + self.EPDLFnamePosInRowSpinbox.config(style = 'spinbox1.TSpinbox') + self.EPDLFnamePosInRowSpinbox.grid(row = 2, column = 2, padx = GUI.R('EPDataLocalizationPadX'), pady = GUI.R('EPDataLocalizationPadY')) + + # W3 - "Nazwisko" + self.EPDLW3Label = TKttk.Label(self.editingPresetDLFrame) + self.EPDLW3Label.config(style = 'label1.TLabel') + self.EPDLW3Label.config(text = 'Nazwisko') + self.EPDLW3Label.grid(row = 3, column = 0, padx = GUI.R('EPDataLocalizationPadX'), pady = GUI.R('EPDataLocalizationPadY')) + + # Lokalizacja nazwiska (wiersz) + self.EPDLLnameRowVar = TK.IntVar() + self.EPDLLnameRowSpinbox = TKttk.Spinbox(self.editingPresetDLFrame) + self.EPDLLnameRowSpinbox.config(textvariable = self.EPDLLnameRowVar) + self.EPDLLnameRowSpinbox.config(from_ = 0) + self.EPDLLnameRowSpinbox.config(to = 1000000) + self.EPDLLnameRowSpinbox.config(state = TK.DISABLED) + self.EPDLLnameRowSpinbox.config(style = 'spinbox1.TSpinbox') + self.EPDLLnameRowSpinbox.grid(row = 3, column = 1, padx = GUI.R('EPDataLocalizationPadX'), pady = GUI.R('EPDataLocalizationPadY')) + + # Lokalizacja nazwiska (pozycja w wierszu) + self.EPDLLnamePosInRowVar = TK.IntVar() + self.EPDLLnamePosInRowSpinbox = TKttk.Spinbox(self.editingPresetDLFrame) + self.EPDLLnamePosInRowSpinbox.config(textvariable = self.EPDLLnamePosInRowVar) + self.EPDLLnamePosInRowSpinbox.config(from_ = 0) + self.EPDLLnamePosInRowSpinbox.config(to = 1000000) + self.EPDLLnamePosInRowSpinbox.config(state = TK.DISABLED) + self.EPDLLnamePosInRowSpinbox.config(style = 'spinbox1.TSpinbox') + self.EPDLLnamePosInRowSpinbox.grid(row = 3, column = 2, padx = GUI.R('EPDataLocalizationPadX'), pady = GUI.R('EPDataLocalizationPadY')) + + # W4 - "Szkoła" + self.EPDLW4Label = TKttk.Label(self.editingPresetDLFrame) + self.EPDLW4Label.config(style = 'label1.TLabel') + self.EPDLW4Label.config(text = 'Szkoła') + self.EPDLW4Label.grid(row = 4, column = 0, padx = GUI.R('EPDataLocalizationPadX'), pady = GUI.R('EPDataLocalizationPadY')) + + # Lokalizacja nazwiska (wiersz) + self.EPDLSchoolRowVar = TK.IntVar() + self.EPDLSchoolRowSpinbox = TKttk.Spinbox(self.editingPresetDLFrame) + self.EPDLSchoolRowSpinbox.config(textvariable = self.EPDLSchoolRowVar) + self.EPDLSchoolRowSpinbox.config(from_ = 0) + self.EPDLSchoolRowSpinbox.config(to = 1000000) + self.EPDLSchoolRowSpinbox.config(state = TK.DISABLED) + self.EPDLSchoolRowSpinbox.config(style = 'spinbox1.TSpinbox') + self.EPDLSchoolRowSpinbox.grid(row = 4, column = 1, padx = GUI.R('EPDataLocalizationPadX'), pady = GUI.R('EPDataLocalizationPadY')) + + # Lokalizacja nazwiska (pozycja w wierszu) + self.EPDLSchoolPosInRowVar = TK.IntVar() + self.EPDLSchoolPosInRowSpinbox = TKttk.Spinbox(self.editingPresetDLFrame) + self.EPDLSchoolPosInRowSpinbox.config(textvariable = self.EPDLSchoolPosInRowVar) + self.EPDLSchoolPosInRowSpinbox.config(from_ = 0) + self.EPDLSchoolPosInRowSpinbox.config(to = 1000000) + self.EPDLSchoolPosInRowSpinbox.config(state = TK.DISABLED) + self.EPDLSchoolPosInRowSpinbox.config(style = 'spinbox1.TSpinbox') + self.EPDLSchoolPosInRowSpinbox.grid(row = 4, column = 2, padx = GUI.R('EPDataLocalizationPadX'), pady = GUI.R('EPDataLocalizationPadY')) + + # W5 - "Klasa" + self.EPDLW5Label = TKttk.Label(self.editingPresetDLFrame) + self.EPDLW5Label.config(style = 'label1.TLabel') + self.EPDLW5Label.config(text = 'Klasa') + self.EPDLW5Label.grid(row = 5, column = 0, padx = GUI.R('EPDataLocalizationPadX'), pady = GUI.R('EPDataLocalizationPadY')) + + # Lokalizacja nazwiska (wiersz) + self.EPDLClassRowVar = TK.IntVar() + self.EPDLClassRowSpinbox = TKttk.Spinbox(self.editingPresetDLFrame) + self.EPDLClassRowSpinbox.config(textvariable = self.EPDLClassRowVar) + self.EPDLClassRowSpinbox.config(from_ = 0) + self.EPDLClassRowSpinbox.config(to = 1000000) + self.EPDLClassRowSpinbox.config(state = TK.DISABLED) + self.EPDLClassRowSpinbox.config(style = 'spinbox1.TSpinbox') + self.EPDLClassRowSpinbox.grid(row = 5, column = 1, padx = GUI.R('EPDataLocalizationPadX'), pady = GUI.R('EPDataLocalizationPadY')) + + # Lokalizacja nazwiska (pozycja w wierszu) + self.EPDLClassPosInRowVar = TK.IntVar() + self.EPDLClassPosInRowSpinbox = TKttk.Spinbox(self.editingPresetDLFrame) + self.EPDLClassPosInRowSpinbox.config(textvariable = self.EPDLClassPosInRowVar) + self.EPDLClassPosInRowSpinbox.config(from_ = 0) + self.EPDLClassPosInRowSpinbox.config(to = 1000000) + self.EPDLClassPosInRowSpinbox.config(state = TK.DISABLED) + self.EPDLClassPosInRowSpinbox.config(style = 'spinbox1.TSpinbox') + self.EPDLClassPosInRowSpinbox.grid(row = 5, column = 2, padx = GUI.R('EPDataLocalizationPadX'), pady = GUI.R('EPDataLocalizationPadY')) + + # Separator + self.formatSeparator4Frame = TKttk.Frame(self.editingPresetDLFrame) + self.formatSeparator4Frame.config(style = 'layoutFrame.TFrame') + self.formatSeparator4Frame.grid(row = 6, column = 0, columnspan = 3) + + self.formatSeparator4 = TKttk.Separator(self.formatSeparator4Frame) + self.formatSeparator4.config(style = 'separator1.TSeparator') + self.formatSeparator4.config(orient = TK.HORIZONTAL) + self.formatSeparator4.pack(padx = GUI.R('formatHorizontalSeparatorPadY'), pady = 10, fill = TK.X, expand = 1) + + # "Kodowanie" + self.formatInputCodingLabel = TKttk.Label(self.editingPresetDLFrame) + self.formatInputCodingLabel.config(style = 'label1.TLabel') + self.formatInputCodingLabel.config(text = 'Kodowanie') + self.formatInputCodingLabel.grid(row = 7, column = 0, padx = GUI.R('EPDataLocalizationPadX'), pady = GUI.R('EPDataLocalizationPadY')) + + # Kodowanie - Combobox + self.formatInputCodingVar = TK.StringVar() + self.formatInputCodingCombobox = TKttk.Combobox(self.editingPresetDLFrame) + self.formatInputCodingCombobox.config(textvariable = self.formatInputCodingVar) + self.formatInputCodingCombobox.config(state = TK.DISABLED) + self.formatInputCodingCombobox.config(style = 'combobox2.TCombobox') + self.formatInputCodingCombobox.option_add("*TCombobox*Listbox.background", GUI.R('combobox2ListBoxBackground')) + self.formatInputCodingCombobox.option_add("*TCombobox*Listbox.foreground", GUI.R('combobox2ListBoxForeground')) + self.formatInputCodingCombobox.option_add("*TCombobox*Listbox.selectBackground", GUI.R('combobox2ListBoxSelectBackground')) + self.formatInputCodingCombobox.option_add("*TCombobox*Listbox.selectForeground", GUI.R('combobox2ListBoxSelectForeground')) + self.formatInputCodingCombobox.grid(row = 7, column = 1, columnspan = 2, padx = GUI.R('EPDataLocalizationPadX'), pady = GUI.R('EPDataLocalizationPadY')) + self.formatInputCodingCombobox['values'] = tuple(VAR.allowedCoding) + + ############################### + + ######################################### + + ################################################### + + # (1) Separator 3 ########################################### + + self.formatSeparator3 = TKttk.Separator(self.formatFrame) + self.formatSeparator3.config(style = 'separator1.TSeparator') + self.formatSeparator3.config(orient = TK.HORIZONTAL) + self.formatSeparator3.pack(fill = TK.X, pady = GUI.R('formatHorizontalSeparatorPadY')) + + ############################################################# + + # (1) Przyciski ############################################# + + self.editingPresetButtonsFrame = TKttk.Frame(self.formatFrame) + self.editingPresetButtonsFrame.config(style = 'layoutFrame.TFrame') + self.editingPresetButtonsFrame.pack(fill = TK.X, side = TK.BOTTOM, pady = GUI.R('editingPresetButtonsPadY')) + + # Przycisk 'ZAPISZ' + self.editingPresetSaveButton = TKttk.Button(self.editingPresetButtonsFrame) + self.editingPresetSaveButton.config(command = self.editingPresetSaveButtonAction) + self.editingPresetSaveButton.config(state = TK.DISABLED) + self.editingPresetSaveButton.config(style = 'button1.TButton') + self.editingPresetSaveButton.config(width = GUI.R('editingPresetSaveButtonWidth')) + self.editingPresetSaveButton.config(text = 'ZAPISZ') + self.editingPresetSaveButton.pack(side = TK.LEFT, expand = 1) + + # Przycisk 'Anuluj' + self.editingPresetCancelButton = TKttk.Button(self.editingPresetButtonsFrame) + self.editingPresetCancelButton.config(command = self.editingPresetCancelButtonAction) + self.editingPresetCancelButton.config(state = TK.DISABLED) + self.editingPresetCancelButton.config(style = 'button1.TButton') + self.editingPresetCancelButton.config(width = GUI.R('editingPresetCancelButtonWidth')) + self.editingPresetCancelButton.config(text = 'Anuluj') + self.editingPresetCancelButton.pack(side = TK.RIGHT, expand = 1) + + ############################################################# + + ###################################################################### + + + + + # TAB3 - Ustawienia ################################################## + + self.settingsTab = TKttk.Frame(self.mainMenu) + self.settingsTab.config(style = "mainMenuTabFrame.TFrame") + self.settingsTabImg = PLimg.open(GUI.R('settingsTabIcon')) + self.settingsTabImg = self.settingsTabImg.resize((GUI.R('tabIconsSize'), GUI.R('tabIconsSize')), PLimg.ANTIALIAS) + self.settingsTabImg = PLitk.PhotoImage(self.settingsTabImg) + self.mainMenu.add(self.settingsTab, image = self.settingsTabImg, state = TK.NORMAL) + + + # Nagłówek + self.settingsHeader = TKttk.Label(self.settingsTab) + self.settingsHeader.config(style = 'tabHeader.TLabel') + self.settingsHeader.config(text = 'USTAWIENIA') + self.settingsHeader.pack(fill = GUI.R('headerFill')) + + + # Zawartość + self.settingsFrame = TKttk.Frame(self.settingsTab) + self.settingsFrame.config(style = 'contentTabFrame.TFrame') + self.settingsFrame.pack(fill = GUI.R('contentTabFrameFill'), expand = GUI.R('contentTabFrameExpand'), padx = GUI.R('tabFramePadding'), pady = GUI.R('tabFramePadding')) + + # (1) Ustwienia ############################################# + + self.settingsMainFrame = TKttk.Frame(self.settingsFrame) + self.settingsMainFrame.config(style = 'layoutFrame.TFrame') + self.settingsMainFrame.pack(side = TK.TOP, fill = TK.BOTH, expand = 1) + + # (2) Po lewo ##################################### + + self.settingsLeftFrame = TKttk.Frame(self.settingsMainFrame) + self.settingsLeftFrame.config(style = 'layoutFrame.TFrame') + self.settingsLeftFrame.pack(side = TK.LEFT, fill = TK.BOTH, expand = 1) + + # (3) Kodowanie ######################### + + self.settingsCodeFrame = TKttk.Frame(self.settingsLeftFrame) + self.settingsCodeFrame.config(style = 'layoutFrame.TFrame') + self.settingsCodeFrame.pack(side = TK.TOP, fill = TK.X) + + # (4) Kodowanie dla pliku poczty + + self.settingsMailCodeFrame = TKttk.Frame(self.settingsCodeFrame) + self.settingsMailCodeFrame.config(style = 'layoutFrame.TFrame') + self.settingsMailCodeFrame.pack(side = TK.TOP, fill = TK.X, pady = 6, expand = 1) + + # 'Kodowanie wyjściowe dla pliku poczty' + self.settingsMailCodeLabel = TKttk.Label(self.settingsMailCodeFrame) + self.settingsMailCodeLabel.config(style = 'label1.TLabel') + self.settingsMailCodeLabel.config(width = GUI.R('settingsCodeLabelWidth')) + self.settingsMailCodeLabel.config(anchor = GUI.R('settingsCodeLabelAnchor')) + self.settingsMailCodeLabel.config(text = 'Kodowanie wyjściowe dla pliku poczty') + self.settingsMailCodeLabel.pack(side = TK.LEFT) + + # Kodowanie dla poczty - Combobox + self.settingsMailCodeVar = TK.StringVar() + self.settingsMailCodeCombobox = TKttk.Combobox(self.settingsMailCodeFrame) + self.settingsMailCodeCombobox.config(textvariable = self.settingsMailCodeVar) + self.settingsMailCodeCombobox.config(style = 'combobox2.TCombobox') + self.settingsMailCodeCombobox.option_add("*TCombobox*Listbox.background", GUI.R('combobox2ListBoxBackground')) + self.settingsMailCodeCombobox.option_add("*TCombobox*Listbox.foreground", GUI.R('combobox2ListBoxForeground')) + self.settingsMailCodeCombobox.option_add("*TCombobox*Listbox.selectBackground", GUI.R('combobox2ListBoxSelectBackground')) + self.settingsMailCodeCombobox.option_add("*TCombobox*Listbox.selectForeground", GUI.R('combobox2ListBoxSelectForeground')) + self.settingsMailCodeCombobox.pack(side = TK.RIGHT, fill = TK.X, expand = 1) + self.settingsMailCodeCombobox['values'] = tuple(VAR.allowedCoding) + self.settingsMailCodeCombobox.set(CFG.R('mailOutputCoding')) + + ############################### + + # (4) Kodowanie dla pliku office + + self.settingsOfficeCodeFrame = TKttk.Frame(self.settingsCodeFrame) + self.settingsOfficeCodeFrame.config(style = 'layoutFrame.TFrame') + self.settingsOfficeCodeFrame.pack(side = TK.BOTTOM, fill = TK.X, pady = 6, expand = 1) + + # 'Kodowanie wyjściowe dla pliku office' + self.settingsOfficeCodeLabel = TKttk.Label(self.settingsOfficeCodeFrame) + self.settingsOfficeCodeLabel.config(style = 'label1.TLabel') + self.settingsOfficeCodeLabel.config(width = GUI.R('settingsCodeLabelWidth')) + self.settingsOfficeCodeLabel.config(anchor = GUI.R('settingsCodeLabelAnchor')) + self.settingsOfficeCodeLabel.config(text = 'Kodowanie wyjściowe dla pliku office') + self.settingsOfficeCodeLabel.pack(side = TK.LEFT) + + # Kodowanie dla poczty - Combobox + self.settingsOfficeCodeVar = TK.StringVar() + self.settingsOfficeCodeCombobox = TKttk.Combobox(self.settingsOfficeCodeFrame) + self.settingsOfficeCodeCombobox.config(textvariable = self.settingsOfficeCodeVar) + self.settingsOfficeCodeCombobox.config(style = 'combobox2.TCombobox') + self.settingsOfficeCodeCombobox.option_add("*TCombobox*Listbox.background", GUI.R('combobox2ListBoxBackground')) + self.settingsOfficeCodeCombobox.option_add("*TCombobox*Listbox.foreground", GUI.R('combobox2ListBoxForeground')) + self.settingsOfficeCodeCombobox.option_add("*TCombobox*Listbox.selectBackground", GUI.R('combobox2ListBoxSelectBackground')) + self.settingsOfficeCodeCombobox.option_add("*TCombobox*Listbox.selectForeground", GUI.R('combobox2ListBoxSelectForeground')) + self.settingsOfficeCodeCombobox.pack(side = TK.RIGHT, fill = TK.X, expand = 1) + self.settingsOfficeCodeCombobox['values'] = tuple(VAR.allowedCoding) + self.settingsOfficeCodeCombobox.set(CFG.R('officeOutputCoding')) + + ############################### + + ######################################### + + # (3) Separator ######################### + + self.settingsSeparator3 = TKttk.Separator(self.settingsLeftFrame) + self.settingsSeparator3.config(style = 'separator1.TSeparator') + self.settingsSeparator3.config(orient = TK.HORIZONTAL) + self.settingsSeparator3.pack(fill = TK.X, pady = GUI.R('settingsHorizontalSeparatorPadY')) + + ######################################### + + # (3) Inne dane ######################### + + self.settingsOtherFrame = TKttk.Frame(self.settingsLeftFrame) + self.settingsOtherFrame.config(style = 'layoutFrame.TFrame') + self.settingsOtherFrame.pack(fill = TK.X) + + # (4) Domena ################## + + self.settingsOtherDomainFrame = TKttk.Frame(self.settingsOtherFrame) + self.settingsOtherDomainFrame.config(style = 'layoutFrame.TFrame') + self.settingsOtherDomainFrame.pack(fill = TK.X, pady = 6, expand = 1) + + # 'Domena (używana w mailu)' + self.settingsOtherDomainLabel = TKttk.Label(self.settingsOtherDomainFrame) + self.settingsOtherDomainLabel.config(style = 'label1.TLabel') + self.settingsOtherDomainLabel.config(width = GUI.R('settingsOtherLabelWidth')) + self.settingsOtherDomainLabel.config(anchor = GUI.R('settingsOtherLabelAnchor')) + self.settingsOtherDomainLabel.config(text = 'Domena (używana w mailu)') + self.settingsOtherDomainLabel.pack(side = TK.LEFT) + + # Domena - Entry + self.settingsOtherDomainVar = TK.StringVar() + self.settingsOtherDomainEntry = TKttk.Entry(self.settingsOtherDomainFrame) + self.settingsOtherDomainEntry.config(style = 'entry1.TEntry') + self.settingsOtherDomainEntry.config(textvariable = self.settingsOtherDomainVar) + self.settingsOtherDomainEntry.pack(side = TK.RIGHT, fill = TK.X, expand = 1) + self.settingsOtherDomainVar.set(CFG.R('domain')) + + ############################### + + # (4) Quota ################### + + self.settingsOtherQuotaFrame = TKttk.Frame(self.settingsOtherFrame) + self.settingsOtherQuotaFrame.config(style = 'layoutFrame.TFrame') + self.settingsOtherQuotaFrame.pack(fill = TK.X, pady = 6, expand = 1) + + # 'Quota (MB)' + self.settingsOtherQuotaLabel = TKttk.Label(self.settingsOtherQuotaFrame) + self.settingsOtherQuotaLabel.config(style = 'label1.TLabel') + self.settingsOtherQuotaLabel.config(width = GUI.R('settingsOtherLabelWidth')) + self.settingsOtherQuotaLabel.config(anchor = GUI.R('settingsOtherLabelAnchor')) + self.settingsOtherQuotaLabel.config(text = 'Quota (MB)') + self.settingsOtherQuotaLabel.pack(side = TK.LEFT) + + # Domena - Entry + self.settingsOtherQuotaVar = TK.IntVar() + self.settingsOtherQuotaSpinbox = TKttk.Spinbox(self.settingsOtherQuotaFrame) + self.settingsOtherQuotaSpinbox.config(textvariable = self.settingsOtherQuotaVar) + self.settingsOtherQuotaSpinbox.config(from_ = 0) + self.settingsOtherQuotaSpinbox.config(to = 10000000000000000000000) + self.settingsOtherQuotaSpinbox.config(style = 'spinbox1.TSpinbox') + self.settingsOtherQuotaSpinbox.pack(side = TK.RIGHT, fill = TK.X, expand = 1) + self.settingsOtherQuotaSpinbox.set(CFG.R('quota')) + + ############################### + + # (4) Kraj ################## + + self.settingsOtherCountryFrame = TKttk.Frame(self.settingsOtherFrame) + self.settingsOtherCountryFrame.config(style = 'layoutFrame.TFrame') + self.settingsOtherCountryFrame.pack(fill = TK.X, pady = 6, expand = 1) + + # 'Kraj (zapisany w danych na office)' + self.settingsOtherCountryLabel = TKttk.Label(self.settingsOtherCountryFrame) + self.settingsOtherCountryLabel.config(style = 'label1.TLabel') + self.settingsOtherCountryLabel.config(width = GUI.R('settingsOtherLabelWidth')) + self.settingsOtherCountryLabel.config(anchor = GUI.R('settingsOtherLabelAnchor')) + self.settingsOtherCountryLabel.config(text = 'Kraj (zapisany w danych na office)') + self.settingsOtherCountryLabel.pack(side = TK.LEFT) + + # Domena - Entry + self.settingsOtherCountryVar = TK.StringVar() + self.settingsOtherCountryEntry = TKttk.Entry(self.settingsOtherCountryFrame) + self.settingsOtherCountryEntry.config(style = 'entry1.TEntry') + self.settingsOtherCountryEntry.config(textvariable = self.settingsOtherCountryVar) + self.settingsOtherCountryEntry.pack(side = TK.RIGHT, fill = TK.X, expand = 1) + self.settingsOtherCountryVar.set(CFG.R('country')) + + ############################### + + # (4) Rozpoczęcie roku szkolnego + + self.settingsOtherDRRSFrame = TKttk.Frame(self.settingsOtherFrame) + self.settingsOtherDRRSFrame.config(style = 'layoutFrame.TFrame') + self.settingsOtherDRRSFrame.pack(fill = TK.X, expand = 1, pady = 6) + + # 'Rozpoczęcie roku szkolnego (Dzień | Miesiąc)' + self.settingsOtherDRRSLabel = TKttk.Label(self.settingsOtherDRRSFrame) + self.settingsOtherDRRSLabel.config(style = 'label1.TLabel') + self.settingsOtherDRRSLabel.config(width = GUI.R('settingsOtherLabelWidth')) + self.settingsOtherDRRSLabel.config(anchor = GUI.R('settingsOtherLabelAnchor')) + self.settingsOtherDRRSLabel.config(text = 'Rozpoczęcie roku szkolnego (DD | MM)') + self.settingsOtherDRRSLabel.pack(side = TK.LEFT) + + # Rozpoczęcie roku szkolnego - Miesiąc + self.settingsOtherDRRSMonthVar = TK.IntVar() + self.settingsOtherDRRSMonthSpinbox = TKttk.Spinbox(self.settingsOtherDRRSFrame) + self.settingsOtherDRRSMonthSpinbox.config(textvariable = self.settingsOtherDRRSMonthVar) + self.settingsOtherDRRSMonthSpinbox.config(from_ = 1) + self.settingsOtherDRRSMonthSpinbox.config(to = 12) + self.settingsOtherDRRSMonthSpinbox.config(style = 'spinbox1.TSpinbox') + self.settingsOtherDRRSMonthSpinbox.pack(side = TK.RIGHT, fill = TK.X, expand = 1, padx = (6, 0)) + self.settingsOtherDRRSMonthSpinbox.set(CFG.R('schoolyearStart')['M']) + + # Rozpoczęcie roku szkolnego - Dzień + self.settingsOtherDRRSDayVar = TK.IntVar() + self.settingsOtherDRRSDaySpinbox = TKttk.Spinbox(self.settingsOtherDRRSFrame) + self.settingsOtherDRRSDaySpinbox.config(textvariable = self.settingsOtherDRRSDayVar) + self.settingsOtherDRRSDaySpinbox.config(from_ = 1) + self.settingsOtherDRRSDaySpinbox.config(to = 31) + self.settingsOtherDRRSDaySpinbox.config(style = 'spinbox1.TSpinbox') + self.settingsOtherDRRSDaySpinbox.pack(side = TK.RIGHT, fill = TK.X, expand = 1, padx = (0, 6)) + self.settingsOtherDRRSDaySpinbox.set(CFG.R('schoolyearStart')['D']) + + ############################### + + ######################################### + + # (3) Separator ######################### + + self.settingsSeparator4 = TKttk.Separator(self.settingsLeftFrame) + self.settingsSeparator4.config(style = 'separator1.TSeparator') + self.settingsSeparator4.config(orient = TK.HORIZONTAL) + self.settingsSeparator4.pack(fill = TK.X, pady = GUI.R('settingsHorizontalSeparatorPadY')) + + ######################################### + + # (4) Nagłówki ########################## + + self.settingsHeadlinesFrame = TKttk.Frame(self.settingsLeftFrame) + self.settingsHeadlinesFrame.config(style = 'layoutFrame.TFrame') + self.settingsHeadlinesFrame.pack(fill = TK.X) + + # (4) Nagłówek poczty ######### + + self.settingsHeadlinesMailFrame = TKttk.Frame(self.settingsHeadlinesFrame) + self.settingsHeadlinesMailFrame.config(style = 'layoutFrame.TFrame') + self.settingsHeadlinesMailFrame.pack(fill = TK.X, expand = 1, pady = 6) + + # 'Nagłówek dla pliku wyjściowego poczty' + self.settingsHeadlinesMailLabel = TKttk.Label(self.settingsHeadlinesMailFrame) + self.settingsHeadlinesMailLabel.config(style = 'label1.TLabel') + self.settingsHeadlinesMailLabel.config(width = GUI.R('settingsHeadlineLabelWidth')) + self.settingsHeadlinesMailLabel.config(anchor = GUI.R('settingsHeadlineLabelAnchor')) + self.settingsHeadlinesMailLabel.config(text = 'Nagłówek dla pliku wyjściowego poczty') + self.settingsHeadlinesMailLabel.pack(side = TK.LEFT) + + # Nagłówek poczty - checkbutton + self.settingsHeadlinesMailCheckbuttonVar = TK.BooleanVar() + self.settingsHeadlinesMailCheckbutton = TK.Checkbutton(self.settingsHeadlinesMailFrame) + self.settingsHeadlinesMailCheckbutton.config(bg = GUI.R('checkbutton1Background')) + self.settingsHeadlinesMailCheckbutton.config(fg = GUI.R('checkbutton1TextColor')) + self.settingsHeadlinesMailCheckbutton.config(selectcolor = GUI.R('checkbutton1IndicatorBackground')) + self.settingsHeadlinesMailCheckbutton.config(activebackground = GUI.R('checkbutton1Background')) + self.settingsHeadlinesMailCheckbutton.config(activeforeground = GUI.R('checkbutton1TextColor')) + self.settingsHeadlinesMailCheckbutton.config(text = 'Umieść w pliku') + self.settingsHeadlinesMailCheckbutton.config(variable = self.settingsHeadlinesMailCheckbuttonVar) + self.settingsHeadlinesMailCheckbutton.pack(side = TK.RIGHT, padx = (6, 0)) + self.settingsHeadlinesMailCheckbuttonVar.set(CFG.R('ifHeadlineInMail')) + + # Nagłówek poczty - Entry + self.settingsHeadlinesMailEntryVar = TK.StringVar() + self.settingsHeadlinesMailEntry = TKttk.Entry(self.settingsHeadlinesMailFrame) + self.settingsHeadlinesMailEntry.config(style = 'entry1.TEntry') + self.settingsHeadlinesMailEntry.config(textvariable = self.settingsHeadlinesMailEntryVar) + self.settingsHeadlinesMailEntry.pack(side = TK.RIGHT, fill = TK.X, expand = 1, padx = (0, 6)) + self.settingsHeadlinesMailEntryVar.set(CFG.R('headlineInMail')) + + ############################### + + # (4) Nagłówek office ######### + + self.settingsHeadlinesOfficeFrame = TKttk.Frame(self.settingsHeadlinesFrame) + self.settingsHeadlinesOfficeFrame.config(style = 'layoutFrame.TFrame') + self.settingsHeadlinesOfficeFrame.pack(fill = TK.X, expand = 1, pady = 6) + + # 'Nagłówek dla pliku wyjściowego poczty' + self.settingsHeadlinesOfficeLabel = TKttk.Label(self.settingsHeadlinesOfficeFrame) + self.settingsHeadlinesOfficeLabel.config(style = 'label1.TLabel') + self.settingsHeadlinesOfficeLabel.config(width = GUI.R('settingsHeadlineLabelWidth')) + self.settingsHeadlinesOfficeLabel.config(anchor = GUI.R('settingsHeadlineLabelAnchor')) + self.settingsHeadlinesOfficeLabel.config(text = 'Nagłówek dla pliku wyjściowego office') + self.settingsHeadlinesOfficeLabel.pack(side = TK.LEFT) + + # Nagłówek poczty - checkbutton + self.settingsHeadlinesOfficeCheckbuttonVar = TK.BooleanVar() + self.settingsHeadlinesOfficeCheckbutton = TK.Checkbutton(self.settingsHeadlinesOfficeFrame) + self.settingsHeadlinesOfficeCheckbutton.config(bg = GUI.R('checkbutton1Background')) + self.settingsHeadlinesOfficeCheckbutton.config(fg = GUI.R('checkbutton1TextColor')) + self.settingsHeadlinesOfficeCheckbutton.config(selectcolor = GUI.R('checkbutton1IndicatorBackground')) + self.settingsHeadlinesOfficeCheckbutton.config(activebackground = GUI.R('checkbutton1Background')) + self.settingsHeadlinesOfficeCheckbutton.config(activeforeground = GUI.R('checkbutton1TextColor')) + self.settingsHeadlinesOfficeCheckbutton.config(text = 'Umieść w pliku') + self.settingsHeadlinesOfficeCheckbutton.config(variable = self.settingsHeadlinesOfficeCheckbuttonVar) + self.settingsHeadlinesOfficeCheckbutton.pack(side = TK.RIGHT, padx = (6, 0)) + self.settingsHeadlinesOfficeCheckbuttonVar.set(CFG.R('ifHeadlineInOffice')) + + # Nagłówek poczty - Entry + self.settingsHeadlinesOfficeEntryVar = TK.StringVar() + self.settingsHeadlinesOfficeEntry = TKttk.Entry(self.settingsHeadlinesOfficeFrame) + self.settingsHeadlinesOfficeEntry.config(style = 'entry1.TEntry') + self.settingsHeadlinesOfficeEntry.config(textvariable = self.settingsHeadlinesOfficeEntryVar) + self.settingsHeadlinesOfficeEntry.pack(side = TK.RIGHT, fill = TK.X, expand = 1, padx = (0, 6)) + self.settingsHeadlinesOfficeEntryVar.set(CFG.R('headlineInOffice')) + + ############################### + + ######################################### + + ################################################### + + # (2) Separator ################################### + + self.settingsSeparator2 = TKttk.Separator(self.settingsMainFrame) + self.settingsSeparator2.config(style = 'separator1.TSeparator') + self.settingsSeparator2.config(orient = TK.VERTICAL) + self.settingsSeparator2.pack(side = TK.LEFT, fill = TK.Y, padx = GUI.R('settingsVerticalSeparatorPadY')) + + ################################################### + + # (2) Dane o szkołach ############################# + + self.settingsSchoolDataFrame = TKttk.Frame(self.settingsMainFrame) + self.settingsSchoolDataFrame.config(style = 'layoutFrame.TFrame') + self.settingsSchoolDataFrame.pack(side = TK.RIGHT, fill = TK.BOTH) + + # 'Dane o szkołach' + self.settingsSchoolDataLabel = TKttk.Label(self.settingsSchoolDataFrame) + self.settingsSchoolDataLabel.config(style = 'label1.TLabel') + self.settingsSchoolDataLabel.config(anchor = GUI.R('settingsSchoolDataLabelAnchor')) + self.settingsSchoolDataLabel.config(text = 'Dane o szkołach') + self.settingsSchoolDataLabel.pack(side = TK.TOP, pady = 6) + + # Label - oznaczenia kolumn + self.settingsSchoolDataInstructionLabel = TKttk.Label(self.settingsSchoolDataFrame) + self.settingsSchoolDataInstructionLabel.config(style = 'label3.TLabel') + self.settingsSchoolDataInstructionLabel.config(anchor = GUI.R('settingsSchoolDataLabelAnchor')) + self.settingsSchoolDataInstructionLabel.config(text = 'OZNACZENIE SZKOŁY | ILOŚĆ KLAS | CZY OZNACZENIE SZKOŁY W ZNACZNIKU KLASY? (0/1)') + self.settingsSchoolDataInstructionLabel.pack() + + # Dane o szkołach - Text + self.settingsSchoolDataText = TK.Text(self.settingsSchoolDataFrame) + self.settingsSchoolDataText.config(background = GUI.R('text1Background')) + self.settingsSchoolDataText.config(foreground = GUI.R('text1TextColor')) + self.settingsSchoolDataText.config(relief = GUI.R('text1Relief')) + self.settingsSchoolDataText.config(width = 50) + self.settingsSchoolDataText.pack(pady = 6, fill = TK.Y, expand = 1) + for x in CFG.R('schoolData'): + if x[2]: + x[2] = '1' + else: + x[2] = '0' + x[1] = str(x[1]) + self.settingsSchoolDataText.insert(TK.END, (' | '.join(x) + '\n')) + + ################################################### + + ############################################################# + + # (1) Separator ############################################# + + self.settingsSeparator1 = TKttk.Separator(self.settingsFrame) + self.settingsSeparator1.config(style = 'separator1.TSeparator') + self.settingsSeparator1.config(orient = TK.HORIZONTAL) + self.settingsSeparator1.pack(fill = TK.X, pady = GUI.R('settingsHorizontalSeparatorPadY')) + + ############################################################# + + # (1) Przyciski ############################################# + + self.settingsButtonsFrame = TKttk.Frame(self.settingsFrame) + self.settingsButtonsFrame.config(style = 'layoutFrame.TFrame') + self.settingsButtonsFrame.pack(side = TK.BOTTOM, fill = TK.X, pady = GUI.R('settingsButtonsPadY')) + + # (2) Przyciski ZAPISZ i Anuluj ################### + + self.settingsButtonsSaveCancelFrame = TKttk.Frame(self.settingsButtonsFrame) + self.settingsButtonsSaveCancelFrame.config(style = 'layoutFrame.TFrame') + self.settingsButtonsSaveCancelFrame.pack(side = TK.LEFT) + + # Przycisk ZAPISZ + self.settingsButtonSave = TKttk.Button(self.settingsButtonsSaveCancelFrame) + self.settingsButtonSave.config(command = self.settingsButtonSaveAction) + self.settingsButtonSave.config(style = 'button1.TButton') + self.settingsButtonSave.config(width = GUI.R('settingsButtonSaveWidth')) + self.settingsButtonSave.config(text = 'ZAPISZ') + self.settingsButtonSave.pack(side = TK.LEFT, padx = 6) + + # Przycisk Anuluj + self.settingsButtonCancel = TKttk.Button(self.settingsButtonsSaveCancelFrame) + self.settingsButtonCancel.config(command = self.settingsButtonCancelAction) + self.settingsButtonCancel.config(style = 'button1.TButton') + self.settingsButtonCancel.config(width = GUI.R('settingsButtonCancelWidth')) + self.settingsButtonCancel.config(text = 'Anuluj') + self.settingsButtonCancel.pack(side = TK.RIGHT, padx = 6) + + ################################################### + + # (2) Inne przyciski ############################## + + self.settingsButtonsOtherFrame = TKttk.Frame(self.settingsButtonsFrame) + self.settingsButtonsOtherFrame.config(style = 'layoutFrame.TFrame') + self.settingsButtonsOtherFrame.pack(side = TK.RIGHT) + + # Przycisk "Zarządzaj presetami formatu" + self.settingsButtonZPF = TKttk.Button(self.settingsButtonsOtherFrame) + self.settingsButtonZPF.config(command = self.settingsButtonZPFAction) + self.settingsButtonZPF.config(style = 'button1.TButton') + self.settingsButtonZPF.config(width = GUI.R('settingsButtonZPFWidth')) + self.settingsButtonZPF.config(text = 'Zarządzaj presetami formatu') + self.settingsButtonZPF.pack(side = TK.RIGHT, padx = 6) + + # Przycisk "Przywróć domyślne ustawienia wyglądu" + self.settingsButtonPDUW = TKttk.Button(self.settingsButtonsOtherFrame) + self.settingsButtonPDUW.config(command = self.settingsButtonPDUWAction) + self.settingsButtonPDUW.config(style = 'button1.TButton') + self.settingsButtonPDUW.config(width = GUI.R('settingsButtonPDUWWidth')) + self.settingsButtonPDUW.config(text = 'Przywróć domyślne ustawienia wyglądu') + self.settingsButtonPDUW.pack(side = TK.RIGHT, padx = 6) + + # Przycisk "Przywróć domyślne ustwienia ogólne" + self.settingsButtonPDUO = TKttk.Button(self.settingsButtonsOtherFrame) + self.settingsButtonPDUO.config(command = self.settingsButtonPDUOAction) + self.settingsButtonPDUO.config(style = 'button1.TButton') + self.settingsButtonPDUO.config(width = GUI.R('settingsButtonPDUOWidth')) + self.settingsButtonPDUO.config(text = 'Przywróć domyślne ustawienia ogólne') + self.settingsButtonPDUO.pack(side = TK.RIGHT, padx = 6) + + ################################################### + + ############################################################# + + ###################################################################### + + + + + # TAB4 - O programie ################################################# + + self.aboutTab = TKttk.Frame(self.mainMenu) + self.aboutTab.config(style = "mainMenuTabFrame.TFrame") + self.aboutTabImg = PLimg.open(GUI.R('aboutTabIcon')) + self.aboutTabImg = self.aboutTabImg.resize((GUI.R('tabIconsSize'), GUI.R('tabIconsSize')), PLimg.ANTIALIAS) + self.aboutTabImg = PLitk.PhotoImage(self.aboutTabImg) + self.mainMenu.add(self.aboutTab, image = self.aboutTabImg, state = TK.NORMAL) + + + # Nagłówek + self.aboutHeader = TKttk.Label(self.aboutTab) + self.aboutHeader.config(style = 'tabHeader.TLabel') + self.aboutHeader.config(text = 'O PROGRAMIE') + self.aboutHeader.pack(fill = GUI.R('headerFill')) + + + # Zawartość + self.aboutFrame = TKttk.Frame(self.aboutTab) + self.aboutFrame.config(style = 'contentTabFrame.TFrame') + self.aboutFrame.pack(fill = GUI.R('contentTabFrameFill'), expand = GUI.R('contentTabFrameExpand'), padx = GUI.R('tabFramePadding'), pady = GUI.R('tabFramePadding')) + + # (1) Info & Logo ########################################### + + self.aboutInfoLogoFrame = TKttk.Frame(self.aboutFrame) + self.aboutInfoLogoFrame.config(style = 'layoutFrame.TFrame') + self.aboutInfoLogoFrame.pack(fill = TK.BOTH, expand = 1) + + # (2) Logo ######################################## + + self.aboutLogoFrame = TKttk.Frame(self.aboutInfoLogoFrame) + self.aboutLogoFrame.config(style = 'layoutFrame.TFrame') + self.aboutLogoFrame.pack(fill = TK.BOTH, expand = 1) + + # Logo - Button + self.aboutLogoButton = TKttk.Button(self.aboutLogoFrame) + self.aboutLogoButton.config(style = 'button2.TButton') + self.aboutLogoButtonImg = PLimg.open(GUI.R('aboutLogoButtonImg')) + self.aboutLogoButtonImg = self.aboutLogoButtonImg.resize((GUI.R('aboutLogoButtonImgSize'), GUI.R('aboutLogoButtonImgSize')), PLimg.ANTIALIAS) + self.aboutLogoButtonImg = PLitk.PhotoImage(self.aboutLogoButtonImg) + self.aboutLogoButton.config(image = self.aboutLogoButtonImg) + self.aboutLogoButton.pack(expand = 1) + + ################################################### + + # (2) Informacje ################################## + + self.aboutInfoFrame = TKttk.Frame(self.aboutInfoLogoFrame) + self.aboutInfoFrame.config(style = 'layoutFrame.TFrame') + self.aboutInfoFrame.pack(fill = TK.BOTH, expand = 1) + + # Nazwa programu + self.aboutInfoProgramNameLabel = TKttk.Label(self.aboutInfoFrame) + self.aboutInfoProgramNameLabel.config(style = 'label4.TLabel') + self.aboutInfoProgramNameLabel.config(text = VAR.programName) + self.aboutInfoProgramNameLabel.pack() + + # Wersja programu + self.aboutInfoProgramNameLabel = TKttk.Label(self.aboutInfoFrame) + self.aboutInfoProgramNameLabel.config(style = 'label1.TLabel') + self.aboutInfoProgramNameLabel.config(text = 'Wersja %s %s (Build %s)' % (VAR.programVersion, VAR.programVersionStage, VAR.programVersionBuild)) + self.aboutInfoProgramNameLabel.pack() + + # (3) Pozostałe informacje ############## + + self.aboutOtherInfoFrame = TKttk.Frame(self.aboutInfoFrame) + self.aboutOtherInfoFrame.config(style = 'layoutFrame.TFrame') + self.aboutOtherInfoFrame.pack(pady = GUI.R('aboutOtherInfoFramePadX')) + + # Czas pracy + self.aboutOIToWLabel = TKttk.Label(self.aboutOtherInfoFrame) + self.aboutOIToWLabel.config(style = 'label2.TLabel') + self.aboutOIToWLabel.config(text = '© %s %s - %s %s' % (VAR.programToW[0], VAR.programToW[1], VAR.programToW[2], VAR.programToW[3])) + self.aboutOIToWLabel.pack() + + # Autorzy + self.aboutOIAuthorsLabel = TKttk.Label(self.aboutOtherInfoFrame) + self.aboutOIAuthorsLabel.config(style = 'label2.TLabel') + self.aboutOIAuthorsLabel.config(text = '\n'.join(VAR.programAuthors)) + self.aboutOIAuthorsLabel.pack() + + # Dla kogo + self.aboutOICustomerLabel = TKttk.Label(self.aboutOtherInfoFrame) + self.aboutOICustomerLabel.config(style = 'label2.TLabel') + self.aboutOICustomerLabel.config(text = 'dla %s' % VAR.programCustomer) + self.aboutOICustomerLabel.pack() + + ######################################### + + ################################################### + + ############################################################# + + # (1) Instrukcja ############################################ + + self.aboutInstructionFrame = TKttk.Frame(self.aboutFrame) + self.aboutInstructionFrame.config(style = 'layoutFrame.TFrame') + self.aboutInstructionFrame.pack(fill = TK.X, side = TK.BOTTOM) + + # Instrukcja - Button + self.aboutInstructionButton = TKttk.Button(self.aboutInstructionFrame) + self.aboutInstructionButton.config(command = self.aboutInstructionButtonAction) + self.aboutInstructionButton.config(style = 'button1.TButton') + self.aboutInstructionButton.config(width = GUI.R('aboutInstructionButtonWidth')) + self.aboutInstructionButton.config(text = 'Więcej informacji') + self.aboutInstructionButton.pack(side = TK.RIGHT) + + ############################################################# + + ###################################################################### + + + + # Akcje przycisków - TAB1 + + def GIF1SLocalizationButtonAction(self): + filename = str(TKfld.askopenfilename(initialdir = '/', title = "Wybierz plik z danymi")) + self.GIF1SLocalizationEntryVar.set(filename) + + def GIF2SLocalizationButtonAction(self): + filename = str(TKfld.askopenfilename(initialdir = '/', title = "Wybierz plik z danymi")) + self.GIF2SLocalizationEntryVar.set(filename) + + def GIF3SLocalizationButtonAction(self): + filename = str(TKfld.askopenfilename(initialdir = '/', title = "Wybierz plik z danymi")) + self.GIF3SLocalizationEntryVar.set(filename) + + def GIF4SLocalizationButtonAction(self): + filename = str(TKfld.askopenfilename(initialdir = '/', title = "Wybierz plik z danymi")) + self.GIF4SLocalizationEntryVar.set(filename) + + def GOFMailButtonAction(self): + filename = str(TKfld.asksaveasfilename(initialdir = '/', title = "Wybierz miejsce zapisu pliku csv dla poczty", filetypes = [('Plik CSV', '*.csv')])) + if not filename: + return + if not filename.endswith('.csv'): + filename += '.csv' + self.GOFMailEntryVar.set(filename) + + def GOFOfficeButtonAction(self): + filename = str(TKfld.asksaveasfilename(initialdir = '/', title = "Wybierz miejsce zapisu pliku csv dla Office", filetypes = [('Plik CSV', '*.csv')])) + if not filename: + return + if not filename.endswith('.csv'): + filename += '.csv' + self.GOFOfficeEntryVar.set(filename) + + def generateStartButtonAction(self): + if MSG('A0003', False): + GIF1SFilename = self.GIF1SLocalizationEntryVar.get() + GIF1SFormat = self.GIF1SFormatComboboxVar.get() + GIF2SFilename = self.GIF2SLocalizationEntryVar.get() + GIF2SFormat = self.GIF2SFormatComboboxVar.get() + GIF3SFilename = self.GIF3SLocalizationEntryVar.get() + GIF3SFormat = self.GIF3SFormatComboboxVar.get() + GIF4SFilename = self.GIF4SLocalizationEntryVar.get() + GIF4SFormat = self.GIF4SFormatComboboxVar.get() + GOFMailFilename = self.GOFMailEntryVar.get() + GOFOfficeFilename = self.GOFOfficeEntryVar.get() + GIF1 = (GIF1SFilename, GIF1SFormat) + GIF2 = (GIF2SFilename, GIF2SFormat) + GIF3 = (GIF3SFilename, GIF3SFormat) + GIF4 = (GIF4SFilename, GIF4SFormat) + GOF = (GOFMailFilename, GOFOfficeFilename) + filesList = (GIF1, GIF2, GIF3, GIF4, GOF) + output = dataProcess.start(filesList) + if not output[0]: + MSG('E0007', False) + else: + if not output[1]: + MSG('E0008', False) + else: + if not output[2]: + MSG('E0009', False) + else: + if not output[3]: + MSG('E0010', False) + else: + if not (output[4])[0]: + MSG('E0011', False, (output[4])[1]) + else: + if not output[5]: + MSG('E0012', False) + else: + if not output[6]: + MSG('E0013', False) + else: + if not (output[7])[0]: + MSG('E0014', False) + else: + MSG('I0001', False, 'Przetworzono dane %i osób' % (output[7])[1]) + self.GIF1SLocalizationEntryVar.set('') + self.GIF1SFormatComboboxVar.set('') + self.GIF2SLocalizationEntryVar.set('') + self.GIF2SFormatComboboxVar.set('') + self.GIF3SLocalizationEntryVar.set('') + self.GIF3SFormatComboboxVar.set('') + self.GIF4SLocalizationEntryVar.set('') + self.GIF4SFormatComboboxVar.set('') + self.GOFMailEntryVar.set('') + self.GOFOfficeEntryVar.set('') + + else: + return + + # Akcje przycisków - TAB2 + + def loadingButtonAction(self): + self.loadingList['state'] = TK.DISABLED + self.loadingButton['state'] = TK.DISABLED + self.EPOSTypeVar.set(FMT.R(self.loadingList.get(), 'student')) + self.EPOSTypeStudentRadiobutton['state'] = TK.NORMAL + self.EPOSTypeTeacherRadiobutton['state'] = TK.NORMAL + self.EPOSPersonSeparatorEntry['state'] = TK.NORMAL + self.EPOSPersonSeparatorVar.set(FMT.R(self.loadingList.get(), 'personSeparator')) + self.EPOSRowSeparatorEntry['state'] = TK.NORMAL + self.EPOSRowSeparatorVar.set(FMT.R(self.loadingList.get(), 'rowSeparator')) + self.EPOSDataSeparatorText['state'] = TK.NORMAL + self.EPOSDataSeparatorText.insert(TK.END, '\n'.join(FMT.R(self.loadingList.get(), 'dataSeparators'))) + self.EPDLLoginRowSpinbox['state'] = TK.NORMAL + self.EPDLLoginRowVar.set(FMT.R(self.loadingList.get(), 'loginRow')) + self.EPDLLoginPosInRowSpinbox['state'] = TK.NORMAL + self.EPDLLoginPosInRowVar.set(FMT.R(self.loadingList.get(), 'loginPositionInRow')) + self.EPDLFnameRowSpinbox['state'] = TK.NORMAL + self.EPDLFnameRowVar.set(FMT.R(self.loadingList.get(), 'fnameRow')) + self.EPDLFnamePosInRowSpinbox['state'] = TK.NORMAL + self.EPDLFnamePosInRowVar.set(FMT.R(self.loadingList.get(), 'fnamePositionInRow')) + self.EPDLLnameRowSpinbox['state'] = TK.NORMAL + self.EPDLLnameRowVar.set(FMT.R(self.loadingList.get(), 'lnameRow')) + self.EPDLLnamePosInRowSpinbox['state'] = TK.NORMAL + self.EPDLLnamePosInRowVar.set(FMT.R(self.loadingList.get(), 'lnamePositionInRow')) + self.EPDLSchoolRowSpinbox['state'] = TK.NORMAL + self.EPDLSchoolRowVar.set(FMT.R(self.loadingList.get(), 'schoolRow')) + self.EPDLSchoolPosInRowSpinbox['state'] = TK.NORMAL + self.EPDLSchoolPosInRowVar.set(FMT.R(self.loadingList.get(), 'schoolPositionInRow')) + self.EPDLClassRowSpinbox['state'] = TK.NORMAL + self.EPDLClassRowVar.set(FMT.R(self.loadingList.get(), 'classRow')) + self.EPDLClassPosInRowSpinbox['state'] = TK.NORMAL + self.EPDLClassPosInRowVar.set(FMT.R(self.loadingList.get(), 'classPositionInRow')) + self.formatInputCodingCombobox['state'] = 'readonly' + self.formatInputCodingVar.set(FMT.R(self.loadingList.get(), 'inputCoding')) + self.editingPresetSaveButton['state'] = TK.NORMAL + self.editingPresetCancelButton['state'] = TK.NORMAL + + def editingPresetClear(self): + formatFileContent = { + "student" : True, + "personSeparator" : '', + "rowSeparator" : '', + "dataSeparators" : [], + "loginRow" : 0, + "loginPositionInRow" : 0, + "fnameRow" : 0, + "fnamePositionInRow" : 0, + "lnameRow" : 0, + "lnamePositionInRow" : 0, + "schoolRow" : 0, + "schoolPositionInRow" : 0, + "classRow" : 0, + "classPositionInRow" : 0, + "inputCoding" : '', + } + self.loadingList['state'] = TK.NORMAL + self.loadingButton['state'] = TK.NORMAL + self.EPOSTypeVar.set(formatFileContent['student']) + self.EPOSTypeStudentRadiobutton['state'] = TK.DISABLED + self.EPOSTypeTeacherRadiobutton['state'] = TK.DISABLED + self.EPOSPersonSeparatorEntry['state'] = TK.DISABLED + self.EPOSPersonSeparatorVar.set(formatFileContent['personSeparator']) + self.EPOSRowSeparatorEntry['state'] = TK.DISABLED + self.EPOSRowSeparatorVar.set(formatFileContent['rowSeparator']) + self.EPOSDataSeparatorText.delete('1.0', TK.END) + self.EPOSDataSeparatorText['state'] = TK.DISABLED + self.EPDLLoginRowSpinbox['state'] = TK.DISABLED + self.EPDLLoginRowVar.set(formatFileContent['loginRow']) + self.EPDLLoginPosInRowSpinbox['state'] = TK.DISABLED + self.EPDLLoginPosInRowVar.set(formatFileContent['loginPositionInRow']) + self.EPDLFnameRowSpinbox['state'] = TK.DISABLED + self.EPDLFnameRowVar.set(formatFileContent['fnameRow']) + self.EPDLFnamePosInRowSpinbox['state'] = TK.DISABLED + self.EPDLFnamePosInRowVar.set(formatFileContent['fnamePositionInRow']) + self.EPDLLnameRowSpinbox['state'] = TK.DISABLED + self.EPDLLnameRowVar.set(formatFileContent['lnameRow']) + self.EPDLLnamePosInRowSpinbox['state'] = TK.DISABLED + self.EPDLLnamePosInRowVar.set(formatFileContent['lnamePositionInRow']) + self.EPDLSchoolRowSpinbox['state'] = TK.DISABLED + self.EPDLSchoolRowVar.set(formatFileContent['schoolRow']) + self.EPDLSchoolPosInRowSpinbox['state'] = TK.DISABLED + self.EPDLSchoolPosInRowVar.set(formatFileContent['schoolPositionInRow']) + self.EPDLClassRowSpinbox['state'] = TK.DISABLED + self.EPDLClassRowVar.set(formatFileContent['classRow']) + self.EPDLClassPosInRowSpinbox['state'] = TK.DISABLED + self.EPDLClassPosInRowVar.set(formatFileContent['classPositionInRow']) + self.formatInputCodingCombobox['state'] = TK.DISABLED + self.formatInputCodingVar.set(formatFileContent['inputCoding']) + self.editingPresetSaveButton['state'] = TK.DISABLED + self.editingPresetCancelButton['state'] = TK.DISABLED + self.loadingList['values'] = tuple(FMT.getList()) + + def updatePresetListInGenerateTab(self): + self.GIF1SFormatCombobox['values'] = tuple(FMT.getList()) + self.GIF2SFormatCombobox['values'] = tuple(FMT.getList()) + self.GIF3SFormatCombobox['values'] = tuple(FMT.getList()) + self.GIF4SFormatCombobox['values'] = tuple(FMT.getList()) + + def editingPresetSave(self): + formatFileContentToSave = { + "student" : self.EPOSTypeVar.get(), + "personSeparator" : self.EPOSPersonSeparatorEntry.get(), + "rowSeparator" : self.EPOSRowSeparatorEntry.get(), + "dataSeparators" : (self.EPOSDataSeparatorText.get("1.0", TK.END)).split('\n')[:-1], + "loginRow" : self.EPDLLoginRowSpinbox.get(), + "loginPositionInRow" : self.EPDLLoginPosInRowSpinbox.get(), + "fnameRow" : self.EPDLFnameRowSpinbox.get(), + "fnamePositionInRow" : self.EPDLFnamePosInRowSpinbox.get(), + "lnameRow" : self.EPDLLnameRowSpinbox.get(), + "lnamePositionInRow" : self.EPDLLnamePosInRowSpinbox.get(), + "schoolRow" : self.EPDLSchoolRowSpinbox.get(), + "schoolPositionInRow" : self.EPDLSchoolPosInRowSpinbox.get(), + "classRow" : self.EPDLClassRowSpinbox.get(), + "classPositionInRow" : self.EPDLClassPosInRowSpinbox.get(), + "inputCoding" : self.formatInputCodingCombobox.get() + } + if not FMT.W(self.loadingList.get(), formatFileContentToSave): + return + self.editingPresetClear() + self.updatePresetListInGenerateTab() + + def editingPresetSaveButtonAction(self): + if self.loadingList.get() not in FMT.getList(): + if MSG('A0001', False): + self.editingPresetSave() + else: + return + else: + if MSG('A0002', False): + self.editingPresetSave() + else: + return + + def editingPresetCancelButtonAction(self): + self.editingPresetClear() + + # Akcje przycisków - TAB3 + + def settingsReset(self): + self.settingsMailCodeCombobox.set(CFG.R('mailOutputCoding')) + self.settingsOfficeCodeCombobox.set(CFG.R('officeOutputCoding')) + self.settingsOtherDomainVar.set(CFG.R('domain')) + self.settingsOtherQuotaSpinbox.set(CFG.R('quota')) + self.settingsOtherCountryVar.set(CFG.R('country')) + self.settingsOtherDRRSMonthSpinbox.set(CFG.R('schoolyearStart')['M']) + self.settingsOtherDRRSDaySpinbox.set(CFG.R('schoolyearStart')['D']) + self.settingsSchoolDataText.delete('1.0', TK.END) + for x in CFG.R('schoolData'): + if x[2]: + x[2] = '1' + else: + x[2] = '0' + x[1] = str(x[1]) + self.settingsSchoolDataText.insert(TK.END, (' | '.join(x) + '\n')) + self.settingsHeadlinesMailCheckbuttonVar.set(CFG.R('ifHeadlineInMail')) + self.settingsHeadlinesMailEntryVar.set(CFG.R('headlineInMail')) + self.settingsHeadlinesOfficeCheckbuttonVar.set(CFG.R('ifHeadlineInOffice')) + self.settingsHeadlinesOfficeEntryVar.set(CFG.R('headlineInOffice')) + + def settingsButtonSaveAction(self): + if MSG('A0004', False): + changes = {} + changes['mailOutputCoding'] = self.settingsMailCodeCombobox.get() + changes['officeOutputCoding'] = self.settingsOfficeCodeCombobox.get() + changes['domain'] = self.settingsOtherDomainVar.get() + changes['quota'] = self.settingsOtherQuotaSpinbox.get() + changes['country'] = self.settingsOtherCountryVar.get() + changes['schoolyearStart'] = { + 'D' : self.settingsOtherDRRSDaySpinbox.get(), + 'M' : self.settingsOtherDRRSMonthSpinbox.get(), + 'Y' : None, + 'h' : None, + 'm' : None, + 's' : None, + } + changes['schoolData'] = (self.settingsSchoolDataText.get("1.0", TK.END)).split('\n') + changes['ifHeadlineInMail'] = self.settingsHeadlinesMailCheckbuttonVar.get() + changes['headlineInMail'] = self.settingsHeadlinesMailEntryVar.get() + changes['ifHeadlineInOffice'] = self.settingsHeadlinesOfficeCheckbuttonVar.get() + changes['headlineInOffice'] = self.settingsHeadlinesOfficeEntryVar.get() + CFG.W(changes) + self.settingsReset() + else: + return + + def settingsButtonCancelAction(self): + self.settingsReset() + + def settingsButtonPDUOAction(self): + if MSG('A0005', False): + try: + OS.remove(str(VAR.appdataPath) + '\Generator CSV\config.cfg') + SU.copy('configs/config.cfg', str(VAR.appdataPath) + '\Generator CSV\config.cfg') + except Exception as exceptInfo: + MSG('E0001', True, exceptInfo) + MSG('I0002', True) + else: + return + + def settingsButtonPDUWAction(self): + if MSG('A0006', False): + try: + OS.remove(str(VAR.appdataPath) + '\Generator CSV\style.cfg') + SU.copy('configs/style.cfg', str(VAR.appdataPath) + '\Generator CSV\style.cfg') + except Exception as exceptInfo: + MSG('E0001', True, exceptInfo) + MSG('I0002', True) + else: + return + + def deleteSelectedFPButtonAction(self): + if MSG('A0007', False): + selected = self.selectFPListbox.curselection() + for x in selected: + try: + OS.remove(str(VAR.appdataPath) + ('/Generator CSV/format-presets') + ('\%s.fmt' % self.selectFPListbox.get(x))) + except Exception as exceptInfo: + MSG('E0015', True, exceptInfo) + MSG('I0001', False) + self.updatePresetListInGenerateTab() + self.loadingList['values'] = tuple(FMT.getList()) + self.selectFPListbox.delete(0, TK.END) + for x in FMT.getList(): + self.selectFPListbox.insert(TK.END, x) + else: + return + + def settingsButtonZPFAction(self): + # Pod okno + self.ZPFWindow = TK.Toplevel(self.master) + self.ZPFWindow.title("Zarządzanie presetami formatu") + self.ZPFWindow.geometry('%ix%i' % (GUI.R('ZPFWindowWidth'), GUI.R('ZPFWindowHeight'))) + self.ZPFWindow.resizable(width = GUI.R('ZPFWindowWidthResizable'), height = GUI.R('ZPFWindowHeightResizable')) + self.ZPFWindow.configure(bg = GUI.R('ZPFWindowMainBG')) + self.ZPFWindow.iconbitmap(GUI.R('mainIcon')) + + # Wybór format presetu - listbox + self.selectFPListbox = TK.Listbox(self.ZPFWindow) + self.selectFPListbox.config(activestyle = GUI.R('listbox1ActiveStyle')) + self.selectFPListbox.config(bg = GUI.R('listbox1BG')) + self.selectFPListbox.config(fg = GUI.R('listbox1TextColor')) + self.selectFPListbox.config(relief = GUI.R('listbox1Relief')) + self.selectFPListbox.config(bd = GUI.R('listbox1BorderWidth')) + self.selectFPListbox.config(highlightthickness = GUI.R('listbox1HighlightThickness')) + self.selectFPListbox.config(selectbackground = GUI.R('listbox1SelectBG')) + self.selectFPListbox.config(selectmode = TK.MULTIPLE) + self.selectFPListbox.pack(fill = TK.BOTH, expand = 1, padx = 6, pady = 6) + for x in FMT.getList(): + self.selectFPListbox.insert(TK.END, x) + + # Usuń zaznaczone - Button + self.deleteSelectedFPButton = TKttk.Button(self.ZPFWindow) + self.deleteSelectedFPButton.config(style = 'button1.TButton') + self.deleteSelectedFPButton.config(text = 'Usuń zaznaczone') + self.deleteSelectedFPButton.config(command = self.deleteSelectedFPButtonAction) + self.deleteSelectedFPButton.pack(fill = TK.X, padx = 6, pady = 6) + + def aboutInstructionButtonAction(self): + try: + OS.startfile('documentation\index.html') + except Exception as exceptInfo: + MSG('E0016', False, exceptInfo) + + + + +# Inicjacja okna +root = TK.Tk() +windowInit = mainWindow(root) +root.mainloop() \ No newline at end of file