diff --git a/assets/icon.ico b/assets/icon.ico index 11e00aa..49f2657 100644 Binary files a/assets/icon.ico and b/assets/icon.ico differ diff --git a/assets/other_images/icon.png b/assets/other_images/icon.png deleted file mode 100644 index 91780fd..0000000 Binary files a/assets/other_images/icon.png and /dev/null differ diff --git a/assets/tab_icons/info.png b/assets/tab-icons/about.png similarity index 100% rename from assets/tab_icons/info.png rename to assets/tab-icons/about.png diff --git a/assets/tab_icons/format.png b/assets/tab-icons/format.png similarity index 100% rename from assets/tab_icons/format.png rename to assets/tab-icons/format.png diff --git a/assets/tab_icons/generate.png b/assets/tab-icons/generate.png similarity index 100% rename from assets/tab_icons/generate.png rename to assets/tab-icons/generate.png diff --git a/assets/tab_icons/settings.png b/assets/tab-icons/settings.png similarity index 100% rename from assets/tab_icons/settings.png rename to assets/tab-icons/settings.png diff --git a/assets/tab_icons/icon.png b/assets/tab_icons/icon.png deleted file mode 100644 index 91780fd..0000000 Binary files a/assets/tab_icons/icon.png and /dev/null differ diff --git a/assets/tab_icons/link.png b/assets/tab_icons/link.png deleted file mode 100644 index 8a86672..0000000 Binary files a/assets/tab_icons/link.png and /dev/null differ diff --git a/assets/tab_icons/merge.png b/assets/tab_icons/merge.png deleted file mode 100644 index 19d4ac5..0000000 Binary files a/assets/tab_icons/merge.png and /dev/null differ diff --git a/changelog-UC.txt b/changelog-UC.txt index 05acea9..d1e8a5c 100644 --- a/changelog-UC.txt +++ b/changelog-UC.txt @@ -61,4 +61,15 @@ - Użycie skryptu instalującego automatycznie bibliotekę PIL 4.0 Alpha (Build 20017) -- Ukończenie wizualnej części karty 'format' \ No newline at end of file +- 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 \ No newline at end of file diff --git a/config/format.cfg b/config/format.cfg deleted file mode 100644 index ec3a521..0000000 --- a/config/format.cfg +++ /dev/null @@ -1,9 +0,0 @@ -K O N, I X L X -Q - -N, I X L X -Q - -Q - -Q \ No newline at end of file diff --git a/default-configs/config.cfg b/default-configs/config.cfg new file mode 100644 index 0000000..830a432 --- /dev/null +++ b/default-configs/config.cfg @@ -0,0 +1 @@ +secret = entersecretstringhere \ No newline at end of file diff --git a/default-configs/style.cfg b/default-configs/style.cfg new file mode 100644 index 0000000..f1ff54e --- /dev/null +++ b/default-configs/style.cfg @@ -0,0 +1,72 @@ +windowWidth = 1000 +windowHeight = 600 +windowWidthResizable = 0 +windowHeightResizable = 0 +windowMainBG = #21242D +mainIcon = assets/icon.ico +mainMenuBG = #21242D +mainMenuPosition = wn +tabIconsSize = 30 +generateTabIcon = assets/tab-icons/generate.png +tabFramesBorderWidth = 0 +unselectedTabBG = #21242D +menuTabsBorderWidth = 0 +menuTabsPadding = 10 +selectedTabBG = #333842 +disabledTabBG = #333842 +headerFont = Segoe UI;15 +headerBG = #333842 +headerTextColor = #C0C0C0 +headerPadding = 10 +headerWidth = 84 +tabFrameBG = #21242D +formatTabIcon = assets/tab-icons/format.png +settingsTabIcon = assets/tab-icons/settings.png +aboutTabIcon = assets/tab-icons/about.png +tabFramePadding = 10 +label1BG = #21242D +label1TextColor = #C0C0C0 +headerTextAnchor = center +combobox1ArrowColor = #C0C0C0 +combobox1ButtonColor = #333842 +combobox1BorderColor = #21242D +combobox1FieldBackground = #333842 +combobox1TextColor = #C0C0C0 +combobox1Relief = flat +combobox1BorderWidth = 0 +combobox1Padding = 3 +combobox1ListBoxBackground = #333842 +combobox1ListBoxForeground = #C0C0C0 +combobox1ListBoxSelectBackground = #737373 +combobox1ListBoxSelectForeground = #FFFFFF +button1TextAnchor = center +button1Background = #333842 +button1Foreground = #C0C0C0 +button1Padding = 1 +editingPresetSaveButtonWidth = 25 +editingPresetCancelButtonWidth = 25 +loadingButtonWidth = 15 +loadingListWidth = 85 +label2Width = 15 +label2Anchor = center +spinbox1ArrowColor = #C0C0C0 +spinbox1FieldBackground = #333842 +spinbox1Relief = flat +spinbox1BorderWidth = 0 +spinbox1TextColor = #C0C0C0 +spinbox1ButtonColor = #333842 +radiobutton1Background = #21242D +radiobutton1TextColor = #C0C0C0 +entry1FieldBackground = #333842 +entry1Relief = flat +entry1BorderWidth = 0 +entry1Padding = 3 +text1Background = #333842 +text1TextColor = #C0C0C0 +text1Relief = flat +entry1TextColor = #C0C0C0 +label2BG = #21242D +label2TextColor = #C0C0C0 +label3BG = #21242D +label3TextColor = #C0C0C0 +label3Anchor = w \ No newline at end of file diff --git a/format_readme.txt b/format_readme.txt deleted file mode 100644 index e69de29..0000000 diff --git a/generator.py b/generator.py deleted file mode 100644 index 3cc2356..0000000 --- a/generator.py +++ /dev/null @@ -1,442 +0,0 @@ -""" -# Generator CSV -# 4.0 Experimental -# by Mateusz Skoczek -# styczeń 2019 - luty 2020 -# dla ZSP Sobolew - -# -# Główny plik programu -# -""" - - - - - -# -------------------- # Import bibliotek zewnętrznych # -------------------- # - -# Biblioteki główne -import os as OS -import sys as SS -import time as TM - - - -# Framework i inne biblioteki interfejsu graficznego -import tkinter as TK -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") - - - - - # 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) - - # 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) - - # Dołączanie 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) - - # Łą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) - - # 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) - - # Format danych - formatTab = TK.Frame(mainMenu) - formatTab.config(background = SCvar_gui.color.mainBG) - formatTabImg = PLimg.open(SCvar_gui.image.formatTab) - formatTabImg = formatTabImg.resize((SCvar_gui.dimension.iconTab, SCvar_gui.dimension.iconTab), PLimg.ANTIALIAS) - formatTabImg = PLitk.PhotoImage(formatTabImg) - mainMenu.add(formatTab, image = formatTabImg) - - # 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) - - - - - # SETTINGSTAB - settingsTabLabel = TK.Label(settingsTab) - settingsTabLabel.config(text = 'USTAWIENIA') - settingsTabLabel.config(font = (SCvar_gui.fonts.tabHeader[0], SCvar_gui.fonts.tabHeader[1])) - settingsTabLabel.config(bg = SCvar_gui.color.headerBG) - settingsTabLabel.config(fg = SCvar_gui.color.headerText) - settingsTabLabel.config(bd = SCvar_gui.dimension.tabHeaderHeight) - settingsTabLabel.config(width = SCvar_gui.dimension.tabHeaderWidth) - settingsTabLabel.grid(row = 0) - - - - - # FORMATTAB - formatTabLabel = TK.Label(formatTab) - formatTabLabel.config(text = 'FORMAT DANYCH') - formatTabLabel.config(font = (SCvar_gui.fonts.tabHeader[0], SCvar_gui.fonts.tabHeader[1])) - formatTabLabel.config(bg = SCvar_gui.color.headerBG) - formatTabLabel.config(fg = SCvar_gui.color.headerText) - formatTabLabel.config(bd = SCvar_gui.dimension.tabHeaderHeight) - formatTabLabel.config(width = SCvar_gui.dimension.tabHeaderWidth) - formatTabLabel.grid(row = 0) - - - # Labelframe - Pliki wejściowe - inFilesLabelFrame = TK.LabelFrame(formatTab) - inFilesLabelFrame.config(text = ' Pliki wejściowe ') - inFilesLabelFrame.config(bg = SCvar_gui.color.mainBG) - inFilesLabelFrame.config(fg = SCvar_gui.color.lfText) - inFilesLabelFrame.config(bd = SCvar_gui.dimension.lfBorderwidth) - inFilesLabelFrame.grid(row = 1, pady = SCvar_gui.dimension.framePadY) - - # UczniowieLABEL - inStudentsLABEL = TK.Label(inFilesLabelFrame) - inStudentsLABEL.config(text = 'Uczniowie') - inStudentsLABEL.config(bg = SCvar_gui.color.mainBG) - inStudentsLABEL.config(fg = SCvar_gui.color.label1) - inStudentsLABEL.grid(row = 0, column = 0) - - # Uczniowie inFormatInput - inStudentsFormatInput = TK.Text(inFilesLabelFrame) - inStudentsFormatInput.config(bg = SCvar_gui.color.textboxBG) - inStudentsFormatInput.config(fg = SCvar_gui.color.textboxText) - inStudentsFormatInput.config(bd = SCvar_gui.dimension.tbBorderwidth) - inStudentsFormatInput.config(width = SCvar_gui.dimension.tbWidth) - inStudentsFormatInput.config(height = SCvar_gui.dimension.tbHeight) - inStudentsFormatInput.grid(row = 1, column = 0, padx = SCvar_gui.dimension.tbPad, pady = SCvar_gui.dimension.tbPad) - - # NauczycieleLABEL - inTeachersLABEL = TK.Label(inFilesLabelFrame) - inTeachersLABEL.config(text = 'Nauczyciele') - inTeachersLABEL.config(bg = SCvar_gui.color.mainBG) - inTeachersLABEL.config(fg = SCvar_gui.color.label1) - inTeachersLABEL.grid(row = 0, column = 1) - - # Nauczyciele inFormatInput - inTeachersFormatInput = TK.Text(inFilesLabelFrame) - inTeachersFormatInput.config(bg = SCvar_gui.color.textboxBG) - inTeachersFormatInput.config(fg = SCvar_gui.color.textboxText) - inTeachersFormatInput.config(bd = SCvar_gui.dimension.tbBorderwidth) - inTeachersFormatInput.config(width = SCvar_gui.dimension.tbWidth) - inTeachersFormatInput.config(height = SCvar_gui.dimension.tbHeight) - inTeachersFormatInput.grid(row = 1, column = 1, padx = SCvar_gui.dimension.tbPad, pady = SCvar_gui.dimension.tbPad) - - - # Labelframe - Pliki wejściowe - outFilesLabelFrame = TK.LabelFrame(formatTab) - outFilesLabelFrame.config(text = ' Pliki wyjściowe ') - outFilesLabelFrame.config(bg = SCvar_gui.color.mainBG) - outFilesLabelFrame.config(fg = SCvar_gui.color.lfText) - outFilesLabelFrame.config(bd = SCvar_gui.dimension.lfBorderwidth) - outFilesLabelFrame.grid(row = 2, pady = SCvar_gui.dimension.framePadY) - - # UczniowieLABEL - outStudentsLABEL = TK.Label(outFilesLabelFrame) - outStudentsLABEL.config(text = 'Uczniowie') - outStudentsLABEL.config(bg = SCvar_gui.color.mainBG) - outStudentsLABEL.config(fg = SCvar_gui.color.label1) - outStudentsLABEL.grid(row = 0, column = 0) - - # Uczniowie outFormatInput - outStudentsFormatInput = TK.Entry(outFilesLabelFrame) - outStudentsFormatInput.config(bg = SCvar_gui.color.textboxBG) - outStudentsFormatInput.config(fg = SCvar_gui.color.textboxText) - outStudentsFormatInput.config(bd = SCvar_gui.dimension.tbBorderwidth) - outStudentsFormatInput.config(width = SCvar_gui.dimension.tbWidth2) - outStudentsFormatInput.grid(row = 1, column = 0, padx = SCvar_gui.dimension.tbPad, pady = SCvar_gui.dimension.tbPad) - - # NauczycieleLABEL - outTeachersLABEL = TK.Label(outFilesLabelFrame) - outTeachersLABEL.config(text = 'Nauczyciele') - outTeachersLABEL.config(bg = SCvar_gui.color.mainBG) - outTeachersLABEL.config(fg = SCvar_gui.color.label1) - outTeachersLABEL.grid(row = 0, column = 1) - - # Nauczyciele outFormatInput - outTeachersFormatInput = TK.Entry(outFilesLabelFrame) - outTeachersFormatInput.config(bg = SCvar_gui.color.textboxBG) - outTeachersFormatInput.config(fg = SCvar_gui.color.textboxText) - outTeachersFormatInput.config(bd = SCvar_gui.dimension.tbBorderwidth) - outTeachersFormatInput.config(width = SCvar_gui.dimension.tbWidth2) - outTeachersFormatInput.grid(row = 1, column = 1, padx = SCvar_gui.dimension.tbPad, pady = SCvar_gui.dimension.tbPad) - - - # Frame - Przyciski - formatButtonsFrame = TK.Frame(formatTab) - formatButtonsFrame.config(bg = SCvar_gui.color.mainBG) - formatButtonsFrame.grid(row = 3, pady = SCvar_gui.dimension.framePadY) - - # Zapisz - saveFormatButton = TK.Button(formatButtonsFrame) - saveFormatButton.config(text = 'ZAPISZ') - saveFormatButton.config(bg = SCvar_gui.color.buttonBG) - saveFormatButton.config(fg = SCvar_gui.color.buttonText) - saveFormatButton.config(relief = TK.FLAT) - saveFormatButton.config(activebackground = SCvar_gui.color.buttonBG) - saveFormatButton.config(activeforeground = SCvar_gui.color.buttonText) - saveFormatButton.config(height = SCvar_gui.dimension.bnHeight) - saveFormatButton.config(width = SCvar_gui.dimension.bnWidth) - saveFormatButton.grid(row = 0, column = 0, padx = 5) - - # Pomoc - def saveFormatButtonCommand(): - try: - x = open('format_readme.txt') - except FileNotFoundError: - print('x') - except: - print('x') - else: - OS.system("notepad format_readme.txt") - instructionFormatButton = TK.Button(formatButtonsFrame) - instructionFormatButton.config(text = 'POMOC') - instructionFormatButton.config(bg = SCvar_gui.color.buttonBG) - instructionFormatButton.config(fg = SCvar_gui.color.buttonText) - instructionFormatButton.config(relief = TK.FLAT) - instructionFormatButton.config(activebackground = SCvar_gui.color.buttonBG) - instructionFormatButton.config(activeforeground = SCvar_gui.color.buttonText) - instructionFormatButton.config(height = SCvar_gui.dimension.bnHeight) - instructionFormatButton.config(width = SCvar_gui.dimension.bnWidth2) - instructionFormatButton.config(command = saveFormatButtonCommand) - instructionFormatButton.grid(row = 0, column = 1, padx = 5) - - - - - # INFOTAB - infoTabLabel = TK.Label(infoTab) - infoTabLabel.config(text = 'INFORMACJE') - infoTabLabel.config(font = (SCvar_gui.fonts.tabHeader[0], SCvar_gui.fonts.tabHeader[1])) - infoTabLabel.config(bg = SCvar_gui.color.headerBG) - infoTabLabel.config(fg = SCvar_gui.color.headerText) - infoTabLabel.config(bd = SCvar_gui.dimension.tabHeaderHeight) - infoTabLabel.config(width = SCvar_gui.dimension.tabHeaderWidth) - infoTabLabel.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 - authorsInfo = TK.Label(infoTab) - authorsInfo.config(text = SCvar_inf.authors + '\ndla ' + SCvar_inf.school) - 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/generator.pyw b/generator.pyw new file mode 100644 index 0000000..37f2a77 --- /dev/null +++ b/generator.pyw @@ -0,0 +1,1572 @@ +""" +# Generator CSV +# Wersja 4.0 +# Autorzy: Mateusz Skoczek +# Styczeń 2019 - Czerwiec 2020 +# dla ZSP Sobolew +""" + + + + + +# ----------------------------------------- # Zmienne # ----------------------------------------- # + +class VARS: + programName = 'Generator CSV' + programVersion = '4.0' + programCustomer = 'ZSP Sobolew' + programAuthors = ['Mateusz Skoczek'] + programToW = ['styczeń', 2019, 'wrzesień', 2020] + + + + + +# --------------------------- # Import wbudowanych bibliotek Pythona # -------------------------- # + + +# 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 + + +# GUI +import tkinter as TK +from tkinter import ttk as TKttk +from tkinter import messagebox as TKmsb + +from PIL import ImageTk as PLitk +from PIL import Image as PLimg + + + + + +# ---------------------------------------- # Komunikaty # --------------------------------------- # + + +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', + 'A0001' : 'Czy chcesz zapisać? Zostanie utworzony nowy plik', + 'A0002' : 'Czy chcesz zapisać? Plik zostanie nadpisany', +} + +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.showerror('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 # ------------------------- # + +appdata = PT.Path.home() / 'Appdata/Roaming' +""" +#TODO +SU.rmtree(str(appdata) + '/Generator CSV') +#TODO +""" +if 'Generator CSV' not in [x for x in OS.listdir(appdata)]: + try: + OS.mkdir(str(appdata) + '/Generator CSV') + SU.copy('default-configs/config.cfg', str(appdata) + '\Generator CSV\config.cfg') + SU.copy('default-configs/style.cfg', str(appdata) + '\Generator CSV\style.cfg') + OS.mkdir(str(appdata) + '/Generator CSV/format-presets') + except Exception as exceptInfo: + MSG('E0001', True, exceptInfo) + + + + + +# ----------------------------- # Ładowanie pliku konfiguracyjnego # ---------------------------- # + +class CFG: + def __checkInstance(self, write): + if write: + try: + file = open((str(appdata) + '\Generator CSV\config.cfg'), 'a') + except Exception as exceptInfo: + MSG('E0002', False, exceptInfo) + return False + else: + if not file.writable(): + MSG('E0002', False, 'Plik tylko do odczytu') + return False + else: + return True + else: + try: + open(str(appdata) + '\Generator CSV\config.cfg') + except Exception as exceptInfo: + MSG('E0002', True, exceptInfo) + + def __checkContent(self, write, content): + if write: + return [True, content] + else: + class functions: + pass + return [True, content] + + def R(self): + self.__checkInstance(False) + content = {} + for x in CD.open((str(appdata) + '\Generator CSV\config.cfg'), 'r', 'utf-8').read().split('\n'): + x = x.split(' = ') + try: + content[x[0]] = (x[1]).strip('\r') + except: + continue + contentCheckingOutput = self.__checkContent(False, content) + if contentCheckingOutput[0]: + return contentCheckingOutput[1] + else: + MSG('E0003', True, contentCheckingOutput[1]) + + def W(self, changes): + content = self.R() + for x in changes: + content[x] = changes[x] + contentCheckingOutput = self.__checkContent(True, content) + if contentCheckingOutput[0]: + if self.__checkInstance(True): + with CD.open((str(appdata) + '\Generator CSV\config.cfg'), 'w', 'utf-8') as file: + contentToSave = contentCheckingOutput[1] + for x in contentToSave: + file.write('%s = %s\n' % (x, str(contentToSave[x]))) + else: + return False + else: + MSG('E0004', False, contentCheckingOutput[1]) +CFG = CFG() +checkInstance = CFG.R() + + + + + +# ---------------------------------- # Ładowanie pliku stylu # ---------------------------------- # + +class GUI: + def __checkInstance(self): + try: + open(str(appdata) + '\Generator CSV\style.cfg') + except Exception as exceptInfo: + MSG('E0004', True, exceptInfo) + + def __checkContent(self, content): + class functions: + def integer(self, var): + if var in list(content.keys()): + try: + check = int(content[var]) + except: + return [False, 'Niepoprawne dane - klucz: %s' % var] + else: + content[var] = int(content[var]) + return [True] + else: + return [False, 'Brak danych - klucz: %s' % var] + def bool(self, var): + if var in list(content.keys()): + if content[var] != '0' and content[var] != '1': + return [False, 'Niepoprawne dane - klucz: %s' % var] + else: + if content[var] == '0': + content[var] = False + return [True] + else: + content[var] = True + return [True] + else: + return [False, 'Brak danych - klucz: %s' % var] + def color(self, var): + if var in list(content.keys()): + if len(content[var]) != 7: + return [False, 'Niepoprawne dane - klucz: %s' % var] + else: + if content[var][0] != '#': + return [False, 'Niepoprawne dane - klucz: %s' % var] + else: + return [True] + else: + return [False, 'Brak danych - klucz: %s' % var] + def file(self, var): + if var in list(content.keys()): + try: + check = open(content[var]) + except: + return [False, 'Niepoprawne dane - klucz: %s' % var] + else: + return [True] + else: + return [False, 'Brak danych - klucz: %s' % var] + def fromArray(self, var, array): + if var in list(content.keys()): + if content[var] not in array: + return [False, 'Niepoprawne dane - klucz: %s' % var] + else: + return [True] + else: + return [False, 'Brak danych - klucz: %s' % var] + def font(self, var): + if var in list(content.keys()): + try: + check = int(content[var].split(';')[1]) + except: + return [False, 'Niepoprawne dane - klucz: %s' % var] + else: + content[var] = (content[var].split(';')[0], int(content[var].split(';')[1])) + return [True] + else: + return [False, 'Brak danych - klucz: %s' % var] + functions = functions() + check = functions.integer('windowWidth') + if not check[0]: + return check + check = functions.integer('windowHeight') + if not check[0]: + return check + check = functions.bool('windowWidthResizable') + if not check[0]: + return check + check = functions.bool('windowHeightResizable') + if not check[0]: + return check + check = functions.color('windowMainBG') + if not check[0]: + return check + check = functions.file('mainIcon') + if not check[0]: + return check + check = functions.color('mainMenuBG') + if not check[0]: + return check + check = functions.fromArray('mainMenuPosition', ['nw', 'ne', 'en', 'es', 'se', 'sw', 'ws', 'wn']) + if not check[0]: + return check + check = functions.integer('tabIconsSize') + if not check[0]: + return check + check = functions.file('generateTabIcon') + if not check[0]: + return check + check = functions.integer('tabFramesBorderWidth') + if not check[0]: + return check + check = functions.color('unselectedTabBG') + if not check[0]: + return check + check = functions.integer('menuTabsBorderWidth') + if not check[0]: + return check + check = functions.integer('menuTabsPadding') + if not check[0]: + return check + check = functions.color('selectedTabBG') + if not check[0]: + return check + check = functions.color('disabledTabBG') + if not check[0]: + return check + check = functions.font('headerFont') + if not check[0]: + return check + check = functions.color('headerBG') + if not check[0]: + return check + check = functions.color('headerTextColor') + if not check[0]: + return check + check = functions.integer('headerPadding') + if not check[0]: + return check + check = functions.integer('headerWidth') + if not check[0]: + return check + check = functions.color('tabFrameBG') + if not check[0]: + return check + check = functions.file('formatTabIcon') + if not check[0]: + return check + check = functions.integer('tabFramePadding') + if not check[0]: + return check + check = functions.color('label1BG') + if not check[0]: + return check + check = functions.color('label1TextColor') + if not check[0]: + return check + check = functions.fromArray('headerTextAnchor', ['center', 'nw', 'n', 'ne', 'w', 'e', 'sw', 's', 'se']) + if not check[0]: + return check + check = functions.color('combobox1ArrowColor') + if not check[0]: + return check + check = functions.color('combobox1ButtonColor') + if not check[0]: + return check + check = functions.color('combobox1BorderColor') + if not check[0]: + return check + check = functions.color('combobox1FieldBackground') + if not check[0]: + return check + check = functions.color('combobox1TextColor') + if not check[0]: + return check + check = functions.fromArray('combobox1Relief', ['flat', 'raised', 'sunken', 'groove', 'ridge']) + if not check[0]: + return check + check = functions.integer('combobox1BorderWidth') + if not check[0]: + return check + check = functions.integer('combobox1Padding') + if not check[0]: + return check + check = functions.color('combobox1ListBoxBackground') + if not check[0]: + return check + check = functions.color('combobox1ListBoxForeground') + if not check[0]: + return check + check = functions.color('combobox1ListBoxSelectBackground') + if not check[0]: + return check + check = functions.color('combobox1ListBoxSelectForeground') + if not check[0]: + return check + check = functions.fromArray('button1TextAnchor', ['center', 'nw', 'n', 'ne', 'w', 'e', 'sw', 's', 'se']) + if not check[0]: + return check + check = functions.color('button1Background') + if not check[0]: + return check + check = functions.color('button1Foreground') + if not check[0]: + return check + check = functions.integer('button1Padding') + if not check[0]: + return check + check = functions.integer('editingPresetSaveButtonWidth') + if not check[0]: + return check + check = functions.integer('editingPresetCancelButtonWidth') + if not check[0]: + return check + check = functions.integer('loadingButtonWidth') + if not check[0]: + return check + check = functions.integer('loadingListWidth') + if not check[0]: + return check + check = functions.integer('label2Width') + if not check[0]: + return check + check = functions.fromArray('label2Anchor', ['center', 'nw', 'n', 'ne', 'w', 'e', 'sw', 's', 'se']) + if not check[0]: + return check + check = functions.color('spinbox1ArrowColor') + if not check[0]: + return check + check = functions.color('spinbox1FieldBackground') + if not check[0]: + return check + check = functions.fromArray('spinbox1Relief', ['flat', 'raised', 'sunken', 'groove', 'ridge']) + if not check[0]: + return check + check = functions.integer('spinbox1BorderWidth') + if not check[0]: + return check + check = functions.color('spinbox1TextColor') + if not check[0]: + return check + check = functions.color('spinbox1ButtonColor') + if not check[0]: + return check + check = functions.color('radiobutton1Background') + if not check[0]: + return check + check = functions.color('radiobutton1TextColor') + if not check[0]: + return check + check = functions.color('entry1FieldBackground') + if not check[0]: + return check + check = functions.fromArray('entry1Relief', ['flat', 'raised', 'sunken', 'groove', 'ridge']) + if not check[0]: + return check + check = functions.integer('entry1BorderWidth') + if not check[0]: + return check + check = functions.integer('entry1Padding') + if not check[0]: + return check + check = functions.color('text1Background') + if not check[0]: + return check + check = functions.color('text1TextColor') + if not check[0]: + return check + check = functions.fromArray('text1Relief', ['flat', 'raised', 'sunken', 'groove', 'ridge']) + if not check[0]: + return check + check = functions.color('entry1TextColor') + if not check[0]: + return check + check = functions.color('label2BG') + if not check[0]: + return check + check = functions.color('label2TextColor') + if not check[0]: + return check + check = functions.color('label3BG') + if not check[0]: + return check + check = functions.color('label3TextColor') + if not check[0]: + return check + check = functions.fromArray('label3Anchor', ['center', 'nw', 'n', 'ne', 'w', 'e', 'sw', 's', 'se']) + if not check[0]: + return check + return [True, content] + + def R(self): + self.__checkInstance() + content = {} + for x in CD.open((str(appdata) + '\Generator CSV\style.cfg'), 'r', 'utf-8').read().split('\n'): + x = x.split(' = ') + try: + content[x[0]] = (x[1]).strip('\r') + except: + continue + contentCheckingOutput = self.__checkContent(content) + if contentCheckingOutput[0]: + return contentCheckingOutput[1] + else: + MSG('E0005', True, contentCheckingOutput[1]) +GUI = GUI() +checkInstance = GUI.R() + + + + + +# ------------------------------- # Zarządzanie plikami formatu # ------------------------------- # + +class FMT: + def __checkFolderInstance(self): + if 'Generator CSV' not in [x for x in OS.listdir(appdata)]: + OS.mkdir(str(appdata) + '/Generator CSV') + else: + if 'format-presets' not in [x for x in OS.listdir(str(appdata) + '\Generator CSV')]: + OS.mkdir(str(appdata) + '/Generator CSV/format-presets') + + def __checkContent(self, write, content): + if write: + class functions: + def bool(self, var): + if var in list(content.keys()): + if content[var] != True and content[var] != False: + return [False, 'Niepoprawne dane - klucz: %s' % var] + else: + if content[var] == False: + content[var] = '0' + return [True] + else: + content[var] = '1' + return [True] + else: + return [False, 'Brak danych - klucz: %s' % var] + def string(self, var): + if var in list(content.keys()): + return [True] + else: + return [False, 'Brak danych - klucz: %s' % var] + def array(self, var): + if var in list(content.keys()): + content[var] = 'I'.join(content[var]) + return [True] + else: + return [False, 'Brak danych - klucz: %s' % var] + def integer(self, var): + if var in list(content.keys()): + content[var] = str(content[var]) + return [True] + else: + return [False, 'Brak danych - klucz: %s' % var] + functions = functions() + check = functions.bool('student') + if not check[0]: + return check + check = functions.string('personSeparator') + if not check[0]: + return check + check = functions.string('rowSeparator') + if not check[0]: + return check + check = functions.array('dataSeparators') + if not check[0]: + return check + check = functions.integer('loginRow') + if not check[0]: + return check + check = functions.integer('loginPositionInRow') + if not check[0]: + return check + check = functions.integer('fnameRow') + if not check[0]: + return check + check = functions.integer('fnamePositionInRow') + if not check[0]: + return check + check = functions.integer('lnameRow') + if not check[0]: + return check + check = functions.integer('lnamePositionInRow') + if not check[0]: + return check + check = functions.integer('schoolRow') + if not check[0]: + return check + check = functions.integer('schoolPositionInRow') + if not check[0]: + return check + check = functions.integer('classRow') + if not check[0]: + return check + check = functions.integer('classPositionInRow') + if not check[0]: + return check + return [True, content] + else: + class functions: + def bool(self, var): + if var in list(content.keys()): + if content[var] != '0' and content[var] != '1': + return [False, 'Niepoprawne dane - klucz: %s' % var] + else: + if content[var] == '0': + content[var] = False + return [True] + else: + content[var] = True + return [True] + else: + return [False, 'Brak danych - klucz: %s' % var] + def string(self, var): + if var in list(content.keys()): + return [True] + else: + return [False, 'Brak danych - klucz: %s' % var] + def array(self, var): + if var in list(content.keys()): + content[var] = content[var].split('I') + return [True] + else: + return [False, 'Brak danych - klucz: %s' % var] + def integer(self, var): + if var in list(content.keys()): + try: + check = int(content[var]) + except: + return [False, 'Niepoprawne dane - klucz: %s' % var] + else: + content[var] = int(content[var]) + return [True] + else: + return [False, 'Brak danych - klucz: %s' % var] + functions = functions() + check = functions.bool('student') + if not check[0]: + return check + check = functions.string('personSeparator') + if not check[0]: + return check + check = functions.string('rowSeparator') + if not check[0]: + return check + check = functions.array('dataSeparators') + if not check[0]: + return check + check = functions.integer('loginRow') + if not check[0]: + return check + check = functions.integer('loginPositionInRow') + if not check[0]: + return check + check = functions.integer('fnameRow') + if not check[0]: + return check + check = functions.integer('fnamePositionInRow') + if not check[0]: + return check + check = functions.integer('lnameRow') + if not check[0]: + return check + check = functions.integer('lnamePositionInRow') + if not check[0]: + return check + check = functions.integer('schoolRow') + if not check[0]: + return check + check = functions.integer('schoolPositionInRow') + if not check[0]: + return check + check = functions.integer('classRow') + if not check[0]: + return check + check = functions.integer('classPositionInRow') + if not check[0]: + return check + return [True, content] + + def getList(self): + self.__checkFolderInstance() + filesList = OS.listdir(str(appdata) + '/Generator CSV/format-presets') + formatPresetsList = [] + for x in filesList: + if x[-4:] == '.fmt': + formatPresetsList.append(x[:-4]) + else: + continue + return formatPresetsList + + def R(self, preset): + if preset in self.getList(): + path = str(appdata) + '/Generator CSV/format-presets/%s.fmt' % preset + file = CD.open(path, 'r', 'utf-8').read().split('\n') + content = {} + for x in file: + x = x.split(' = ') + try: + content[x[0]] = (x[1]).strip('\r') + except: + continue + contentCheckingOutput = self.__checkContent(False, content) + if contentCheckingOutput[0]: + content = contentCheckingOutput[1] + else: + MSG('E0006', False, contentCheckingOutput[1]) + 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, + } + return content + + def W(self, preset, content): + contentCheckingOutput = self.__checkContent(True, content) + if contentCheckingOutput[0]: + contentToSave = contentCheckingOutput[1] + with CD.open(str(appdata) + '/Generator CSV/format-presets/%s.fmt' % preset, 'w', 'utf-8') as file: + for x in contentToSave: + file.write(x + ' = ' + content[x] + '\n') + else: + MSG('E0006', False, contentCheckingOutput[1]) +FMT = FMT() + + + + + +# ------------------------------------------- # GUI # ------------------------------------------- # + +def window(): + # Ustawienia okna + window = TK.Tk() + window.title('%s %s' % (VARS.programName, VARS.programVersion)) + window.geometry('%sx%s' % (str(GUI.R()['windowWidth']), str(GUI.R()['windowHeight']))) + window.resizable(width = GUI.R()['windowWidthResizable'], height = GUI.R()['windowHeightResizable']) + window.configure(bg = GUI.R()['windowMainBG']) + window.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'], + }, + }, + "tabFrame.TFrame": { + "configure": { + "background": GUI.R()['tabFrameBG'], + }, + }, + "layoutFrame.TFrame": { + "configure": { + "background": GUI.R()['tabFrameBG'], + }, + }, + "label1.TLabel": { + "configure": { + "background": GUI.R()['label1BG'], + "foreground": GUI.R()['label1TextColor'] + }, + }, + "label2.TLabel": { + "configure": { + "background": GUI.R()['label2BG'], + "foreground": GUI.R()['label2TextColor'], + "anchor": GUI.R()['label2Anchor'], + "width": GUI.R()['label2Width'], + }, + }, + "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'], + }, + }, + "button1.TButton": { + "configure": { + "anchor": GUI.R()['button1TextAnchor'], + "background": GUI.R()['button1Background'], + "foreground": GUI.R()['button1Foreground'], + "padding": GUI.R()['button1Padding'], + }, + }, + "separator1.TSeparator": { + "configure": { + "background": GUI.R()['tabFrameBG'], + }, + }, + "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'] + }, + }, + 'radiobutton1.TRadiobutton': { + "configure": { + "background": GUI.R()['radiobutton1Background'], + "foreground": GUI.R()['radiobutton1TextColor'], + }, + }, + "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 + mainMenu = TKttk.Notebook(window, width = window.winfo_width() - (2 * GUI.R()['menuTabsPadding'] + GUI.R()['tabIconsSize']), height = window.winfo_height()) + mainMenu.config(style = "mainMenu.TNotebook") + mainMenu.grid(row = 0) + + # Ikona + iconTab = TKttk.Frame(mainMenu) + iconTabImg = PLimg.open(GUI.R()['mainIcon']) + iconTabImg = iconTabImg.resize((GUI.R()['tabIconsSize'], GUI.R()['tabIconsSize']), PLimg.ANTIALIAS) + iconTabImg = PLitk.PhotoImage(iconTabImg) + mainMenu.add(iconTab, image = iconTabImg, state = TK.DISABLED) + + + + # TAB2 - Generator ################################################### + + generateTab = TKttk.Frame(mainMenu) + generateTab.config(style = "mainMenuTabFrame.TFrame") + generateTabImg = PLimg.open(GUI.R()['generateTabIcon']) + generateTabImg = generateTabImg.resize((GUI.R()['tabIconsSize'], GUI.R()['tabIconsSize']), PLimg.ANTIALIAS) + generateTabImg = PLitk.PhotoImage(generateTabImg) + mainMenu.add(generateTab, image = generateTabImg, state = TK.NORMAL) + + + # Nagłówek + generateHeader = TKttk.Label(generateTab) + generateHeader.config(style = 'tabHeader.TLabel') + generateHeader.config(text = 'GENERATOR CSV') + generateHeader.pack(fill = TK.X) + + + # Zawartość + generateFrame = TKttk.Frame(generateTab) + generateFrame.config(style = 'tabFrame.TFrame') + generateFrame.pack(fill = TK.BOTH, expand = 1, padx = GUI.R()['tabFramePadding'], pady = GUI.R()['tabFramePadding']) + + ###################################################################### + + + + # TAB3 - Format ###################################################### + + formatTab = TKttk.Frame(mainMenu) + formatTab.config(style = "mainMenuTabFrame.TFrame") + formatTabImg = PLimg.open(GUI.R()['formatTabIcon']) + formatTabImg = formatTabImg.resize((GUI.R()['tabIconsSize'], GUI.R()['tabIconsSize']), PLimg.ANTIALIAS) + formatTabImg = PLitk.PhotoImage(formatTabImg) + mainMenu.add(formatTab, image = formatTabImg, state = TK.NORMAL) + + + # Nagłówek + formatHeader = TKttk.Label(formatTab) + formatHeader.config(style = 'tabHeader.TLabel') + formatHeader.config(text = 'FORMAT DANYCH') + formatHeader.pack(fill = TK.X) + + + # Zawartość + formatFrame = TKttk.Frame(formatTab) + formatFrame.config(style = 'tabFrame.TFrame') + formatFrame.pack(fill = TK.BOTH, expand = 1, padx = GUI.R()['tabFramePadding'], pady = GUI.R()['tabFramePadding']) + + + # (1) Ładowanie presetu ##################### + + loadingPresetFrame = TKttk.Frame(formatFrame) + loadingPresetFrame.config(style = 'layoutFrame.TFrame') + loadingPresetFrame.pack(fill = TK.X) + + # "Wybierz preset do edycji lub wpisz nazwę nowego" + loadingListLabel = TKttk.Label(loadingPresetFrame) + loadingListLabel.config(style = 'label1.TLabel') + loadingListLabel.config(text = 'Wybierz preset do edycji lub wpisz nazwę nowego') + loadingListLabel.pack(side = 'left') + + # Rozwijana lista presetów + loadingListVar = TK.StringVar() + loadingList = TKttk.Combobox(loadingPresetFrame) + loadingList.config(textvariable = loadingListVar) + loadingList.config(style = 'combobox1.TCombobox') + loadingList.config(width = GUI.R()['loadingListWidth']) + loadingList.option_add("*TCombobox*Listbox.background", GUI.R()['combobox1ListBoxBackground']) + loadingList.option_add("*TCombobox*Listbox.foreground", GUI.R()['combobox1ListBoxForeground']) + loadingList.option_add("*TCombobox*Listbox.selectBackground", GUI.R()['combobox1ListBoxSelectBackground']) + loadingList.option_add("*TCombobox*Listbox.selectForeground", GUI.R()['combobox1ListBoxSelectForeground']) + loadingList.pack(side = 'left', padx = 5) + loadingList['values'] = tuple(FMT.getList()) + + # Przycisk "WCZYTAJ" + 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, + } + def loadingButtonAction(): + formatFileContent = FMT.R(loadingList.get()) + loadingList['state'] = TK.DISABLED + loadingButton['state'] = TK.DISABLED + EPOSTypeStudentRadiobutton['state'] = TK.NORMAL + EPOSTypeTeacherRadiobutton['state'] = TK.NORMAL + if formatFileContent['student']: + EPOSTypeVar.set('s') + else: + EPOSTypeVar.set('t') + EPOSPersonSeparatorEntry['state'] = TK.NORMAL + EPOSPersonSeparatorVar.set(formatFileContent['personSeparator']) + EPOSRowSeparatorEntry['state'] = TK.NORMAL + EPOSRowSeparatorVar.set(formatFileContent['rowSeparator']) + EPOSDataSeparatorText['state'] = TK.NORMAL + EPOSDataSeparatorText.insert(TK.END, '\n'.join(formatFileContent['dataSeparators'])) + EPDataLocalizationLoginRowSpinbox['state'] = TK.NORMAL + EPDataLocalizationLoginRowVar.set(formatFileContent['loginRow']) + EPDataLocalizationLoginPosInRowSpinbox['state'] = TK.NORMAL + EPDataLocalizationLoginPosInRowVar.set(formatFileContent['loginPositionInRow']) + EPDataLocalizationFnameRowSpinbox['state'] = TK.NORMAL + EPDataLocalizationFnameRowVar.set(formatFileContent['fnameRow']) + EPDataLocalizationFnamePosInRowSpinbox['state'] = TK.NORMAL + EPDataLocalizationFnamePosInRowVar.set(formatFileContent['fnamePositionInRow']) + EPDataLocalizationLnameRowSpinbox['state'] = TK.NORMAL + EPDataLocalizationLnameRowVar.set(formatFileContent['lnameRow']) + EPDataLocalizationLnamePosInRowSpinbox['state'] = TK.NORMAL + EPDataLocalizationLnamePosInRowVar.set(formatFileContent['lnamePositionInRow']) + EPDataLocalizationSchoolRowSpinbox['state'] = TK.NORMAL + EPDataLocalizationSchoolRowVar.set(formatFileContent['schoolRow']) + EPDataLocalizationSchoolPosInRowSpinbox['state'] = TK.NORMAL + EPDataLocalizationSchoolPosInRowVar.set(formatFileContent['schoolPositionInRow']) + EPDataLocalizationClassRowSpinbox['state'] = TK.NORMAL + EPDataLocalizationClassRowVar.set(formatFileContent['classRow']) + EPDataLocalizationClassPosInRowSpinbox['state'] = TK.NORMAL + EPDataLocalizationClassPosInRowVar.set(formatFileContent['classPositionInRow']) + editingPresetSaveButton['state'] = TK.NORMAL + editingPresetCancelButton['state'] = TK.NORMAL + loadingButton = TKttk.Button(loadingPresetFrame) + loadingButton.config(style = 'button1.TButton') + loadingButton.config(command = loadingButtonAction) + loadingButton.config(width = GUI.R()['loadingButtonWidth']) + loadingButton.config(text = 'WCZYTAJ') + loadingButton.pack(side = 'right') + + ############################################# + + # (1) Separator 1 ########################### + + formatSeparator1 = TKttk.Separator(formatFrame) + formatSeparator1.config(style = 'separator1.TSeparator') + formatSeparator1.config(orient = TK.HORIZONTAL) + formatSeparator1.pack(fill = TK.X, pady = 10) + + ############################################# + + # (1) Edycja presetu ######################## + + editingPresetFrame = TKttk.Frame(formatFrame) + editingPresetFrame.config(style = 'layoutFrame.TFrame') + editingPresetFrame.pack(fill = TK.BOTH, expand = 1) + + # (2) Ustawienia ################## + + editingPresetSettingsFrame = TKttk.Frame(editingPresetFrame) + editingPresetSettingsFrame.config(style = 'layoutFrame.TFrame') + editingPresetSettingsFrame.pack(fill = TK.BOTH, expand = 1) + + # (3) Inne ustawienia ### + + editingPresetOtherSettingsFrame = TKttk.Frame(editingPresetSettingsFrame) + editingPresetOtherSettingsFrame.config(style = 'layoutFrame.TFrame') + editingPresetOtherSettingsFrame.pack(fill = TK.BOTH, expand = 1, side = TK.LEFT) + + # (4) Typ osoby + + editingPresetOSFrame = TKttk.Frame(editingPresetOtherSettingsFrame) + editingPresetOSFrame.config(style = 'layoutFrame.TFrame') + editingPresetOSFrame.pack(fill = TK.BOTH, expand = 1, side = TK.BOTTOM, pady = 5) + + # "Typ osoby" + EPOSTypeLabel = TKttk.Label(editingPresetOSFrame) + EPOSTypeLabel.config(style = 'label1.TLabel') + EPOSTypeLabel.config(text = 'Typ osoby') + EPOSTypeLabel.grid(row = 0, column = 0, pady = 5, sticky = 'w') + + # Typ osoby - Radiobutton + EPOSTypeVar = TK.StringVar() + + EPOSTypeStudentRadiobutton = TKttk.Radiobutton(editingPresetOSFrame) + EPOSTypeStudentRadiobutton.config(style = 'radiobutton1.TRadiobutton') + EPOSTypeStudentRadiobutton.config(variable = EPOSTypeVar) + EPOSTypeStudentRadiobutton.config(value = 's') + EPOSTypeStudentRadiobutton.config(state = TK.DISABLED) + EPOSTypeStudentRadiobutton.config(width = 20) + EPOSTypeStudentRadiobutton.config(text = 'Uczniowie') + + EPOSTypeTeacherRadiobutton = TKttk.Radiobutton(editingPresetOSFrame) + EPOSTypeTeacherRadiobutton.config(style = 'radiobutton1.TRadiobutton') + EPOSTypeTeacherRadiobutton.config(variable = EPOSTypeVar) + EPOSTypeTeacherRadiobutton.config(value = 't') + EPOSTypeTeacherRadiobutton.config(state = TK.DISABLED) + EPOSTypeTeacherRadiobutton.config(width = 20) + EPOSTypeTeacherRadiobutton.config(text = 'Nauczyciele') + + EPOSTypeStudentRadiobutton.grid(row = 0, column = 1, pady = 5) + EPOSTypeTeacherRadiobutton.grid(row = 0, column = 2, pady = 5) + + # "Separator pomiędzy osobami" + EPOSPersonSeparatorLabel = TKttk.Label(editingPresetOSFrame) + EPOSPersonSeparatorLabel.config(style = 'label1.TLabel') + EPOSPersonSeparatorLabel.config(text = 'Separator pomiędzy osobami') + EPOSPersonSeparatorLabel.grid(row = 1, column = 0, pady = 5, sticky = 'w') + + # Entry - Separator pomiedzy osobami + EPOSPersonSeparatorVar = TK.StringVar() + EPOSPersonSeparatorEntry = TKttk.Entry(editingPresetOSFrame) + EPOSPersonSeparatorEntry.config(style = 'entry1.TEntry') + EPOSPersonSeparatorEntry.config(textvariable = EPOSPersonSeparatorVar) + EPOSPersonSeparatorEntry.config(state = TK.DISABLED) + EPOSPersonSeparatorEntry.config(width = 56) + EPOSPersonSeparatorEntry.grid(row = 1, column = 1, columnspan = 2, padx = 5, pady = 5) + + # "Separator pomiędzy wierszami" + EPOSRowSeparatorLabel = TKttk.Label(editingPresetOSFrame) + EPOSRowSeparatorLabel.config(style = 'label1.TLabel') + EPOSRowSeparatorLabel.config(text = 'Separator pomiędzy wierszami') + EPOSRowSeparatorLabel.grid(row = 2, column = 0, pady = 5, sticky = 'w') + + # Entry - Separator pomiedzy wierszami + EPOSRowSeparatorVar = TK.StringVar() + EPOSRowSeparatorEntry = TKttk.Entry(editingPresetOSFrame) + EPOSRowSeparatorEntry.config(style = 'entry1.TEntry') + EPOSRowSeparatorEntry.config(textvariable = EPOSRowSeparatorVar) + EPOSRowSeparatorEntry.config(state = TK.DISABLED) + EPOSRowSeparatorEntry.config(width = 56) + EPOSRowSeparatorEntry.grid(row = 2, column = 1, columnspan = 2, padx = 5, pady = 5) + + # "Separatory pomiędzy danymi" + EPOSDataSeparatorLabel = TKttk.Label(editingPresetOSFrame) + EPOSDataSeparatorLabel.config(style = 'label1.TLabel') + EPOSDataSeparatorLabel.config(text = 'Separatory pomiędzy danymi') + EPOSDataSeparatorLabel.grid(row = 3, column = 0, pady = 5, sticky = 'nw') + + # Entry - Separator pomiedzy wierszami + EPOSDataSeparatorText = TK.Text(editingPresetOSFrame) + EPOSDataSeparatorText.config(state = TK.DISABLED) + EPOSDataSeparatorText.config(width = 42) + EPOSDataSeparatorText.config(height = 19) + EPOSDataSeparatorText.config(background = GUI.R()['text1Background']) + EPOSDataSeparatorText.config(foreground = GUI.R()['text1TextColor']) + EPOSDataSeparatorText.config(relief = GUI.R()['text1Relief']) + EPOSDataSeparatorText.grid(row = 3, column = 1, columnspan = 2, padx = 5, pady = 5) + + # " - nowa linia | wciśnięcie przycisku ENTER | \n" + EPOSSeparatorEnterInfoLabel = TKttk.Label(editingPresetOSFrame) + EPOSSeparatorEnterInfoLabel.config(style = 'label1.TLabel') + EPOSSeparatorEnterInfoLabel.config(text = r' - nowa linia | wciśnięcie przycisku ENTER | \n') + EPOSSeparatorEnterInfoLabel.grid(row = 4, column = 1, columnspan = 2) + + ############### + + ######################### + + # (3) Separator 2 ####### + + formatSeparator2 = TKttk.Separator(editingPresetSettingsFrame) + formatSeparator2.config(style = 'separator1.TSeparator') + formatSeparator2.config(orient = TK.VERTICAL) + formatSeparator2.pack(fill = TK.Y, padx = 10, side = TK.LEFT) + + ######################### + + # (3) Lokalizacja danych + + editingPresetDataLocalizationSettingsFrame = TKttk.Frame(editingPresetSettingsFrame) + editingPresetDataLocalizationSettingsFrame.config(style = 'layoutFrame.TFrame') + editingPresetDataLocalizationSettingsFrame.pack(fill = TK.BOTH, side = TK.RIGHT) + + # C1 - "Wiersz" + editingPresetDataLocalizationC1Label = TKttk.Label(editingPresetDataLocalizationSettingsFrame) + editingPresetDataLocalizationC1Label.config(style = 'label1.TLabel') + editingPresetDataLocalizationC1Label.config(text = 'Wiersz') + editingPresetDataLocalizationC1Label.grid(row = 0, column = 1, padx = 5, pady = 5) + + # C2 - "Pozycja w wierszu" + editingPresetDataLocalizationC2Label = TKttk.Label(editingPresetDataLocalizationSettingsFrame) + editingPresetDataLocalizationC2Label.config(style = 'label1.TLabel') + editingPresetDataLocalizationC2Label.config(text = 'Pozycja w wierszu') + editingPresetDataLocalizationC2Label.grid(row = 0, column = 2, padx = 5, pady = 5) + + # W1 - "Login" + editingPresetDataLocalizationW1Label = TKttk.Label(editingPresetDataLocalizationSettingsFrame) + editingPresetDataLocalizationW1Label.config(style = 'label2.TLabel') + editingPresetDataLocalizationW1Label.config(text = 'Login') + editingPresetDataLocalizationW1Label.grid(row = 1, column = 0, padx = 5, pady = 5) + + # Lokalizacja loginu (wiersz) + EPDataLocalizationLoginRowVar = TK.IntVar() + EPDataLocalizationLoginRowSpinbox = TKttk.Spinbox(editingPresetDataLocalizationSettingsFrame) + EPDataLocalizationLoginRowSpinbox.config(textvariable = EPDataLocalizationLoginRowVar) + EPDataLocalizationLoginRowSpinbox.config(from_ = 0) + EPDataLocalizationLoginRowSpinbox.config(to = 1000000) + EPDataLocalizationLoginRowSpinbox.config(style = 'spinbox1.TSpinbox') + EPDataLocalizationLoginRowSpinbox.grid(row = 1, column = 1, padx = 5, pady = 5) + + # Lokalizacja loginu (pozycja w wierszu) + EPDataLocalizationLoginPosInRowVar = TK.IntVar() + EPDataLocalizationLoginPosInRowSpinbox = TKttk.Spinbox(editingPresetDataLocalizationSettingsFrame) + EPDataLocalizationLoginPosInRowSpinbox.config(textvariable = EPDataLocalizationLoginPosInRowVar) + EPDataLocalizationLoginPosInRowSpinbox.config(from_ = 0) + EPDataLocalizationLoginPosInRowSpinbox.config(to = 1000000) + EPDataLocalizationLoginPosInRowSpinbox.config(style = 'spinbox1.TSpinbox') + EPDataLocalizationLoginPosInRowSpinbox.grid(row = 1, column = 2, padx = 5, pady = 5) + + # W2 - "Imię" + editingPresetDataLocalizationW2Label = TKttk.Label(editingPresetDataLocalizationSettingsFrame) + editingPresetDataLocalizationW2Label.config(style = 'label2.TLabel') + editingPresetDataLocalizationW2Label.config(text = 'Imię') + editingPresetDataLocalizationW2Label.grid(row = 2, column = 0, padx = 5, pady = 5) + + # Lokalizacja imienia (wiersz) + EPDataLocalizationFnameRowVar = TK.IntVar() + EPDataLocalizationFnameRowSpinbox = TKttk.Spinbox(editingPresetDataLocalizationSettingsFrame) + EPDataLocalizationFnameRowSpinbox.config(textvariable = EPDataLocalizationFnameRowVar) + EPDataLocalizationFnameRowSpinbox.config(from_ = 0) + EPDataLocalizationFnameRowSpinbox.config(to = 1000000) + EPDataLocalizationFnameRowSpinbox.config(style = 'spinbox1.TSpinbox') + EPDataLocalizationFnameRowSpinbox.grid(row = 2, column = 1, padx = 5, pady = 5) + + # Lokalizacja imienia (pozycja w wierszu) + EPDataLocalizationFnamePosInRowVar = TK.IntVar() + EPDataLocalizationFnamePosInRowSpinbox = TKttk.Spinbox(editingPresetDataLocalizationSettingsFrame) + EPDataLocalizationFnamePosInRowSpinbox.config(textvariable = EPDataLocalizationFnamePosInRowVar) + EPDataLocalizationFnamePosInRowSpinbox.config(from_ = 0) + EPDataLocalizationFnamePosInRowSpinbox.config(to = 1000000) + EPDataLocalizationFnamePosInRowSpinbox.config(style = 'spinbox1.TSpinbox') + EPDataLocalizationFnamePosInRowSpinbox.grid(row = 2, column = 2, padx = 5, pady = 5) + + # W3 - "Nazwisko" + editingPresetDataLocalizationW3Label = TKttk.Label(editingPresetDataLocalizationSettingsFrame) + editingPresetDataLocalizationW3Label.config(style = 'label2.TLabel') + editingPresetDataLocalizationW3Label.config(text = 'Nazwisko') + editingPresetDataLocalizationW3Label.grid(row = 3, column = 0, padx = 5, pady = 5) + + # Lokalizacja nazwiska (wiersz) + EPDataLocalizationLnameRowVar = TK.IntVar() + EPDataLocalizationLnameRowSpinbox = TKttk.Spinbox(editingPresetDataLocalizationSettingsFrame) + EPDataLocalizationLnameRowSpinbox.config(textvariable = EPDataLocalizationLnameRowVar) + EPDataLocalizationLnameRowSpinbox.config(from_ = 0) + EPDataLocalizationLnameRowSpinbox.config(to = 1000000) + EPDataLocalizationLnameRowSpinbox.config(style = 'spinbox1.TSpinbox') + EPDataLocalizationLnameRowSpinbox.grid(row = 3, column = 1, padx = 5, pady = 5) + + # Lokalizacja nazwiska (pozycja w wierszu) + EPDataLocalizationLnamePosInRowVar = TK.IntVar() + EPDataLocalizationLnamePosInRowSpinbox = TKttk.Spinbox(editingPresetDataLocalizationSettingsFrame) + EPDataLocalizationLnamePosInRowSpinbox.config(textvariable = EPDataLocalizationLnamePosInRowVar) + EPDataLocalizationLnamePosInRowSpinbox.config(from_ = 0) + EPDataLocalizationLnamePosInRowSpinbox.config(to = 1000000) + EPDataLocalizationLnamePosInRowSpinbox.config(style = 'spinbox1.TSpinbox') + EPDataLocalizationLnamePosInRowSpinbox.grid(row = 3, column = 2, padx = 5, pady = 5) + + # W4 - "Szkoła" + editingPresetDataLocalizationW4Label = TKttk.Label(editingPresetDataLocalizationSettingsFrame) + editingPresetDataLocalizationW4Label.config(style = 'label2.TLabel') + editingPresetDataLocalizationW4Label.config(text = 'Szkoła') + editingPresetDataLocalizationW4Label.grid(row = 4, column = 0, padx = 5, pady = 5) + + # Lokalizacja nazwiska (wiersz) + EPDataLocalizationSchoolRowVar = TK.IntVar() + EPDataLocalizationSchoolRowSpinbox = TKttk.Spinbox(editingPresetDataLocalizationSettingsFrame) + EPDataLocalizationSchoolRowSpinbox.config(textvariable = EPDataLocalizationSchoolRowVar) + EPDataLocalizationSchoolRowSpinbox.config(from_ = 0) + EPDataLocalizationSchoolRowSpinbox.config(to = 1000000) + EPDataLocalizationSchoolRowSpinbox.config(style = 'spinbox1.TSpinbox') + EPDataLocalizationSchoolRowSpinbox.grid(row = 4, column = 1, padx = 5, pady = 5) + + # Lokalizacja nazwiska (pozycja w wierszu) + EPDataLocalizationSchoolPosInRowVar = TK.IntVar() + EPDataLocalizationSchoolPosInRowSpinbox = TKttk.Spinbox(editingPresetDataLocalizationSettingsFrame) + EPDataLocalizationSchoolPosInRowSpinbox.config(textvariable = EPDataLocalizationSchoolPosInRowVar) + EPDataLocalizationSchoolPosInRowSpinbox.config(from_ = 0) + EPDataLocalizationSchoolPosInRowSpinbox.config(to = 1000000) + EPDataLocalizationSchoolPosInRowSpinbox.config(style = 'spinbox1.TSpinbox') + EPDataLocalizationSchoolPosInRowSpinbox.grid(row = 4, column = 2, padx = 5, pady = 5) + + # W5 - "Klasa" + editingPresetDataLocalizationW5Label = TKttk.Label(editingPresetDataLocalizationSettingsFrame) + editingPresetDataLocalizationW5Label.config(style = 'label2.TLabel') + editingPresetDataLocalizationW5Label.config(text = 'Klasa') + editingPresetDataLocalizationW5Label.grid(row = 5, column = 0, padx = 5, pady = 5) + + # Lokalizacja nazwiska (wiersz) + EPDataLocalizationClassRowVar = TK.IntVar() + EPDataLocalizationClassRowSpinbox = TKttk.Spinbox(editingPresetDataLocalizationSettingsFrame) + EPDataLocalizationClassRowSpinbox.config(textvariable = EPDataLocalizationClassRowVar) + EPDataLocalizationClassRowSpinbox.config(from_ = 0) + EPDataLocalizationClassRowSpinbox.config(to = 1000000) + EPDataLocalizationClassRowSpinbox.config(style = 'spinbox1.TSpinbox') + EPDataLocalizationClassRowSpinbox.grid(row = 5, column = 1, padx = 5, pady = 5) + + # Lokalizacja nazwiska (pozycja w wierszu) + EPDataLocalizationClassPosInRowVar = TK.IntVar() + EPDataLocalizationClassPosInRowSpinbox = TKttk.Spinbox(editingPresetDataLocalizationSettingsFrame) + EPDataLocalizationClassPosInRowSpinbox.config(textvariable = EPDataLocalizationClassPosInRowVar) + EPDataLocalizationClassPosInRowSpinbox.config(from_ = 0) + EPDataLocalizationClassPosInRowSpinbox.config(to = 1000000) + EPDataLocalizationClassPosInRowSpinbox.config(style = 'spinbox1.TSpinbox') + EPDataLocalizationClassPosInRowSpinbox.grid(row = 5, column = 2, padx = 5, pady = 5) + + ######################### + + ################################### + + # (2) Przyciski ################### + + editingPresetButtonsFrame = TKttk.Frame(editingPresetFrame) + editingPresetButtonsFrame.config(style = 'layoutFrame.TFrame') + editingPresetButtonsFrame.pack(fill = TK.X, side = TK.BOTTOM, pady = 10) + + def editingPresetSaveAction(): + if loadingList.get() not in FMT.getList(): + if MSG('A0001', False): + studentVar = EPOSTypeVar.get() + if studentVar == 's': + studentVar = True + else: + studentVar = False + formatFileContentToSave = { + "student" : studentVar, + "personSeparator" : EPOSPersonSeparatorEntry.get(), + "rowSeparator" : EPOSRowSeparatorEntry.get(), + "dataSeparators" : (EPOSDataSeparatorText.get("1.0", TK.END)).split('\n')[:-1], + "loginRow" : int(EPDataLocalizationLoginRowSpinbox.get()), + "loginPositionInRow" : int(EPDataLocalizationLoginPosInRowSpinbox.get()), + "fnameRow" : int(EPDataLocalizationFnameRowSpinbox.get()), + "fnamePositionInRow" : int(EPDataLocalizationFnamePosInRowSpinbox.get()), + "lnameRow" : int(EPDataLocalizationLnameRowSpinbox.get()), + "lnamePositionInRow" : int(EPDataLocalizationLnamePosInRowSpinbox.get()), + "schoolRow" : int(EPDataLocalizationSchoolRowSpinbox.get()), + "schoolPositionInRow" : int(EPDataLocalizationSchoolPosInRowSpinbox.get()), + "classRow" : int(EPDataLocalizationClassRowSpinbox.get()), + "classPositionInRow" : int(EPDataLocalizationClassPosInRowSpinbox.get()), + } + FMT.W(loadingList.get(), formatFileContentToSave) + 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, + } + loadingList['state'] = TK.NORMAL + loadingButton['state'] = TK.NORMAL + EPOSTypeStudentRadiobutton['state'] = TK.DISABLED + EPOSTypeTeacherRadiobutton['state'] = TK.DISABLED + if formatFileContent['student']: + EPOSTypeVar.set('s') + else: + EPOSTypeVar.set('t') + EPOSPersonSeparatorEntry['state'] = TK.DISABLED + EPOSPersonSeparatorVar.set(formatFileContent['personSeparator']) + EPOSRowSeparatorEntry['state'] = TK.DISABLED + EPOSRowSeparatorVar.set(formatFileContent['rowSeparator']) + EPOSDataSeparatorText.delete('1.0', TK.END) + EPOSDataSeparatorText['state'] = TK.DISABLED + EPDataLocalizationLoginRowSpinbox['state'] = TK.DISABLED + EPDataLocalizationLoginRowVar.set(formatFileContent['loginRow']) + EPDataLocalizationLoginPosInRowSpinbox['state'] = TK.DISABLED + EPDataLocalizationLoginPosInRowVar.set(formatFileContent['loginPositionInRow']) + EPDataLocalizationFnameRowSpinbox['state'] = TK.DISABLED + EPDataLocalizationFnameRowVar.set(formatFileContent['fnameRow']) + EPDataLocalizationFnamePosInRowSpinbox['state'] = TK.DISABLED + EPDataLocalizationFnamePosInRowVar.set(formatFileContent['fnamePositionInRow']) + EPDataLocalizationLnameRowSpinbox['state'] = TK.DISABLED + EPDataLocalizationLnameRowVar.set(formatFileContent['lnameRow']) + EPDataLocalizationLnamePosInRowSpinbox['state'] = TK.DISABLED + EPDataLocalizationLnamePosInRowVar.set(formatFileContent['lnamePositionInRow']) + EPDataLocalizationSchoolRowSpinbox['state'] = TK.DISABLED + EPDataLocalizationSchoolRowVar.set(formatFileContent['schoolRow']) + EPDataLocalizationSchoolPosInRowSpinbox['state'] = TK.DISABLED + EPDataLocalizationSchoolPosInRowVar.set(formatFileContent['schoolPositionInRow']) + EPDataLocalizationClassRowSpinbox['state'] = TK.DISABLED + EPDataLocalizationClassRowVar.set(formatFileContent['classRow']) + EPDataLocalizationClassPosInRowSpinbox['state'] = TK.DISABLED + EPDataLocalizationClassPosInRowVar.set(formatFileContent['classPositionInRow']) + editingPresetSaveButton['state'] = TK.DISABLED + editingPresetCancelButton['state'] = TK.DISABLED + loadingList['values'] = tuple(FMT.getList()) + else: + return + else: + if MSG('A0002', False): + studentVar = EPOSTypeVar.get() + if studentVar == 's': + studentVar = True + else: + studentVar = False + formatFileContentToSave = { + "student" : studentVar, + "personSeparator" : EPOSPersonSeparatorEntry.get(), + "rowSeparator" : EPOSRowSeparatorEntry.get(), + "dataSeparators" : (EPOSDataSeparatorText.get("1.0", TK.END)).split('\n')[:-1], + "loginRow" : int(EPDataLocalizationLoginRowSpinbox.get()), + "loginPositionInRow" : int(EPDataLocalizationLoginPosInRowSpinbox.get()), + "fnameRow" : int(EPDataLocalizationFnameRowSpinbox.get()), + "fnamePositionInRow" : int(EPDataLocalizationFnamePosInRowSpinbox.get()), + "lnameRow" : int(EPDataLocalizationLnameRowSpinbox.get()), + "lnamePositionInRow" : int(EPDataLocalizationLnamePosInRowSpinbox.get()), + "schoolRow" : int(EPDataLocalizationSchoolRowSpinbox.get()), + "schoolPositionInRow" : int(EPDataLocalizationSchoolPosInRowSpinbox.get()), + "classRow" : int(EPDataLocalizationClassRowSpinbox.get()), + "classPositionInRow" : int(EPDataLocalizationClassPosInRowSpinbox.get()), + } + FMT.W(loadingList.get(), formatFileContentToSave) + 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, + } + loadingList['state'] = TK.NORMAL + loadingButton['state'] = TK.NORMAL + EPOSTypeStudentRadiobutton['state'] = TK.DISABLED + EPOSTypeTeacherRadiobutton['state'] = TK.DISABLED + if formatFileContent['student']: + EPOSTypeVar.set('s') + else: + EPOSTypeVar.set('t') + EPOSPersonSeparatorEntry['state'] = TK.DISABLED + EPOSPersonSeparatorVar.set(formatFileContent['personSeparator']) + EPOSRowSeparatorEntry['state'] = TK.DISABLED + EPOSRowSeparatorVar.set(formatFileContent['rowSeparator']) + EPOSDataSeparatorText.delete('1.0', TK.END) + EPOSDataSeparatorText['state'] = TK.DISABLED + EPDataLocalizationLoginRowSpinbox['state'] = TK.DISABLED + EPDataLocalizationLoginRowVar.set(formatFileContent['loginRow']) + EPDataLocalizationLoginPosInRowSpinbox['state'] = TK.DISABLED + EPDataLocalizationLoginPosInRowVar.set(formatFileContent['loginPositionInRow']) + EPDataLocalizationFnameRowSpinbox['state'] = TK.DISABLED + EPDataLocalizationFnameRowVar.set(formatFileContent['fnameRow']) + EPDataLocalizationFnamePosInRowSpinbox['state'] = TK.DISABLED + EPDataLocalizationFnamePosInRowVar.set(formatFileContent['fnamePositionInRow']) + EPDataLocalizationLnameRowSpinbox['state'] = TK.DISABLED + EPDataLocalizationLnameRowVar.set(formatFileContent['lnameRow']) + EPDataLocalizationLnamePosInRowSpinbox['state'] = TK.DISABLED + EPDataLocalizationLnamePosInRowVar.set(formatFileContent['lnamePositionInRow']) + EPDataLocalizationSchoolRowSpinbox['state'] = TK.DISABLED + EPDataLocalizationSchoolRowVar.set(formatFileContent['schoolRow']) + EPDataLocalizationSchoolPosInRowSpinbox['state'] = TK.DISABLED + EPDataLocalizationSchoolPosInRowVar.set(formatFileContent['schoolPositionInRow']) + EPDataLocalizationClassRowSpinbox['state'] = TK.DISABLED + EPDataLocalizationClassRowVar.set(formatFileContent['classRow']) + EPDataLocalizationClassPosInRowSpinbox['state'] = TK.DISABLED + EPDataLocalizationClassPosInRowVar.set(formatFileContent['classPositionInRow']) + editingPresetSaveButton['state'] = TK.DISABLED + editingPresetCancelButton['state'] = TK.DISABLED + loadingList['values'] = tuple(FMT.getList()) + else: + return + editingPresetSaveButton = TKttk.Button(editingPresetButtonsFrame) + editingPresetSaveButton.config(command = editingPresetSaveAction) + editingPresetSaveButton.config(state = TK.DISABLED) + editingPresetSaveButton.config(style = 'button1.TButton') + editingPresetSaveButton.config(width = GUI.R()['editingPresetSaveButtonWidth']) + editingPresetSaveButton.config(text = 'ZAPISZ') + editingPresetSaveButton.pack(side = TK.LEFT, expand = 1) + + def editingPresetCancelAction(): + 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, + } + loadingList['state'] = TK.NORMAL + loadingButton['state'] = TK.NORMAL + EPOSTypeStudentRadiobutton['state'] = TK.DISABLED + EPOSTypeTeacherRadiobutton['state'] = TK.DISABLED + if formatFileContent['student']: + EPOSTypeVar.set('s') + else: + EPOSTypeVar.set('t') + EPOSPersonSeparatorEntry['state'] = TK.DISABLED + EPOSPersonSeparatorVar.set(formatFileContent['personSeparator']) + EPOSRowSeparatorEntry['state'] = TK.DISABLED + EPOSRowSeparatorVar.set(formatFileContent['rowSeparator']) + EPOSDataSeparatorText.delete('1.0', TK.END) + EPOSDataSeparatorText['state'] = TK.DISABLED + EPDataLocalizationLoginRowSpinbox['state'] = TK.DISABLED + EPDataLocalizationLoginRowVar.set(formatFileContent['loginRow']) + EPDataLocalizationLoginPosInRowSpinbox['state'] = TK.DISABLED + EPDataLocalizationLoginPosInRowVar.set(formatFileContent['loginPositionInRow']) + EPDataLocalizationFnameRowSpinbox['state'] = TK.DISABLED + EPDataLocalizationFnameRowVar.set(formatFileContent['fnameRow']) + EPDataLocalizationFnamePosInRowSpinbox['state'] = TK.DISABLED + EPDataLocalizationFnamePosInRowVar.set(formatFileContent['fnamePositionInRow']) + EPDataLocalizationLnameRowSpinbox['state'] = TK.DISABLED + EPDataLocalizationLnameRowVar.set(formatFileContent['lnameRow']) + EPDataLocalizationLnamePosInRowSpinbox['state'] = TK.DISABLED + EPDataLocalizationLnamePosInRowVar.set(formatFileContent['lnamePositionInRow']) + EPDataLocalizationSchoolRowSpinbox['state'] = TK.DISABLED + EPDataLocalizationSchoolRowVar.set(formatFileContent['schoolRow']) + EPDataLocalizationSchoolPosInRowSpinbox['state'] = TK.DISABLED + EPDataLocalizationSchoolPosInRowVar.set(formatFileContent['schoolPositionInRow']) + EPDataLocalizationClassRowSpinbox['state'] = TK.DISABLED + EPDataLocalizationClassRowVar.set(formatFileContent['classRow']) + EPDataLocalizationClassPosInRowSpinbox['state'] = TK.DISABLED + EPDataLocalizationClassPosInRowVar.set(formatFileContent['classPositionInRow']) + editingPresetSaveButton['state'] = TK.DISABLED + editingPresetCancelButton['state'] = TK.DISABLED + loadingList['values'] = tuple(FMT.getList()) + editingPresetCancelButton = TKttk.Button(editingPresetButtonsFrame) + editingPresetCancelButton.config(command = editingPresetCancelAction) + editingPresetCancelButton.config(state = TK.DISABLED) + editingPresetCancelButton.config(style = 'button1.TButton') + editingPresetCancelButton.config(width = GUI.R()['editingPresetCancelButtonWidth']) + editingPresetCancelButton.config(text = 'Anuluj') + editingPresetCancelButton.pack(side = TK.RIGHT, expand = 1) + + ################################### + + ############################################# + + ###################################################################### + + + + # TAB4 - Ustawienia ################################################## + + settingsTab = TKttk.Frame(mainMenu) + settingsTab.config(style = "mainMenuTabFrame.TFrame") + settingsTabImg = PLimg.open(GUI.R()['settingsTabIcon']) + settingsTabImg = settingsTabImg.resize((GUI.R()['tabIconsSize'], GUI.R()['tabIconsSize']), PLimg.ANTIALIAS) + settingsTabImg = PLitk.PhotoImage(settingsTabImg) + mainMenu.add(settingsTab, image = settingsTabImg, state = TK.NORMAL) + + + # Nagłówek + settingsHeader = TKttk.Label(settingsTab) + settingsHeader.config(style = 'tabHeader.TLabel') + settingsHeader.config(text = 'USTAWIENIA') + settingsHeader.pack(fill = TK.X) + + + # Zawartość + settingsFrame = TKttk.Frame(settingsTab) + settingsFrame.config(style = 'tabFrame.TFrame') + settingsFrame.pack(fill = TK.BOTH, expand = 1, padx = GUI.R()['tabFramePadding'], pady = GUI.R()['tabFramePadding']) + + ###################################################################### + + + + # TAB5 - O programie ################################################# + + aboutTab = TKttk.Frame(mainMenu) + aboutTab.config(style = "mainMenuTabFrame.TFrame") + aboutTabImg = PLimg.open(GUI.R()['aboutTabIcon']) + aboutTabImg = aboutTabImg.resize((GUI.R()['tabIconsSize'], GUI.R()['tabIconsSize']), PLimg.ANTIALIAS) + aboutTabImg = PLitk.PhotoImage(aboutTabImg) + mainMenu.add(aboutTab, image = aboutTabImg, state = TK.NORMAL) + + + # Nagłówek + aboutHeader = TKttk.Label(aboutTab) + aboutHeader.config(style = 'tabHeader.TLabel') + aboutHeader.config(text = 'O PROGRAMIE') + aboutHeader.pack(fill = TK.X) + + + # Zawartość + aboutFrame = TKttk.Frame(aboutTab) + aboutFrame.config(style = 'tabFrame.TFrame') + aboutFrame.pack(fill = TK.BOTH, expand = 1, padx = GUI.R()['tabFramePadding'], pady = GUI.R()['tabFramePadding']) + + ###################################################################### + + + + # Mainloop + window.mainloop() +window() \ No newline at end of file diff --git a/src/load_cfg.py b/src/load_cfg.py deleted file mode 100644 index e69de29..0000000 diff --git a/src/vars.py b/src/vars.py deleted file mode 100644 index 3712333..0000000 --- a/src/vars.py +++ /dev/null @@ -1,132 +0,0 @@ -""" -# 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 - - # Labelframe'y - lfBorderwidth = 1 # Szerokość obramowania - - # Textbox'y - tbBorderwidth = 0 # Szerokość obramowania - - # FORMATTAB - framePadY = 10 - tbPad = 8 - tbWidth = 42 - tbHeight = 9 - tbWidth2 = 56 - bnHeight = 2 - bnWidth = 30 - bnWidth2 = 30 - - # INFOTAB - 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 = '#323741' # Tło - headerText = '#C0C0C0' # Tekst - - # Labelframe'y - lfText = '#C0C0C0' # Tekst - - # Label'e - label1 = '#C0C0C0' # Tekst - - # Textbox'y - textboxBG = '#282B36' # Tło - textboxText = '#C0C0C0' # Tekst - - # Button'y - buttonBG = '#323741' # Tło - buttonText = '#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' - formatTab = 'assets/tab_icons/format.png' - infoTab = 'assets/tab_icons/info.png' - - - # Czcionki - class fonts: - # Główne - tabHeader = ['Segoe UI', 12] # Nagłowki - - # INFOTAB - 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