diff --git a/.vscode/launch.json b/.vscode/launch.json deleted file mode 100644 index cb017cc..0000000 --- a/.vscode/launch.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - // Use IntelliSense to learn about possible attributes. - // Hover to view descriptions of existing attributes. - // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 - "version": "0.2.0", - "configurations": [ - { - "name": "Python: Current File", - "type": "python", - "request": "launch", - "program": "${file}", - "console": "integratedTerminal" - }, - - ] -} \ No newline at end of file diff --git a/dev-changelog.txt b/dev-changelog.txt deleted file mode 100644 index c99cca9..0000000 --- a/dev-changelog.txt +++ /dev/null @@ -1,158 +0,0 @@ -4.0 Alpha (Build 19346) -- Wstępne podzielenie programu na kilka modułów i przeniesienie ich do folderu 'components' -- Dodanie w głównym (nadrzędnym) folderze programu, skryptu inicjującego główny moduł programu -- Dodanie zapisu opcji czarnego motywu do 'config.cfg' -- Wstępne stworzenie skryptu pozwalającego na zapis do pliku 'config.cfg' -- Błąd o braku głównego pliku składowego programu ('main.py') oraz modułu wywołującego okna dialogowe ('dialog.py') - -4.0 Alpha (Build 19346.1) -- Przebudowanie skryptu odczytującego plik konfiguracyjny -- Dodanie skryptu zapisującego ustawienia do pliku konfiguracyjnego -- Scalenie dwóch powyższych skryptów do modułu 'load_config.py' -- Przeprojektowanie kodu -- Lekkie przeprojektowanie układu interfejsu -- Stworzenie palety barw motywu jasnego i ciemnego -- Wprowadzenie motywu jasnego i ciemnego (z możliwością zmiany jedynie przez plik 'config.cfg' - -4.0 Alpha (Build 19346.2) -- Stworzenie okna ustawień programu - -4.0 Alpha (Build 19349) -- Ukończenie okna ustawień - -4.0 Alpha (Build 19349.1) -- Doprowadzenie programu do podstawowego stanu użyteczności (występuje błąd: nie można dodać drugiej ścieżki poprzez wybór) -- Utworzenie systemu crashlogów -- Zastosowanie systemu crashlogów dla głównego modułu - -4.0 Alpha (Build 19349.2) -- Nowy system dialogowy -- Stworzenie pliku formatu -- Usunięcie plików format.py i dataprocess.py -- Przygotowanie do dalszych prac - -4.0 Alpha (Build 19350) -- Zastosowanie klas -- Wstępne stworzenie systemu formatu -- Modyfikacja interfejsu -- Dodanie możliwości dołączenia plików csv do eksportowanych plików (tylko kontrolki) -- Usprawnienia kodu - -4.0 Alpha (Build 19353) -- Ukończenie ustawień - -4.0 Alpha (Build 19354) -- Przeniesienie głównego modułu do folderu nadrzędnego zamiast pliku inicjacji -- Zmieniony sposób ładowania modułów -- Ulepszona obsługa wyjątków dla ładowania modułów - -4.0 Alpha (Build 19355) -- Naprawienie przycisku instrukcji -- Zmiana nazwy pliku instrukcji na 'readme.txt' -- Naprawienie przycisków filedialog -- Zmiana zmiennej treści błędu na string -- Ulepszona obsługa wyjątków dla ładowania pliku konfiguracyjnego, formatu i 'readme.txt' - -4.0 Alpha (Build 20016) -- Całkowite przeprojektowanie interfejsu -- Całkowite przeprojektowanie struktury plików programu -- Przywrócenie systemu crashlogów -- Ukończenie karty 'informacje' -- Użycie skryptu instalującego automatycznie bibliotekę PIL - -4.0 Alpha (Build 20017) -- Ukończenie wizualnej części karty 'format' - -4.0 Alpha (Build 20181) -- Zmiana ikony -- Zmniejszenie liczby kart -- Wstępne ukończenie karty "FORMAT DANYCH" -- Zintegrowanie wszystkich plików składowych do głównego pliku programu -- Przeprojektowanie sposobu ładowania plików konfiguracyjnych -- Zastosowanie systemu styli do interfejsu -- Zastosowanie systemu zapisywania plików konfiguracyjnych i formatu w folderze %appdata% -- Usunięcie konsoli w tle -- Wiele mniejszych zmian - -4.0 Alpha (Build 20211) -- Dodanie filtrowania dozwolonych znaków separatorów -- Naprawienie kilku mniejszych bugów: nieresetowanie pól po błędzie podczas zapisu, dodanie do listy dozwolonych znaków -- Dodanie instrukcji w karcie "FORMAT DANYCH" -- Usprawnienia w kodzie -- Naprawiono przyciski radiobutton - -4.0 Alpha (Build 20219) -- Ukończenie karty "GENERATOR CSV" (poza przyciskiem "START") -- Usunięcie instrukcji w karcie "FORMAT DANYCH" w celu późniejszego umieszczenia ich w pliku readme -- Przekształcenie interfejsu na podstawie funkcji w interfejs na podstawie klasy - -4.0 Alpha (Build 20220) -- Zastosowanie nowego systemu przetwarzania plików konfiguracyjnych dla pliku 'config.cfg' (tylko odczyt) -- Rozpoczęcie prac nad skryptem przetwarzającym dane - -4.0 Alpha (Build 20221) -- Zastosowanie nowego systemu przetwarzania plików konfiguracyjnych dla pliku 'style.cfg' -- Lekkie zmiany w interfejsie - -4.0 Alpha (Build 20234) -- Ulepszony system sprawdzania katalogu appdata -- Zastosowanie nowego systemu przetwarzania plików konfiguracyjnych dla plików formatu -- Wstępne zastosowanie nowego systemu przetwarzania plików konfiguracyjnych dla pliku 'config.cfg' w zapisie danych -- Ukończenie skryptu przetwarzającego dane -- Poprawki błędów - -4.0 Alpha (Build 20240) -- Przeniesienie informacji o dozwolonych znakach separatora do zmiennej w programie -- Przeniesienie informacji o kodowaniu wejsciowym z pliku 'config.cfg' do plików formatu -- Zmiany w interfejsie w związku z dodaniem do plików formatu informacji o kodowaniu wejściowym -- Stworzenie listy dozwolonych kodowań w zmiennej w programie - -4.0 Alpha (Build 20241) -- Ukończenie karty 'USTAWIENIA' -- Zastosowanie nowego systemu przetwarzania plików konfiguracyjnych dla pliku 'config.cfg' w zapisie danych - -4.0 Beta (Build 20241.1) -- Ukończenie karty 'O PROGRAMIE' - -4.0 Beta (Build 20241.2) -- Dodanie do paska tytułu programVersionStage -- Pzzygotowanie strony na dokumentację i instrukcję - -4.0 Beta (Build 20242) -- Ukończenie instrukcji -- Ukończenie sekcji strony "O programie" -- Ukończenie sekcji strony "Opis" - -4.0 Beta (Build 20244) -- Wsparcie dla kodowania ANSI -- Wyeliminowanie błędu wyrzucającego wyjątek po naciśnięciu przycisku START bez wprowadzenia danych powyżej -- Poprawki w pliku wyjściowym office (usunięcie dwóch przecinków pomiedzy stanowiskiem a klasą) -- Wyeliminowanie błędu pokazującego w komunikacie o błędnych danych, przy zapisie format presetu, wpisanej wartości zamiast recordu -- Wyeliminowanie błędu pozwalającego na zapisanie wprowadzonego w spinboxie tekstu. - -4.0 Beta (Build 20245) -- Wyeliminowanie błędu uniemożliwającego pierwsze uruchomienie programu -- Wyeliminowanie błędu pozwalającego na wybranie tej samej lokalizacji dla pliku wyjściowego poczty i office -- Skrócenie sekcji strony "O programie" -- Dodanie mechanizmu usuwania katalogu programu w appdata po aktualizacji programu -- Wyeliminowanie błędu uniemożliwiającego zapisanie ustawień -- Dodanie możliwości dodawania nagłówków do plików wyjściowych -- Wsparcie dla kodowania ISO-8859-2 -- Wyeliminowanie błędu wyrzucającego wyjątek w przypadku próby zapisania format presetu o nazwie zawierającej zakazane znaki. -- Dodanie mechanizmu pozwalającego na automatyczne resetowanie katalogu programu w appdata podczas uruchamiania programu - -4.0 Beta (Build 20246) -- Zmiana domyślnych nagłówków -- Zmiana tekstu w przycisku w karcie 'O programie' -- Przeniesienie pliku 'changelog.txt' do sekcji strony 'O programie' -- Dodanie screenshotów programu do sekcji strony 'Opis' -- Rozpoczęcie prac nad sekcją strony 'Dokumentacja' -- Lekkie poprawki w kodzie programu - -4.0 Beta (Build 20252) -- Kontynuacja praca na sekcją strony 'Dokumentacja' -- Przeprojektowanie sprawdzania katalogu programu w appdata - -4.0 Beta (Build 20253) -- Ukończenie sekcji strony 'Dokumentacja' -- Dodano informację o ilości osób, których dane zostały przetworzone \ No newline at end of file diff --git a/documentation/about_program.html b/documentation/about_program.html index f8e85f9..18375ee 100644 --- a/documentation/about_program.html +++ b/documentation/about_program.html @@ -24,7 +24,7 @@

- Wersja 4.0 Beta (Build 20253) + Wersja 4.0 (Build 20254)

@@ -97,7 +97,16 @@

Wersja 4.0 (work in progress)




diff --git a/generator.exe b/generator.exe new file mode 100644 index 0000000..fdf6093 Binary files /dev/null and b/generator.exe differ diff --git a/generator.pyw b/generator.pyw deleted file mode 100644 index 0c921e6..0000000 --- a/generator.pyw +++ /dev/null @@ -1,3253 +0,0 @@ -""" -# 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 = 'Beta' - programVersionBuild = '20253' - 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