diff --git a/.idea/GeneratorCSV 3.1.iml b/.idea/GeneratorCSV 3.1.iml deleted file mode 100644 index ed5ea5b..0000000 --- a/.idea/GeneratorCSV 3.1.iml +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - - - - - - - \ No newline at end of file diff --git a/.idea/inspectionProfiles/profiles_settings.xml b/.idea/inspectionProfiles/profiles_settings.xml deleted file mode 100644 index 20fc29e..0000000 --- a/.idea/inspectionProfiles/profiles_settings.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml deleted file mode 100644 index adbabba..0000000 --- a/.idea/misc.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml deleted file mode 100644 index 84256e7..0000000 --- a/.idea/modules.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml deleted file mode 100644 index 9661ac7..0000000 --- a/.idea/vcs.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/.idea/workspace.xml b/.idea/workspace.xml deleted file mode 100644 index 27fa3ca..0000000 --- a/.idea/workspace.xml +++ /dev/null @@ -1,114 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 1575129057993 - - - - - - - - - - - - - - \ No newline at end of file diff --git a/assets/icon.ico b/assets/icon.ico new file mode 100644 index 0000000..11e00aa Binary files /dev/null and b/assets/icon.ico differ diff --git a/assets/other_images/icon.png b/assets/other_images/icon.png new file mode 100644 index 0000000..91780fd Binary files /dev/null and b/assets/other_images/icon.png differ diff --git a/assets/tab_icons/generate.png b/assets/tab_icons/generate.png new file mode 100644 index 0000000..aeaa409 Binary files /dev/null and b/assets/tab_icons/generate.png differ diff --git a/assets/tab_icons/icon.png b/assets/tab_icons/icon.png new file mode 100644 index 0000000..91780fd Binary files /dev/null and b/assets/tab_icons/icon.png differ diff --git a/assets/tab_icons/info.png b/assets/tab_icons/info.png new file mode 100644 index 0000000..b43f70e Binary files /dev/null and b/assets/tab_icons/info.png differ diff --git a/assets/tab_icons/link.png b/assets/tab_icons/link.png new file mode 100644 index 0000000..8a86672 Binary files /dev/null and b/assets/tab_icons/link.png differ diff --git a/assets/tab_icons/merge.png b/assets/tab_icons/merge.png new file mode 100644 index 0000000..19d4ac5 Binary files /dev/null and b/assets/tab_icons/merge.png differ diff --git a/assets/tab_icons/settings.png b/assets/tab_icons/settings.png new file mode 100644 index 0000000..09f4cbb Binary files /dev/null and b/assets/tab_icons/settings.png differ diff --git a/changelog-UC.txt b/changelog-UC.txt index def0dfb..601629f 100644 --- a/changelog-UC.txt +++ b/changelog-UC.txt @@ -51,4 +51,11 @@ - 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' \ No newline at end of file +- 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 \ No newline at end of file diff --git a/config.cfg b/config.cfg deleted file mode 100644 index 59688b9..0000000 --- a/config.cfg +++ /dev/null @@ -1,7 +0,0 @@ -Ciemny motyw(0/1): 1 -Kodowanie wyjsciowe: utf-8 -Domena: losobolew.pl -Quota: 500 -Kraj: Rzeczypospolita Polska -Dlugosc liceum: 4 -Dlugosc branzowej: 3 \ No newline at end of file diff --git a/format.fmt b/format.fmt deleted file mode 100644 index 1ac672d..0000000 --- a/format.fmt +++ /dev/null @@ -1,5 +0,0 @@ -K O N, I X L X -Q - -N, I X L X -Q \ No newline at end of file diff --git a/generator.py b/generator.py index 7aec5bc..3a34c22 100644 --- a/generator.py +++ b/generator.py @@ -1,8 +1,8 @@ """ # Generator CSV -# Wersja 4.0 Experimental +# 4.0 Experimental # by Mateusz Skoczek -# luty 2019 - grudzień 2019 +# styczeń 2019 - luty 2020 # dla ZSP Sobolew # @@ -14,784 +14,292 @@ +# -------------------- # Import bibliotek zewnętrznych # -------------------- # - - -# -------------------------------------------- # Informacje o programie # -------------------------------------------- # - -Nazwa = 'Generator CSV' -Wersja = '4.0 Experimental' -LataPracy = '2019' -Autorzy = 'Mateusz Skoczek' - - - - - - - - -# ----------------------------------- # Import bibliotek zewnętrznych i modułów # ------------------------------------ # - -# Biblioteki zewnętrzne +# Biblioteki główne import os as OS import sys as SS +import time as TM -# Moduły składowe programu -try: - from modules import dialog as MDdlg -except ModuleNotFoundError: - print('Wystąpił krytyczny błąd!') - print('Nie znaleziono jednego z modułów programu (dialog.py). Nie można załadować programu') - print('Kod błędu: E00x0011') - wait = input('Naciśnij ENTER aby wyjść') - SS.exit(0) -except Exception as exc: - print('Wystąpił krytyczny błąd!') - print('Nieznany błąd podczas ładowania jednego z modułów programu (dialog.py). Nie można załadować programu.') - print('Treść błędu: ' + str(exc)) - print('Kod błędu: E00x0010') - wait = input('Naciśnij ENTER aby wyjść') - SS.exit(0) - -try: - from modules import load_config as MDlcg -except ModuleNotFoundError: - print('Wystąpił krytyczny błąd!') - print('Nie znaleziono jednego z modułów programu (load_config.py). Nie można załadować programu') - print('Kod błędu: E00x0021') - wait = input('Naciśnij ENTER aby wyjść') - SS.exit(0) -except Exception as exc: - print('Wystąpił krytyczny błąd!') - print('Nieznany błąd podczas ładowania jednego z modułów programu (load_config.py). Nie można załadować programu.') - print('Treść błędu: ' + str(exc)) - print('Kod błędu: E00x0020') - wait = input('Naciśnij ENTER aby wyjść') - SS.exit(0) - -try: - from modules import load_format as MDlfm -except ModuleNotFoundError: - print('Wystąpił krytyczny błąd!') - print('Nie znaleziono jednego z modułów programu (load_format.py). Nie można załadować programu') - print('Kod błędu: E00x0031') - wait = input('Naciśnij ENTER aby wyjść') - SS.exit(0) -except Exception as exc: - print('Wystąpił krytyczny błąd!') - print('Nieznany błąd podczas ładowania jednego z modułów programu (load_format.py). Nie można załadować programu.') - print('Treść błędu: ' + str(exc)) - print('Kod błędu: E00x0030') - wait = input('Naciśnij ENTER aby wyjść') - SS.exit(0) - - -# Biblioteki zewnętrzne interfejsu graficznego +# Framework i inne biblioteki interfejsu graficznego import tkinter as TK - -from tkinter import filedialog as TKfld from tkinter import ttk as TKttk +from tkinter import filedialog as TKfld +try: + from PIL import ImageTk as PLitk + from PIL import Image as PLimg +except ModuleNotFoundError: + OS.system("python -m pip install pip") + OS.system("python -m pip install Pillow") + OS.system("cls") + from PIL import ImageTk as PLitk + from PIL import Image as PLimg + + + + + +# ------------------ # Import plików składowych programu # ------------------ # + +# Funkcja tworząca plik zawierający logi błędu +def excpt(filename, importingFilename, errorcode, exceptInfo): + filepath = './crashlogs/crash_' + str(TM.localtime()[2]) + str(TM.localtime()[1]) + str(TM.localtime()[0]) + str(TM.localtime()[3]) + str(TM.localtime()[4]) + str(TM.localtime()[5]) + '.txt' + try: + OS.mkdir('./crashlogs') + except: + pass + crashfile = open(filepath, 'w') + crashfile.write('CRASH!\n') + crashfile.write('An error occurred while loading the component file: %s\n' % importingFilename) + crashfile.write('In file: %s\n' % filename) + crashfile.write('%s\n' % exceptInfo) + crashfile.write('Errorcode: %s' % errorcode) + crashfile.close() + SS.exit(0) + + + +# vars.py +try: + from src.vars import prgInfo as SCvar_inf + from src.vars import guiVars as SCvar_gui +except Exception as exceptInfo: + excpt('generator.py', 'variables.py', 'E000000', exceptInfo) #TODO Kod + + + + + +# -------------------------------- # Okno # --------------------------------- # + +# Budowa okna +def gui(): + # Ustawienia okna + root = TK.Tk() + root.title(SCvar_inf.name + " " + SCvar_inf.version) + root.resizable(width = SCvar_gui.other.windowWidthResize, height = SCvar_gui.other.windowHeightResize) + root.configure(bg = SCvar_gui.color.mainBG) + root.iconbitmap(SCvar_gui.image.programIcon) + + + + + # Motyw + TKttk.Style().theme_create("main", parent = "alt", settings = { + "mainMenu.TNotebook":{ + "configure": { + "background": SCvar_gui.color.mainBG, + "tabposition": SCvar_gui.other.tabPosition, + "borderwidth": SCvar_gui.dimension.tabWindowBorderWidth, + } + }, + "mainMenu.TNotebook.Tab":{ + "configure": { + "background": SCvar_gui.color.unselectedTabBG, + "borderwidth": SCvar_gui.dimension.borderTab, + "padding": SCvar_gui.dimension.iconPaddingTab, + }, + "map": { + "background": [("selected", SCvar_gui.color.selectedTabBG), ("disabled", SCvar_gui.color.headerBG)], + } + } + }) + TKttk.Style().theme_use("main") - - - - - - -# ------------------------------------- # Uruchomienie interfejsu graficznego # -------------------------------------- # - -# Zmienne globalne środowiska graficznego -if int(MDlcg.read()[0]) == 1: - CiemnyMotyw = True -else: - CiemnyMotyw = False -SzerokoscOpisu = 17 -SzerokoscOpisu2 = 30 -SzerokoscOpisu3 = 10 -SzerokoscPola = 122 -SzerokoscPola2 = 107 -SzerokoscPola3 = 130 - - - -# Zmienne motywu -if CiemnyMotyw: - ZmienneMotywu = ['#1F1F1F', '#191919', '#B8B8B8', '#FFFFFF', '#404040', '#FFFFFF', '#1F1F1F', 1] -else: - ZmienneMotywu = ['#F0F0F0', '#D4D4D4', '#000000', '#000000', '#A6A6A6', '#000000', '#FFFFFF', 2] - -M_tlo = ZmienneMotywu[0] -M_tytultlo = ZmienneMotywu[1] -M_tytultext = ZmienneMotywu[2] -M_text = ZmienneMotywu[3] -M_przycisktlo = ZmienneMotywu[4] -M_przycisktext = ZmienneMotywu[5] -M_entrytlo = ZmienneMotywu[6] -M_framewielkosc = ZmienneMotywu[7] - - - -# Okno główne -class Main(TK.Tk): - def __init__(self): - # Ustawienia okna - TK.Tk.__init__(self) - self.title(Nazwa + " " + Wersja) - self.resizable(width = False, height = False) - self.configure(bg = M_tlo) - - - # Tytuł - Tytul = TK.Label(self) - Tytul.config(text = Nazwa) - Tytul.config(width = 41) - Tytul.config(bg = M_tytultlo) - Tytul.config(fg = M_tytultext) - Tytul.config(font = ('Segoe UI Semilight', 30)) - Tytul.grid(row = 0) - - - # Frame1 - Pliki z danymi - Ramka1 = TK.LabelFrame(self) - Ramka1.config(text=' Pliki tekstowe zawierające dane (wymagany przynajmniej jeden) ') - Ramka1.config(borderwidth = M_framewielkosc) - Ramka1.config(bg = M_tlo) - Ramka1.config(fg = M_text) - Ramka1.grid(row = 1) - - - # Ścieżka pliku txt nr 1 - wiersz = 1 - text1 = TK.StringVar() - - Pole1Label = TK.Label(Ramka1) - Pole1Label.config(text = 'Plik z danymi (1)') - Pole1Label.config(width = SzerokoscOpisu) - Pole1Label.config(bg = M_tlo) - Pole1Label.config(fg = M_text) - Pole1Label.grid(row = wiersz, column = 0) - - Pole1 = TK.Entry(Ramka1) - Pole1.config(textvariable = text1) - Pole1.config(width = SzerokoscPola) - Pole1.config(bg = M_entrytlo) - Pole1.config(fg = M_text) - Pole1.grid(row = wiersz, column = 1) - - def Pole1BrowseDialog(): - Pole1Browse.filename = TKfld.askopenfilename(title = "Wybierz plik tekstowy z danymi", filetypes = (("Pliki txt", "*.txt"), ("Wszystkie pliki", "*.*"))) - Pole1.delete(0, 'end') - Pole1.insert(0, Pole1Browse.filename) - - Pole1Browse = TK.Button(Ramka1) - Pole1Browse.config(text = '...') - Pole1Browse.config(command = Pole1BrowseDialog) - Pole1Browse.config(bg = M_przycisktlo) - Pole1Browse.config(fg = M_przycisktext) - Pole1Browse.config(relief = 'flat') - Pole1Browse.config(activebackground = M_przycisktlo) - Pole1Browse.grid(row = wiersz, column = 2, padx=5, pady=3) - - - # Ścieżka pliku txt nr 2 - wiersz = 2 - text2 = TK.StringVar() - - Pole2Label = TK.Label(Ramka1) - Pole2Label.config(text = 'Plik z danymi (2)') - Pole2Label.config(width = SzerokoscOpisu) - Pole2Label.config(bg = M_tlo) - Pole2Label.config(fg = M_text) - Pole2Label.grid(row = wiersz, column = 0) - - Pole2 = TK.Entry(Ramka1) - Pole2.config(textvariable = text2) - Pole2.config(width = SzerokoscPola) - Pole2.config(bg = M_entrytlo) - Pole2.config(fg = M_text) - Pole2.grid(row = wiersz, column = 1) - - def Pole2BrowseDialog(): - Pole2Browse.filename = TKfld.askopenfilename(title = "Wybierz plik tekstowy z danymi", filetypes = (("Pliki txt", "*.txt"), ("Wszystkie pliki", "*.*"))) - Pole2.delete(0, 'end') - Pole2.insert(0, Pole2Browse.filename) - - Pole2Browse = TK.Button(Ramka1) - Pole2Browse.config(text = '...') - Pole2Browse.config(command = Pole2BrowseDialog) - Pole2Browse.config(bg = M_przycisktlo) - Pole2Browse.config(fg = M_przycisktext) - Pole2Browse.config(relief = 'flat') - Pole2Browse.config(activebackground = M_przycisktlo) - Pole2Browse.grid(row = wiersz, column = 2, padx = 5, pady = 3) - - # Ścieżka pliku txt nr 3 - wiersz = 3 - text3 = TK.StringVar() - - Pole3Label = TK.Label(Ramka1) - Pole3Label.config(text = 'Plik z danymi (3)') - Pole3Label.config(width = SzerokoscOpisu) - Pole3Label.config(bg = M_tlo) - Pole3Label.config(fg = M_text) - Pole3Label.grid(row = wiersz, column = 0) - - Pole3 = TK.Entry(Ramka1) - Pole3.config(textvariable = text3) - Pole3.config(width = SzerokoscPola) - Pole3.config(bg = M_entrytlo) - Pole3.config(fg = M_text) - Pole3.grid(row = wiersz, column = 1) - - def Pole3BrowseDialog(): - Pole3Browse.filename = TKfld.askopenfilename(title = "Wybierz plik tekstowy z danymi", filetypes = (("Pliki txt", "*.txt"), ("Wszystkie pliki", "*.*"))) - Pole3.delete(0, 'end') - Pole3.insert(0, Pole3Browse.filename) - - Pole3Browse = TK.Button(Ramka1) - Pole3Browse.config(text = '...') - Pole3Browse.config(command = Pole3BrowseDialog) - Pole3Browse.config(bg = M_przycisktlo) - Pole3Browse.config(fg = M_przycisktext) - Pole3Browse.config(relief = 'flat') - Pole3Browse.config(activebackground = M_przycisktlo) - Pole3Browse.grid(row = wiersz, column = 2, padx = 5, pady = 3) - - - # Frame2 - Dołącz pliki .csv - Ramka2 = TK.LabelFrame(self) - Ramka2.config(text = ' Dołącz pliki .csv (opcjonalne) ') - Ramka2.config(borderwidth = M_framewielkosc) - Ramka2.config(bg = M_tlo) - Ramka2.config(fg = M_text) - Ramka2.grid(row = 2) - - - # Sciezka do konta.csv - wiersz = 1 - textKonta = TK.StringVar() - - PoleKontaLabel = TK.Label(Ramka2) - PoleKontaLabel.config(text = 'Ściezka do pliku .csv dla poczty') - PoleKontaLabel.config(width = SzerokoscOpisu2) - PoleKontaLabel.config(bg = M_tlo) - PoleKontaLabel.config(fg = M_text) - PoleKontaLabel.grid(row = wiersz, column = 0) - - PoleKonta = TK.Entry(Ramka2) - PoleKonta.config(textvariable = textKonta) - PoleKonta.config(width = SzerokoscPola2) - PoleKonta.config(bg = M_entrytlo) - PoleKonta.config(fg = M_text) - PoleKonta.grid(row = wiersz, column = 1) - - def PoleKontaBrowseDialog(): - PoleKontaBrowse.filename = TKfld.askopenfilename(title="Wybierz plik .csv dla poczty", filetypes=(("Pliki csv", "*.csv"), ("Wszystkie pliki", "*.*"))) - PoleKonta.delete(0, 'end') - PoleKonta.insert(0, PoleKontaBrowse.filename) - - PoleKontaBrowse = TK.Button(Ramka2) - PoleKontaBrowse.config(text = '...') - PoleKontaBrowse.config(command = PoleKontaBrowseDialog) - PoleKontaBrowse.config(bg = M_przycisktlo) - PoleKontaBrowse.config(fg = M_przycisktext) - PoleKontaBrowse.config(relief = 'flat') - PoleKontaBrowse.config(activebackground = M_przycisktlo) - PoleKontaBrowse.grid(row = wiersz, column = 2, padx = 5, pady = 3) - - - # Sciezka do office.csv - wiersz = 2 - textOffice = TK.StringVar() - - PoleOfficeLabel = TK.Label(Ramka2) - PoleOfficeLabel.config(text = 'Ściezka do pliku .csv dla office365') - PoleOfficeLabel.config(width = SzerokoscOpisu2) - PoleOfficeLabel.config(bg = M_tlo) - PoleOfficeLabel.config(fg = M_text) - PoleOfficeLabel.grid(row = wiersz, column = 0) - - PoleOffice = TK.Entry(Ramka2) - PoleOffice.config(textvariable = textOffice) - PoleOffice.config(width = SzerokoscPola2) - PoleOffice.config(bg = M_entrytlo) - PoleOffice.config(fg = M_text) - PoleOffice.grid(row = wiersz, column = 1) - - def PoleOfficeBrowseDialog(): - PoleOfficeBrowse.filename = TKfld.askopenfilename(title = "Wybierz plik .csv dla office365", filetypes = (("Pliki csv", "*.csv"), ("Wszystkie pliki", "*.*"))) - PoleOffice.delete(0, 'end') - PoleOffice.insert(0, PoleOfficeBrowse.filename) - - PoleOfficeBrowse = TK.Button(Ramka2) - PoleOfficeBrowse.config(text = '...') - PoleOfficeBrowse.config(command = PoleOfficeBrowseDialog) - PoleOfficeBrowse.config(bg = M_przycisktlo) - PoleOfficeBrowse.config(fg = M_przycisktext) - PoleOfficeBrowse.config(relief = 'flat') - PoleOfficeBrowse.config(activebackground = M_przycisktlo) - PoleOfficeBrowse.grid(row = wiersz, column = 2, padx = 5, pady = 3) - - - # Frame3 - Eksport - Ramka3 = TK.LabelFrame(self) - Ramka3.config(text=' Eksport ') - Ramka3.config(borderwidth = M_framewielkosc) - Ramka3.config(bg = M_tlo) - Ramka3.config(fg = M_text) - Ramka3.grid(row = 3) - - - # Sciezka do pliku poczty - wiersz = 1 - textKontaEksport = TK.StringVar() - - PoleKontaEksportLabel = TK.Label(Ramka3) - PoleKontaEksportLabel.config(text = 'Poczta') - PoleKontaEksportLabel.config(width = SzerokoscOpisu3) - PoleKontaEksportLabel.config(bg = M_tlo) - PoleKontaEksportLabel.config(fg = M_text) - PoleKontaEksportLabel.grid(row = wiersz, column = 0) - - PoleKontaEksport = TK.Entry(Ramka3) - PoleKontaEksport.config(textvariable = textKontaEksport) - PoleKontaEksport.config(width = SzerokoscPola3) - PoleKontaEksport.config(bg = M_entrytlo) - PoleKontaEksport.config(fg = M_text) - PoleKontaEksport.grid(row = wiersz, column = 1) - - def PoleKontaEksportBrowseDialog(): - PoleKontaEksportBrowse.filename = TKfld.askdirectory(title = "Zapisz w...") - PoleKontaEksport.delete(0, 'end') - PoleKontaEksport.insert(0, PoleKontaEksportBrowse.filename) - - PoleKontaEksportBrowse = TK.Button(Ramka3) - PoleKontaEksportBrowse.config(text = '...') - PoleKontaEksportBrowse.config(command = PoleKontaEksportBrowseDialog) - PoleKontaEksportBrowse.config(bg = M_przycisktlo) - PoleKontaEksportBrowse.config(fg = M_przycisktext) - PoleKontaEksportBrowse.config(relief = 'flat') - PoleKontaEksportBrowse.config(activebackground = M_przycisktlo) - PoleKontaEksportBrowse.grid(row = wiersz, column = 2, padx = 5, pady = 3) - - # Sciezka do pliku office - wiersz = 2 - textOfficeEksport = TK.StringVar() - - PoleOfficeEksportLabel = TK.Label(Ramka3) - PoleOfficeEksportLabel.config(text = 'Office') - PoleOfficeEksportLabel.config(width = SzerokoscOpisu3) - PoleOfficeEksportLabel.config(bg = M_tlo) - PoleOfficeEksportLabel.config(fg = M_text) - PoleOfficeEksportLabel.grid(row = wiersz, column = 0) - - PoleOfficeEksport = TK.Entry(Ramka3) - PoleOfficeEksport.config(textvariable = textOfficeEksport) - PoleOfficeEksport.config(width = SzerokoscPola3) - PoleOfficeEksport.config(bg = M_entrytlo) - PoleOfficeEksport.config(fg = M_text) - PoleOfficeEksport.grid(row = wiersz, column = 1) - - def PoleOfficeEksportBrowseDialog(): - PoleOfficeEksportBrowse.filename = TKfld.askdirectory(title = "Zapisz w...",) - PoleOfficeEksport.delete(0, 'end') - PoleOfficeEksport.insert(0, PoleOfficeEksportBrowse.filename) - - PoleOfficeEksportBrowse = TK.Button(Ramka3) - PoleOfficeEksportBrowse.config(text = '...') - PoleOfficeEksportBrowse.config(command = PoleOfficeEksportBrowseDialog) - PoleOfficeEksportBrowse.config(bg = M_przycisktlo) - PoleOfficeEksportBrowse.config(fg = M_przycisktext) - PoleOfficeEksportBrowse.config(relief = 'flat') - PoleOfficeEksportBrowse.config(activebackground = M_przycisktlo) - PoleOfficeEksportBrowse.grid(row = wiersz, column = 2, padx = 5, pady = 3) - - # Przycisk START - def PathPreprocess(): - pass - - PrzyciskSTART = TK.Button(self) - PrzyciskSTART.config(text = 'START') - PrzyciskSTART.config(command = PathPreprocess) - PrzyciskSTART.config(width = 50) - PrzyciskSTART.config(bg = M_przycisktlo) - PrzyciskSTART.config(fg = M_przycisktext) - PrzyciskSTART.config(relief = 'flat') - PrzyciskSTART.config(activebackground = M_przycisktlo) - PrzyciskSTART.grid(row = 4, pady = 15) - - # Pasek dolny - PasekDolny = TK.LabelFrame(self) - PasekDolny.config(bd = 0) - PasekDolny.config(bg = M_tytultlo) - PasekDolny.config(fg = M_tytultext) - PasekDolny.grid(row=5) - - InfoLabel = TK.Label(PasekDolny) - InfoLabel.config(text = Nazwa + ' ' + Wersja + ' | © ' + Autorzy + ' ' + LataPracy + ' dla ZSP Sobolew') - InfoLabel.config(width = 107) - InfoLabel.config(justify = 'left') - InfoLabel.config(anchor='w') - InfoLabel.config(bg = M_tytultlo) - InfoLabel.config(fg = M_tytultext) - InfoLabel.grid(row = 0, column = 0) - - def InfoOpen(): - try: - x = open('readme.txt') - except FileNotFoundError: - MDdlg.err(4) - except: - MDdlg.err(22) - else: - OS.system("notepad readme.txt") - - PrzyciskINFO = TK.Button(PasekDolny) - PrzyciskINFO.config(text = 'Instrukcja') - PrzyciskINFO.config(command = InfoOpen) - PrzyciskINFO.config(bg = M_przycisktlo) - PrzyciskINFO.config(fg = M_przycisktext) - PrzyciskINFO.config(relief = 'flat') - PrzyciskINFO.config(activebackground = M_przycisktlo) - PrzyciskINFO.grid(row = 0, column = 1, padx = 5, pady = 5) - - PrzyciskUSTAWIENIA = TK.Button(PasekDolny) - PrzyciskUSTAWIENIA.config(text = 'Ustawienia') - PrzyciskUSTAWIENIA.config(command = self.settingsButton) - PrzyciskUSTAWIENIA.config(bg = M_przycisktlo) - PrzyciskUSTAWIENIA.config(fg = M_przycisktext) - PrzyciskUSTAWIENIA.config(relief = 'flat') - PrzyciskUSTAWIENIA.grid(row = 0, column = 2, padx = 5, pady = 5) - - def settingsButton(self): - self.child = Settings(self) - - def run(self): - self.mainloop() - -# Okno ustawień -class Settings(TK.Toplevel): - def __init__(self, parent): - # Ustawienia okna - TK.Toplevel.__init__(self, parent) - self.title('Ustawienia') - self.resizable(width = False, height = False) - self.configure(bg = M_tlo) - - liczbawierszy = 0 - - # Tytuł - Tytul = TK.Label(self) - Tytul.config(text = 'Ustawienia') - Tytul.config(width = 40) - Tytul.config(bg = M_tytultlo) - Tytul.config(fg = M_tytultext) - Tytul.config(font = ('Segoe UI Semilight', 20)) - Tytul.grid(row = 0) - - - # Frame1 - Motyw - liczbawierszy += 1 - Ramka1 = TK.LabelFrame(self) - Ramka1.config(text = ' Motyw programu ') - Ramka1.config(bg = M_tlo) - Ramka1.config(fg = M_text) - Ramka1.config(borderwidth = M_framewielkosc) - Ramka1.grid(row = 1, pady = 5) - - - if int(MDlcg.read()[0]) == 1: - Motyw_list_set = 1 - else: - Motyw_list_set = 0 - Motyw_list = TKttk.Combobox(Ramka1) - Motyw_list.config(textvariable = TK.StringVar()) - Motyw_list.config(state = 'readonly') - Motyw_list.config(width = 93) - Motyw_list.grid(row = 0, pady = 5, padx = 5) - Motyw_list['values'] = ('Jasny', 'Ciemny') - Motyw_list.current(Motyw_list_set) - - - # Frame2 - Kodowanie - liczbawierszy += 1 - Ramka2 = TK.LabelFrame(self) - Ramka2.config(text = ' Kodowanie wyjściowe ') - Ramka2.config(bg = M_tlo) - Ramka2.config(fg = M_text) - Ramka2.config(borderwidth = M_framewielkosc) - Ramka2.grid(row = 2, pady = 5) - - Code_list = TKttk.Combobox(Ramka2) - Code_list.config(textvariable = TK.StringVar()) - Code_list.config(state = 'readonly') - Code_list.config(width = 93) - Code_list.grid(row = 0, pady = 5, padx = 5) - Code_list['values'] = ('utf-8') - Code_list.set(MDlcg.read()[1]) - - - # Frame3 - Format plików wejściowych - SzerokoscPolaWej = 35 - WysokoscPolaWej = 8 - - liczbawierszy += 1 - Ramka3 = TK.LabelFrame(self) - Ramka3.config(text = ' Format plików wejściowych ') - Ramka3.config(bg = M_tlo) - Ramka3.config(fg = M_text) - Ramka3.config(borderwidth = M_framewielkosc) - Ramka3.grid(row = 3, pady = 5) - - UczniowieLabel = TK.Label(Ramka3) - UczniowieLabel.config(text = 'Uczniowie') - UczniowieLabel.config(justify = 'center') - UczniowieLabel.config(bg = M_tlo) - UczniowieLabel.config(fg = M_text) - UczniowieLabel.grid(row = 0, column = 0) - - uczfmt = MDlfm.read()[0] - uczfmt = '\n'.join(uczfmt) - UczniowieFormat = TK.Text(Ramka3) - UczniowieFormat.config(width = SzerokoscPolaWej) - UczniowieFormat.config(height = WysokoscPolaWej) - UczniowieFormat.config(bg = M_entrytlo) - UczniowieFormat.config(fg = M_text) - UczniowieFormat.grid(row = 1, column = 0, padx = 5, pady = 5) - UczniowieFormat.insert(TK.END, uczfmt) - - NauczycieleLabel = TK.Label(Ramka3) - NauczycieleLabel.config(text = 'Nauczyciele') - NauczycieleLabel.config(justify = 'center') - NauczycieleLabel.config(bg = M_tlo) - NauczycieleLabel.config(fg = M_text) - NauczycieleLabel.grid(row = 0, column = 1) - - nczfmt = MDlfm.read()[1] - nczfmt = '\n'.join(nczfmt) - NauczycieleFormat = TK.Text(Ramka3) - NauczycieleFormat.config(width = SzerokoscPolaWej) - NauczycieleFormat.config(height = WysokoscPolaWej) - NauczycieleFormat.config(bg = M_entrytlo) - NauczycieleFormat.config(fg = M_text) - NauczycieleFormat.grid(row = 1, column = 1, padx = 5, pady = 5) - NauczycieleFormat.insert(TK.END, nczfmt) - - OpisFmt = TK.LabelFrame(Ramka3) - OpisFmt.config(bg=M_tlo) - OpisFmt.config(fg=M_text) - OpisFmt.config(borderwidth=0) - OpisFmt.grid(row=2, pady=5, columnspan=4) - - Opis1 = TK.Label(OpisFmt) - Opis1.config(text='Dozwolone znaki:') - Opis1.config(bg=M_tlo) - Opis1.config(fg=M_text) - Opis1.grid(row=0, columnspan=7) - - Opis2_1 = TK.Label(OpisFmt) - Opis2_1.config(text='K - Klasa') - Opis2_1.config(bg=M_tlo) - Opis2_1.config(fg=M_text) - Opis2_1.grid(row=1, column=0) - - Opis2_2 = TK.Label(OpisFmt) - Opis2_2.config(text='O - Oddzial') - Opis2_2.config(bg=M_tlo) - Opis2_2.config(fg=M_text) - Opis2_2.grid(row=1, column=1) - - Opis2_3 = TK.Label(OpisFmt) - Opis2_3.config(text='N - Nazwisko') - Opis2_3.config(bg=M_tlo) - Opis2_3.config(fg=M_text) - Opis2_3.grid(row=1, column=2) - - Opis2_4 = TK.Label(OpisFmt) - Opis2_4.config(text='I - Imię') - Opis2_4.config(bg=M_tlo) - Opis2_4.config(fg=M_text) - Opis2_4.grid(row=1, column=3) - - Opis2_5 = TK.Label(OpisFmt) - Opis2_5.config(text='L - Login') - Opis2_5.config(bg=M_tlo) - Opis2_5.config(fg=M_text) - Opis2_5.grid(row=1, column=4) - - Opis2_6 = TK.Label(OpisFmt) - Opis2_6.config(text = 'X - Dane nieznaczące') - Opis2_6.config(bg = M_tlo) - Opis2_6.config(fg = M_text) - Opis2_6.grid(row = 1, column = 5) - - Opis2_6 = TK.Label(OpisFmt) - Opis2_6.config(text='Q - Pusta linia') - Opis2_6.config(bg=M_tlo) - Opis2_6.config(fg=M_text) - Opis2_6.grid(row=1, column=6) - - Opis3 = TK.Label(OpisFmt) - Opis3.config(text='Pozostałe znaki oprócz cyfr i pozostałych liter') - Opis3.config(bg=M_tlo) - Opis3.config(fg=M_text) - Opis3.grid(row=2, columnspan = 7) - - - # Frame4 - Stałe - liczbawierszy += 1 - Ramka4 = TK.LabelFrame(self) - Ramka4.config(text = ' Ustawienia generowania ') - Ramka4.config(bg = M_tlo) - Ramka4.config(fg = M_text) - Ramka4.config(borderwidth = M_framewielkosc) - Ramka4.grid(row = 4, pady = 5) - - - # Długość liceum i branżowej - RamkaDl = TK.LabelFrame(Ramka4) - RamkaDl.config(bg = M_tlo) - RamkaDl.config(fg = M_text) - RamkaDl.config(borderwidth = 0) - RamkaDl.grid(row = 0, pady = 5, columnspan = 2) - - DlLicLabel = TK.Label(RamkaDl) - DlLicLabel.config(text = 'Lata nauki w liceum') - DlLicLabel.config(width = SzerokoscOpisu + 5) - DlLicLabel.config(bg = M_tlo) - DlLicLabel.config(fg = M_text) - DlLicLabel.grid(row = 0, column = 0) - - DlLicValue = TK.IntVar() - DlLicPole = TK.Spinbox(RamkaDl) - DlLicPole.config(textvariable = DlLicValue) - DlLicPole.config(from_ = 1, to = 10) - DlLicPole.config(width = 18) - DlLicPole.config(bg = M_entrytlo) - DlLicPole.config(fg = M_text) - DlLicPole.grid(row = 0, column = 1, padx = 5, pady = 5) - DlLicPole.delete(0, 'end') - DlLicPole.insert(0, int(MDlcg.read()[5])) - - DlBrLabel = TK.Label(RamkaDl) - DlBrLabel.config(text='Lata nauki w branżowej') - DlBrLabel.config(width = SzerokoscOpisu + 5) - DlBrLabel.config(bg = M_tlo) - DlBrLabel.config(fg = M_text) - DlBrLabel.grid(row = 0, column = 2) - - DlBrValue = TK.IntVar() - DlBrPole = TK.Spinbox(RamkaDl) - DlBrPole.config(textvariable = DlBrValue) - DlBrPole.config(from_ = 1, to=10) - DlBrPole.config(width = 18) - DlBrPole.config(bg = M_entrytlo) - DlBrPole.config(fg = M_text) - DlBrPole.grid(row = 0, column = 3, padx = 5, pady = 5) - DlBrPole.delete(0, 'end') - DlBrPole.insert(0, int(MDlcg.read()[6])) - - - # Domena - - DomenaLabel = TK.Label(Ramka4) - DomenaLabel.config(text = 'Domena') - DomenaLabel.config(width = SzerokoscOpisu + 5) - DomenaLabel.config(bg = M_tlo) - DomenaLabel.config(fg = M_text) - DomenaLabel.grid(row = 2, column = 0) - - text1 = TK.StringVar() - PoleDomena = TK.Entry(Ramka4) - PoleDomena.config(textvariable = text1) - PoleDomena.config(width = 69) - PoleDomena.config(bg = M_entrytlo) - PoleDomena.config(fg = M_text) - PoleDomena.grid(row = 2, column = 1, padx = 5, pady = 5) - PoleDomena.insert(0, MDlcg.read()[2]) - - - # Quota - - QuotaLabel = TK.Label(Ramka4) - QuotaLabel.config(text = 'Quota (MB)') - QuotaLabel.config(width = SzerokoscOpisu) - QuotaLabel.config(bg = M_tlo) - QuotaLabel.config(fg = M_text) - QuotaLabel.grid(row = 3, column = 0) - - value2 = TK.IntVar() - PoleQuota = TK.Spinbox(Ramka4) - PoleQuota.config(textvariable = value2) - PoleQuota.config(from_ = 1, to = 100000) - PoleQuota.config(width = 67) - PoleQuota.config(bg = M_entrytlo) - PoleQuota.config(fg = M_text) - PoleQuota.grid(row = 3, column = 1, padx = 5, pady = 5) - PoleQuota.delete(0, 'end') - PoleQuota.insert(0, int(MDlcg.read()[3])) - - - # Kraj - - KrajLabel = TK.Label(Ramka4) - KrajLabel.config(text = 'Kraj') - KrajLabel.config(width = SzerokoscOpisu + 5) - KrajLabel.config(bg = M_tlo) - KrajLabel.config(fg = M_text) - KrajLabel.grid(row = 4, column = 0) - - KrajValue = TK.StringVar() - KrajPole = TK.Entry(Ramka4) - KrajPole.config(textvariable = KrajValue) - KrajPole.config(width = 69) - KrajPole.config(bg = M_entrytlo) - KrajPole.config(fg = M_text) - KrajPole.grid(row = 4, column = 1, padx = 5, pady = 5) - KrajPole.insert(0, MDlcg.read()[4]) - - - # Przycisk ZAPISZ - def save(): - if MDdlg.ask(1): - motyw = Motyw_list.get() - if motyw == 'Jasny': - motyw = '0' - else: - motyw = '1' - kodowanie = Code_list.get() - uczniowiefmt = UczniowieFormat.get('1.0', 'end') - nauczycielefmt = NauczycieleFormat.get('1.0', 'end') - liclata = DlLicPole.get() - brlata = DlBrPole.get() - domena = PoleDomena.get() - quota = PoleQuota.get() - kraj = KrajPole.get() - SettingsToSave = [motyw, kodowanie, domena, quota, kraj, liclata, brlata] - FormatToSave = [uczniowiefmt, nauczycielefmt] - if MDlfm.edit(FormatToSave): - MDlcg.edit(SettingsToSave) - MDdlg.inf(0) - self.destroy() - else: - pass - PrzyciskZAPISZ = TK.Button(self) - PrzyciskZAPISZ.config(text = 'ZAPISZ') - PrzyciskZAPISZ.config(command = save) - PrzyciskZAPISZ.config(width = 50) - PrzyciskZAPISZ.config(bg = M_przycisktlo) - PrzyciskZAPISZ.config(fg = M_przycisktext) - PrzyciskZAPISZ.config(relief = 'flat') - PrzyciskZAPISZ.config(activebackground = M_przycisktlo) - PrzyciskZAPISZ.grid(row = liczbawierszy + 1, pady = 15) - - - -# Inicjacja okna głównego -OknoGlowne = Main() -OknoGlowne.run() \ No newline at end of file + + + # Menu główne + mainMenu = TKttk.Notebook(root) + mainMenu.config(style = "mainMenu.TNotebook") + mainMenu.grid(row = 1) + + # TAB1 - Ikona + iconTab = TK.Frame(mainMenu) + iconTab.config(background = SCvar_gui.color.mainBG) + iconTabImg = PLimg.open(SCvar_gui.image.iconTab) + iconTabImg = iconTabImg.resize((SCvar_gui.dimension.iconTab, SCvar_gui.dimension.iconTab), PLimg.ANTIALIAS) + iconTabImg = PLitk.PhotoImage(iconTabImg) + mainMenu.add(iconTab, image = iconTabImg, state = TK.DISABLED) + + # TAB2 - Generowanie plików + generateTab = TK.Frame(mainMenu) + generateTab.config(background = SCvar_gui.color.mainBG) + generateTabImg = PLimg.open(SCvar_gui.image.generateTab) + generateTabImg = generateTabImg.resize((SCvar_gui.dimension.iconTab, SCvar_gui.dimension.iconTab), PLimg.ANTIALIAS) + generateTabImg = PLitk.PhotoImage(generateTabImg) + mainMenu.add(generateTab, image = generateTabImg) + + # TAB3 - Dołącz do pliku + linkTab = TK.Frame(mainMenu) + linkTab.config(background = SCvar_gui.color.mainBG) + linkTabImg = PLimg.open(SCvar_gui.image.linkTab) + linkTabImg = linkTabImg.resize((SCvar_gui.dimension.iconTab, SCvar_gui.dimension.iconTab), PLimg.ANTIALIAS) + linkTabImg = PLitk.PhotoImage(linkTabImg) + mainMenu.add(linkTab, image = linkTabImg) + + # TAB4 - Łączenie plików + mergeTab = TK.Frame(mainMenu) + mergeTab.config(background = SCvar_gui.color.mainBG) + mergeTabImg = PLimg.open(SCvar_gui.image.mergeTab) + mergeTabImg = mergeTabImg.resize((SCvar_gui.dimension.iconTab, SCvar_gui.dimension.iconTab), PLimg.ANTIALIAS) + mergeTabImg = PLitk.PhotoImage(mergeTabImg) + mainMenu.add(mergeTab, image = mergeTabImg) + + # TAB5 - Ustawienia + settingsTab = TK.Frame(mainMenu) + settingsTab.config(background = SCvar_gui.color.mainBG) + settingsTabImg = PLimg.open(SCvar_gui.image.settingsTab) + settingsTabImg = settingsTabImg.resize((SCvar_gui.dimension.iconTab, SCvar_gui.dimension.iconTab), PLimg.ANTIALIAS) + settingsTabImg = PLitk.PhotoImage(settingsTabImg) + mainMenu.add(settingsTab, image = settingsTabImg) + + # TAB6 - Informacje + infoTab = TK.Frame(mainMenu) + infoTab.config(background = SCvar_gui.color.mainBG) + infoTabImg = PLimg.open(SCvar_gui.image.infoTab) + infoTabImg = infoTabImg.resize((SCvar_gui.dimension.iconTab, SCvar_gui.dimension.iconTab), PLimg.ANTIALIAS) + infoTabImg = PLitk.PhotoImage(infoTabImg) + mainMenu.add(infoTab, image = infoTabImg) + + + + + # TAB2 + tab2Label = TK.Label(generateTab) + tab2Label.config(text = 'GENEROWANIE PLIKÓW CSV') + tab2Label.config(font = (SCvar_gui.fonts.tabHeader[0], SCvar_gui.fonts.tabHeader[1])) + tab2Label.config(bg = SCvar_gui.color.headerBG) + tab2Label.config(fg = SCvar_gui.color.headerText) + tab2Label.config(bd = SCvar_gui.dimension.tabHeaderHeight) + tab2Label.config(width = SCvar_gui.dimension.tabHeaderWidth) + tab2Label.grid(row = 0) + + + + + # TAB3 + tab3Label = TK.Label(linkTab) + tab3Label.config(text = 'DOŁĄCZANIE DO PLIKU CSV') + tab3Label.config(font = (SCvar_gui.fonts.tabHeader[0], SCvar_gui.fonts.tabHeader[1])) + tab3Label.config(bg = SCvar_gui.color.headerBG) + tab3Label.config(fg = SCvar_gui.color.headerText) + tab3Label.config(bd = SCvar_gui.dimension.tabHeaderHeight) + tab3Label.config(width = SCvar_gui.dimension.tabHeaderWidth) + tab3Label.grid(row = 0) + + + + + # TAB4 + tab4Label = TK.Label(mergeTab) + tab4Label.config(text = 'ŁĄCZENIE PLIKÓW CSV') + tab4Label.config(font = (SCvar_gui.fonts.tabHeader[0], SCvar_gui.fonts.tabHeader[1])) + tab4Label.config(bg = SCvar_gui.color.headerBG) + tab4Label.config(fg = SCvar_gui.color.headerText) + tab4Label.config(bd = SCvar_gui.dimension.tabHeaderHeight) + tab4Label.config(width = SCvar_gui.dimension.tabHeaderWidth) + tab4Label.grid(row = 0) + + + + + # TAB5 + tab5Label = TK.Label(settingsTab) + tab5Label.config(text = 'USTAWIENIA') + tab5Label.config(font = (SCvar_gui.fonts.tabHeader[0], SCvar_gui.fonts.tabHeader[1])) + tab5Label.config(bg = SCvar_gui.color.headerBG) + tab5Label.config(fg = SCvar_gui.color.headerText) + tab5Label.config(bd = SCvar_gui.dimension.tabHeaderHeight) + tab5Label.config(width = SCvar_gui.dimension.tabHeaderWidth) + tab5Label.grid(row = 0) + + + + + # TAB6 + tab6Label = TK.Label(infoTab) + tab6Label.config(text = 'INFORMACJE') + tab6Label.config(font = (SCvar_gui.fonts.tabHeader[0], SCvar_gui.fonts.tabHeader[1])) + tab6Label.config(bg = SCvar_gui.color.headerBG) + tab6Label.config(fg = SCvar_gui.color.headerText) + tab6Label.config(bd = SCvar_gui.dimension.tabHeaderHeight) + tab6Label.config(width = SCvar_gui.dimension.tabHeaderWidth) + tab6Label.grid(row = 0) + + # Separator1 + separator1 = TK.Label(infoTab) + separator1.config(bg = SCvar_gui.color.mainBG) + separator1.config(height = SCvar_gui.dimension.separator1Height) + separator1.grid(row = 1) + + # Ikona + programIcon = PLimg.open(SCvar_gui.image.programIconOther) + programIcon = programIcon.resize((SCvar_gui.dimension.programIconInInfo, SCvar_gui.dimension.programIconInInfo), PLimg.ANTIALIAS) + programIcon = PLitk.PhotoImage(programIcon) + programIconPlace = TK.Label(infoTab) + programIconPlace.config(image = programIcon) + programIconPlace.config(background = SCvar_gui.color.mainBG) + programIconPlace.config(height = SCvar_gui.dimension.programIconInInfoPlace) + programIconPlace.grid(row = 2) + + # Nazwa programu + programName = TK.Label(infoTab) + programName.config(text = SCvar_inf.name) + programName.config(font = (SCvar_gui.fonts.info1[0], SCvar_gui.fonts.info1[1])) + programName.config(background = SCvar_gui.color.mainBG) + programName.config(foreground = SCvar_gui.color.headerText) + programName.grid(row = 3) + + # Wersja programu + programVersion = TK.Label(infoTab) + programVersion.config(text = 'Wersja ' + SCvar_inf.version) + programVersion.config(font = (SCvar_gui.fonts.info1[0], SCvar_gui.fonts.info1[2])) + programVersion.config(background = SCvar_gui.color.mainBG) + programVersion.config(foreground = SCvar_gui.color.headerText) + programVersion.grid(row = 4) + + # Separator2 + separator2 = TK.Label(infoTab) + separator2.config(bg = SCvar_gui.color.mainBG) + separator2.config(height = SCvar_gui.dimension.separator2Height) + separator2.grid(row = 5) + + # Copyright + copyrightInfo = TK.Label(infoTab) + copyrightInfo.config(text = '© ' + SCvar_inf.years) + copyrightInfo.config(font = (SCvar_gui.fonts.info1[0], SCvar_gui.fonts.info1[3])) + copyrightInfo.config(background = SCvar_gui.color.mainBG) + copyrightInfo.config(foreground = SCvar_gui.color.headerText) + copyrightInfo.grid(row = 6) + + # Autorzy + authors = '' + for x in SCvar_inf.authors: + authors += (x + '\n') + authors += ('dla ' + SCvar_inf.school) + authorsInfo = TK.Label(infoTab) + authorsInfo.config(text = authors) + authorsInfo.config(font = (SCvar_gui.fonts.info1[0], SCvar_gui.fonts.info1[4])) + authorsInfo.config(background = SCvar_gui.color.mainBG) + authorsInfo.config(foreground = SCvar_gui.color.headerText) + authorsInfo.grid(row = 7) + + # Separator3 + separator3 = TK.Label(infoTab) + separator3.config(bg = SCvar_gui.color.mainBG) + separator3.config(height = SCvar_gui.dimension.separator3Height) + separator3.grid(row = 8) + + + + + # Mainloop + root.mainloop() + + +# Inicjacja okna +gui() \ No newline at end of file diff --git a/modules/__init__.py b/modules/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/modules/__pycache__/__init__.cpython-38.pyc b/modules/__pycache__/__init__.cpython-38.pyc deleted file mode 100644 index 624116c..0000000 Binary files a/modules/__pycache__/__init__.cpython-38.pyc and /dev/null differ diff --git a/modules/__pycache__/dialog.cpython-38.pyc b/modules/__pycache__/dialog.cpython-38.pyc deleted file mode 100644 index dea199b..0000000 Binary files a/modules/__pycache__/dialog.cpython-38.pyc and /dev/null differ diff --git a/modules/__pycache__/load_config.cpython-38.pyc b/modules/__pycache__/load_config.cpython-38.pyc deleted file mode 100644 index 9d50b02..0000000 Binary files a/modules/__pycache__/load_config.cpython-38.pyc and /dev/null differ diff --git a/modules/__pycache__/load_format.cpython-38.pyc b/modules/__pycache__/load_format.cpython-38.pyc deleted file mode 100644 index df0cdcc..0000000 Binary files a/modules/__pycache__/load_format.cpython-38.pyc and /dev/null differ diff --git a/modules/dialog.py b/modules/dialog.py deleted file mode 100644 index e7f9174..0000000 --- a/modules/dialog.py +++ /dev/null @@ -1,105 +0,0 @@ -""" -# GeneratorCSV -# Wersja 4.0 Experimental -# by Mateusz Skoczek -# luty 2019 - grudzień 2019 -# dla ZSP Sobolew - -# -# Moduł wywołujący okna dialogowe -# -""" - - - - - - - - -# ----------------------------------------------- # Kody dialogowe # ------------------------------------------------- # - -E = [] # Błędy -E.append(["Nie znaleziono pliku konfiguracyjnego (config.cfg).\nPrzywróć plik. (E01x0001)", True]) #0 -E.append(["Błąd pliku konfiguracyjnego (config.cfg).\nNiepoprawna ilość wierszy w pliku\nPrzywróć plik. (E01x0011)", True]) #1 -E.append(["Bład pliku konfiguracyjnego (config.cfg).\nNiepoprawne dane w wierszu 1\nPrzywróć plik. (E01x0021)", True]) #2 -E.append(["Bład pliku konfiguracyjnego (config.cfg).\nNiepoprawne dane w wierszu 2\nPrzywróć plik. (E01x0022)", True]) #3 -E.append(["Nie znaleziono pliku składowego (readme.txt)\nPrzywróć plik. (E03x0011)", False]) #4 -E.append(["Nie znaleziono pliku formatu (format.fmt).\nPrzywróć plik (E02x0000)", True]) #5 -E.append(["Błąd pliku formatu (format.fmt).\nNie poprawne dane w formacie uczniów.\nIlość znaczników klasy w formacie uczniów nie jest równa 1 (E02x0102)", False]) #6 -E.append(["Błąd pliku formatu (format.fmt).\nNie poprawne dane w formacie uczniów.\nIlość znaczników oddziału w formacie uczniów nie jest równa 1 (E02x0103)", False]) #7 -E.append(["Błąd pliku formatu (format.fmt).\nNie poprawne dane w formacie uczniów.\nIlość znaczników nazwiska w formacie uczniów nie jest równa 1 (E02x0104)", False]) #8 -E.append(["Błąd pliku formatu (format.fmt).\nNie poprawne dane w formacie uczniów.\nIlość znaczników imienia w formacie uczniów nie jest równa 1 (E02x0105)", False]) #9 -E.append(["Błąd pliku formatu (format.fmt).\nNie poprawne dane w formacie uczniów.\nIlość znaczników loginu w formacie uczniów nie jest równa 1 (E02x0106)", False]) #10 -E.append(["Błąd pliku formatu (format.fmt).\nPusty wiersz w formacie uczniów (E02x0101).", False]) #11 -E.append(["Błąd pliku formatu (format.fmt).\nPusty wiersz w formacie nauczycieli (E02x0111).", False]) #12 -E.append(["Błąd pliku formatu (format.fmt).\nNie poprawne dane w formacie nauczycieli.\nIlość znaczników nazwiska w formacie nauczycieli nie jest równa 1 (E02x0112)", False]) #13 -E.append(["Błąd pliku formatu (format.fmt).\nNie poprawne dane w formacie nauczycieli.\nIlość znaczników imienia w formacie nauczycieli nie jest równa 1 (E02x0113)", False]) #14 -E.append(["Błąd pliku formatu (format.fmt).\nNie poprawne dane w formacie nauczycieli.\nIlość znaczników loginu w formacie nauczycieli nie jest równa 1 (E02x0114)", False]) #15 -E.append(["Błąd pliku formatu (format.fmt).\nNiedozwolone znaki w formacie. (E02x0120).", False]) #16 -E.append(["Bład pliku konfiguracyjnego (config.cfg).\nNiepoprawne dane w wierszu 4\nPrzywróć plik. (E01x0023)", True]) #17 -E.append(["Bład pliku konfiguracyjnego (config.cfg).\nNiepoprawne dane w wierszu 6\nPrzywróć plik. (E01x0024)", True]) #18 -E.append(["Bład pliku konfiguracyjnego (config.cfg).\nNiepoprawne dane w wierszu 7\nPrzywróć plik. (E01x0025)", True]) #19 -E.append(["Nieznany błąd podczas ładowania pliku konfiguracyjnego (config.cfg). (E01x0000)", True]) #20 -E.append(["Nieznany błąd podczas ładowania pliku formatu (format.fmt)). (E02x0000)", True]) #21 -E.append(["Nieznany błąd podczas ładowania pliku składowego (readme.txt) (E03x0011)", False]) #22 - - - -I = [] # Informacje -I.append(["Pomyślnie zapisano!\nDla niektórych zmian może być wymagane ponowne uruchomienie programu", False]) #0 (I0001) - - - -A = [] # Zapytania -A.append("Czy na pewno chcesz rozpocząć generowanie?") #0 (A0001) -A.append("Czy chcesz zapisać ustawienia?") #1 (A0002) - - - - - - - -# ----------------------------------- # Import bibliotek zewnętrznych i modułów # ------------------------------------ # - -# Biblioteki zewnętrzne -import sys as SS - - - -# Biblioteki zewnętrzne interfejsu graficznego -from tkinter import messagebox as TKmsb - - - - - - - - -# --------------------------------------------------- # Funkcje # ---------------------------------------------------- # - -# Okno dialogowe błędu -def err(ErrorIndex): - Message = 'Wystąpił błąd!\n' + E[ErrorIndex][0] - TKmsb.showerror('Błąd', Message) - if E[ErrorIndex][1]: - SS.exit(0) - - - -# Okno dialogowe informacyjne -def inf(InfoIndex): - TKmsb.showinfo('Informacja', I[InfoIndex][0]) - if I[InfoIndex][1]: - SS.exit(0) - - - -# Okno dialogowe zapytania -def ask(AskIndex): - if TKmsb.askokcancel('Pytanie', A[AskIndex]): - return True - else: - return False diff --git a/modules/load_config.py b/modules/load_config.py deleted file mode 100644 index 73ac62e..0000000 --- a/modules/load_config.py +++ /dev/null @@ -1,135 +0,0 @@ -""" -# GeneratorCSV -# Wersja 4.0 Experimental -# by Mateusz Skoczek -# luty 2019 - grudzień 2019 -# dla ZSP Sobolew - -# -# Moduł zarządzający plikiem konfiguracyjnym -# -""" - - - - - - - - -# ----------------------------------- # Import bibliotek zewnętrznych i modułów # ------------------------------------ # - -# Biblioteki zewnętrzne -import sys as SS - - - -# Moduły składowe programu -try: - from modules import dialog as MDdlg -except ModuleNotFoundError: - print('Wystąpił krytyczny błąd!') - print('Nie znaleziono jednego z modułów programu (dialog.py). Nie można załadować programu') - print('Kod błędu: E00x0011') - wait = input('Naciśnij ENTER aby wyjść') - SS.exit(0) -except Exception as exc: - print('Wystąpił krytyczny błąd!') - print('Nieznany błąd podczas ładowania jednego z modułów programu (dialog.py). Nie można załadować programu.') - print('Treść błędu: ' + str(exc)) - print('Kod błędu: E00x0010') - wait = input('Naciśnij ENTER aby wyjść') - SS.exit(0) - - - - - - - -# --------------------------------------------------- # Funkcje # ---------------------------------------------------- # - -# Wewnętrzna funkcja sprawdzająca błędy pliku konfiguracyjnego -def CheckConfig(settings): - # Ilość wierszy - try: - if len(settings) != 7: - error = int('x') - except: - MDdlg.err(1) - - # Linia 1 (0/1) - try: - check = int(settings[0]) - if 0 > check > 1: - error = int('x') - except: - MDdlg.err(2) - # Linia 2 (utf-8) - - DostepneKodowanieWyjsciowe = ['utf-8'] - try: - if settings[1] not in DostepneKodowanieWyjsciowe: - error = int('x') - except: - MDdlg.err(3) - - # Linia 4 (int) - try: - x = int(settings[3]) - except: - MDdlg.err(17) - - # Linia 6 (int) - try: - x = int(settings[5]) - except: - MDdlg.err(18) - - # Linia 7 (int) - try: - x = int(settings[6]) - except: - MDdlg.err(19) - - -# Odczytywanie ustawień z pliku konfiguracyjnego -def read(): - try: - check = open('.\config.cfg') - except FileNotFoundError: - MDdlg.err(0) - except: - MDdlg.err(20) - else: - with open('.\config.cfg', 'r') as cfg: - config = cfg.read().split('\n') - settings = [] - for x in config: - settings.append(x.split(': ')[1]) - CheckConfig(settings) - return settings - - - -# Zapis ustawień do pliku konfiguracyjnego -def edit(settings): - CheckConfig(settings) - try: - check = open('.\config.cfg') - except FileNotFoundError: - MDdlg.err(0) - except: - MDdlg.err(20) - else: - SettingsToSave = [] - SettingsToSave.append('Ciemny motyw(0/1): ' + str(settings[0]) + '\n') - SettingsToSave.append('Kodowanie wyjsciowe: ' + str(settings[1]) + '\n') - SettingsToSave.append('Domena: ' + str(settings[2]) + '\n') - SettingsToSave.append('Quota: ' + str(settings[3]) + '\n') - SettingsToSave.append('Kraj: ' + str(settings[4]) + '\n') - SettingsToSave.append('Dlugosc liceum: ' + str(settings[5]) + '\n') - SettingsToSave.append('Dlugosc branzowej: ' + str(settings[6])) - with open('.\config.cfg', 'w') as cfg: - for x in SettingsToSave: - cfg.write(x) \ No newline at end of file diff --git a/modules/load_format.py b/modules/load_format.py deleted file mode 100644 index cc65371..0000000 --- a/modules/load_format.py +++ /dev/null @@ -1,249 +0,0 @@ -""" -# GeneratorCSV -# Wersja 4.0 Experimental -# by Mateusz Skoczek -# luty 2019 - grudzień 2019 -# dla ZSP Sobolew - -# -# Moduł zarządzający plikiem formatu -# -""" - - - - - - - - -# ----------------------------------- # Import bibliotek zewnętrznych i modułów # ------------------------------------ # - -# Biblioteki zewnętrzne -import sys as SS - - - -# Moduły składowe programu -try: - from modules import dialog as MDdlg -except ModuleNotFoundError: - print('Wystąpił krytyczny błąd!') - print('Nie znaleziono jednego z modułów programu (dialog.py). Nie można załadować programu') - print('Kod błędu: E00x0011') - wait = input('Naciśnij ENTER aby wyjść') - SS.exit(0) -except Exception as exc: - print('Wystąpił krytyczny błąd!') - print('Nieznany błąd podczas ładowania jednego z modułów programu (dialog.py). Nie można załadować programu.') - print('Treść błędu: ' + str(exc)) - print('Kod błędu: E00x0010') - wait = input('Naciśnij ENTER aby wyjść') - SS.exit(0) - - - - - - - - -# --------------------------------------------------- # Funkcje # ---------------------------------------------------- # - -# Wewnętrzna funkcja sprawdzająca błędy pliku formatu -def CheckFormat(Read, format): - poprawne = True - check = True - while check: - # Uczniowie - uczniowiefmt = '' - for x in format[0]: - uczniowiefmt += x - - # Sprawdzanie pustych linii - try: - if format[0].count('') > 0: - error = int('x') - except: - MDdlg.err(11) - if Read: - SS.exit(0) - else: - poprawne = False - break - - # Sprawdzanie ilości liter K - try: - if uczniowiefmt.count('K') != 1: - error = int('x') - except: - MDdlg.err(6) - if Read: - SS.exit(0) - else: - poprawne = False - break - - # Sprawdzanie ilości liter O - try: - if uczniowiefmt.count('O') != 1: - error = int('x') - except: - MDdlg.err(7) - if Read: - SS.exit(0) - else: - poprawne = False - break - - # Sprawdzanie ilości liter N - try: - if uczniowiefmt.count('N') != 1: - error = int('x') - except: - MDdlg.err(8) - if Read: - SS.exit(0) - else: - poprawne = False - break - - # Sprawdzanie ilości liter I - try: - if uczniowiefmt.count('I') != 1: - error = int('x') - except: - MDdlg.err(9) - if Read: - SS.exit(0) - else: - poprawne = False - break - - # Sprawdzanie ilości liter L - try: - if uczniowiefmt.count('L') != 1: - error = int('x') - except: - MDdlg.err(10) - if Read: - SS.exit(0) - else: - poprawne = False - break - - - # Nauczyciele - nauczycielefmt = '' - for x in format[1]: - nauczycielefmt += x - - # Sprawdzanie pustych linii - try: - if format[1].count('') > 0: - error = int('x') - except: - MDdlg.err(12) - if Read: - SS.exit(0) - else: - poprawne = False - break - - # Sprawdzanie ilości liter N - try: - if nauczycielefmt.count('N') != 1: - error = int('x') - except: - MDdlg.err(13) - if Read: - SS.exit(0) - else: - poprawne = False - break - - # Sprawdzanie ilości liter I - try: - if nauczycielefmt.count('I') != 1: - error = int('x') - except: - MDdlg.err(14) - if Read: - SS.exit(0) - else: - poprawne = False - break - - # Sprawdzanie ilości liter L - try: - if nauczycielefmt.count('L') != 1: - error = int('x') - except: - MDdlg.err(15) - if Read: - SS.exit(0) - else: - poprawne = False - break - - - # Sprawdzanie poprawności znaków - NiedozwoloneZnaki = ['1','2','3','4','5','6','7','8','9','0','W','E','R','T','Y','U','P','A','S','D','F','G','H','J','Z','C','V','B','M'] - try: - for x in NiedozwoloneZnaki: - if x in nauczycielefmt+uczniowiefmt: - error = int('x') - except: - MDdlg.err(16) - if Read: - SS.exit(0) - else: - poprawne = False - break - check = False - if not Read: - return poprawne - - - -# Odczytywanie ustawień z pliku formatu -def read(): - try: - check = open(r'.\format.fmt') - except FileNotFoundError: - MDdlg.err(5) - except: - MDdlg.err(21) - else: - with open(r'.\format.fmt', 'r') as fmt: - fmt = fmt.read().split('\n\n') - format = [] - for x in fmt: - format.append(x.split('\n')) - CheckFormat(True, format) - return format - - - -# Zapis ustawień do pliku formatu -def edit(format): - xformat = [] - for x in format: - xformat.append(x.split('\n')[:-1]) - if CheckFormat(False, xformat): - try: - check = open(r'.\format.fmt') - except FileNotFoundError: - MDdlg.err(5) - except: - MDdlg.err(21) - else: - FormatToSaveX = [] - for x in xformat: - FormatToSaveX.append('\n'.join(x)) - FormatToSave = FormatToSaveX[0] + '\n\n' + FormatToSaveX[1] - with open(r'.\format.fmt', 'w') as fmt: - fmt.write(FormatToSave) - return True - else: - return False diff --git a/readme.txt b/readme.txt deleted file mode 100644 index ae55ab1..0000000 --- a/readme.txt +++ /dev/null @@ -1,107 +0,0 @@ -Program tworzy pliki .csv potrzebne do stworzenia kont uczniów i nauczycieli na szkolnej poczcie i Office 365. -Obecnie program obsługuje tylko 4 pliki z danymi. Program tworzy pliki 'email.csv' do eksportu dla szkolnej poczty oraz 'office.csv' do eksportu dla kont office. -Obecna wersja: 3.0 -Autorzy: Mateusz Skoczek -dla ZSP Sobolew -luty 2019 - grudzień 2019 - - - - - -Format domyślny plików z danymi: - -Legenda: -X - Dane nieznaczące -Q - Pusta linia - -Uczniowie: -# , -# - -# Przykład: -# 1a BS Nowak, Adam 1234567u -# - -Nauczyciele: -# , -# - -# Przykład: -# Nowak, Adam 1234567 -# - -Format można edytować w pliku 'format.py'. Więcej info na dole. - - - - - -Format domyślny pliku 'office.csv': -Uczniowie: -# ,,,,uczeń,,,,,,,,,,Rzeczpospolita Polska - -# Przykład: -# adam.nowak@losobolew.pl,Adam,Nowak,Adam Nowak,uczeń,1a BS,,,,,,,,,Rzeczpospolita Polska - -Nauczyciele: -# ,,,,nauczyciel,,,,,,,,,,Rzeczpospolita Polska - -# Przykład: -# adam.nowak@losobolew.pl,Adam,Nowak,Adam Nowak,nauczyciel,,,,,,,,,,Rzeczpospolita Polska - - - - - -Format domyślny pliku 'email.csv': -Uczniowie: -# ,,500 -| -v -# .@losobolew.pl,:,500 - -# Przykład: -# adam.nowak2021bs@losobolew.pl,1234567u,500 - -Nauczyciele: -# ,,500 -| -v -# .@losobolew.pl,:,500 - -# Przykład: -# adam.nowak@losobolew.pl,1234567,500 - - - - - -Dalsze pojęcia: -błąd programu - błąd programu objawiający się komunikatem -krytyczny błąd programu - nieoczekiwany błąd programu nieobjawiający się komunikatem - - - - - -Pliki: - -changelog.txt -Informacje o zmianach w poszczególnych wersjach programu. - -generator.py -Główny plik programu. Jakiekolwiek naruszenie jego zawartości może spowodować krytyczny błąd programu. - -instrukcja.txt -Plik z instrukcją użytkowania. Usunięcie tego pliku spowoduje błąd programu. - -config.cfg -Plik zawiera ukryte ustawienia programu. Można go edytować, ale należy robić to z rozwagą. Usunięcie go spowoduje błąd programu. -1: Obsługiwane kodowania: 'utf-8', 'cp1252', 'iso-8859-1' - -moduly.py -Plik zawierający moduły niezbędne do działania programu. Usunięcie pliku spowoduje błąd programu. Naruszenie jego zawartości może spowodować krytyczny błąd programu. - -format.py -Plik ten jest skryptem przetwarzającym dane. W razie zmiany formatu pliku z danymi należy go edytować, lecz nie powinna tego robić osoba początkująca, gdyż błędny kod może spowodować krytyczny błąd programu lub niepożądane wyniki. Usunięcie pliku spowoduje błąd programu. \ No newline at end of file diff --git a/src/__pycache__/vars.cpython-38.pyc b/src/__pycache__/vars.cpython-38.pyc new file mode 100644 index 0000000..38f8669 Binary files /dev/null and b/src/__pycache__/vars.cpython-38.pyc differ diff --git a/src/vars.py b/src/vars.py new file mode 100644 index 0000000..7fdd26d --- /dev/null +++ b/src/vars.py @@ -0,0 +1,102 @@ +""" +# Generator CSV +# 4.0 Experimental +# by Mateusz Skoczek +# styczeń 2019 - luty 2020 +# dla ZSP Sobolew + +# +# Zmienne +# +""" + + + + + +# ----------------------- # Informacje o programie # ------------------------ # + +class prgInfo: + name = 'Generator CSV' # Nazwa programu + school = 'ZSP Sobolew' # Nazwa szkoły + version = '4.0 Experimental' # Wersja programu + years = '2019 - 2020' # Lata pracy na programem + authors = ['Mateusz Skoczek'] # Autorzy + + + + + +# ------------------- # Zmienne środowiska graficznego # -------------------- # + +class guiVars: + # Wymiary + class dimension: + # Karty + iconTab = 20 # Wielkość ikon w kartach + borderTab = 0 # Szerokość ramki kart + iconPaddingTab = 8 # Margines kart + tabWindowBorderWidth = 0 # Szerokość ramki okna kart + + # Nagłówki kart + tabHeaderHeight = 8 # Wysokość nagłówka + tabHeaderWidth = 80 # Szerokość nagłówka + + # Informacje + programIconInInfo = 100 # Szerokość/wysokość ikony + programIconInInfoPlace = 150 # Wysokość kontrolki zawierającej ikonę + separator1Height = 2 # Wysokość separator1 + separator2Height = 1 # Wysokość separator2 + separator3Height = 4 # Wysokość separator3 + + + # Kolory + class color: + # Głowne + mainBG = '#21242D' # Głowne tło + + # Karty + unselectedTabBG = '#21242D' # Niewybrana karta + selectedTabBG = '#333842' # Wybrana karta + + # Nagłowki kart + headerBG = '#282C34' # Tło + headerText = '#C0C0C0' # Tekst + + + # Grafika + class image: + # Ikona programu + programIcon = 'assets/icon.ico' + programIconOther = 'assets/other_images/icon.png' + + # Ikony kart + iconTab = 'assets/tab_icons/icon.png' + generateTab = 'assets/tab_icons/generate.png' + linkTab = 'assets/tab_icons/link.png' + mergeTab = 'assets/tab_icons/merge.png' + settingsTab = 'assets/tab_icons/settings.png' + infoTab = 'assets/tab_icons/info.png' + + + # Czcionki + class fonts: + # Główne + tabHeader = ['Segoe UI', 12] # Nagłowki + + # Informacje + info1 = ['Segoe UI'] # Czcionka + info1.append(20) # Wielkość tekstu - Nazwa programu + info1.append(10) # Wielkość tekstu - Wersja programu + info1.append(8) # Wielkość tekstu - Copyright + info1.append(8) # Wielkość tekstu - Autorzy + + + # Inne + class other: + # Ustawienia okna + windowHeightResize = False # Rozszerzanie okna w pionie + windowWidthResize = False # Rozszerzanie okna w poziomie + + # Ustawienia kart + tabPosition = 'wn' # Pozycja kart \ No newline at end of file