From 01f2103f2a088b97b4c83f80bd61bbdb1affb3e9 Mon Sep 17 00:00:00 2001 From: Mateusz Skoczek Date: Sat, 8 Aug 2020 01:53:49 +0200 Subject: [PATCH] 4.0 Alpha (Build 20221) --- assets/icon.png | Bin 0 -> 44017 bytes assets/tab-icons/icon.png | Bin 0 -> 44017 bytes changelog-UC.txt | 6 +- default-configs/style.cfg | 217 ++++---- generator.pyw | 954 ++++++++++++++---------------------- assets/icon.ico => icon.ico | Bin 6 files changed, 486 insertions(+), 691 deletions(-) create mode 100644 assets/icon.png create mode 100644 assets/tab-icons/icon.png rename assets/icon.ico => icon.ico (100%) diff --git a/assets/icon.png b/assets/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..e0314abee281359a16f991ae1a1c9cceceda9a91 GIT binary patch literal 44017 zcmV*(KsLXLP)004R>004l5008;`004mK004C`008P>0026e000+ooVrmw00006 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%0AJXF1`vsEtxd99m+EY*(&>9dam-Kh` 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 literal 0 HcmV?d00001 diff --git a/assets/tab-icons/icon.png b/assets/tab-icons/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..e0314abee281359a16f991ae1a1c9cceceda9a91 GIT binary patch literal 44017 zcmV*(KsLXLP)004R>004l5008;`004mK004C`008P>0026e000+ooVrmw00006 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%0AJXF1`vsEtxd99m+EY*(&>9dam-Kh` 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 literal 0 HcmV?d00001 diff --git a/changelog-UC.txt b/changelog-UC.txt index f98cec9..fbc3df0 100644 --- a/changelog-UC.txt +++ b/changelog-UC.txt @@ -88,4 +88,8 @@ 4.0 Alpha (Build 20220) - Zastosowanie nowego systemu przetwarzania plików konfiguracyjnych dla pliku 'config.cfg' (tylko odczyt) -- Rozpoczęcie prac nad skryptem przetwarzającym dane \ No newline at end of file +- Rozpoczęcie prac nad skryptem przetwarzającym dane + +4.0 Alpha (Build 20221) +- Zastosowanie nowego systemu przetwarzania plików konfiguracyjnych dla pliku 'style.cfg' +- Lekkie zmiany w interfejsie \ No newline at end of file diff --git a/default-configs/style.cfg b/default-configs/style.cfg index addf2fd..4c6908c 100644 --- a/default-configs/style.cfg +++ b/default-configs/style.cfg @@ -1,108 +1,109 @@ -windowWidth = 1200 -windowHeight = 720 -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 = 5 -combobox1ListBoxBackground = #333842 -combobox1ListBoxForeground = #C0C0C0 -combobox1ListBoxSelectBackground = #737373 -combobox1ListBoxSelectForeground = #FFFFFF -button1TextAnchor = center -button1Background = #333842 -button1Foreground = #C0C0C0 -button1Padding = 4 -editingPresetSaveButtonWidth = 25 -editingPresetCancelButtonWidth = 25 -loadingButtonWidth = 15 -loadingListWidth = 85 -generateFilesLabelWidth = 15 -generateFilesLabelAnchor = center -spinbox1ArrowColor = #C0C0C0 -spinbox1FieldBackground = #333842 -spinbox1Relief = flat -spinbox1BorderWidth = 0 -spinbox1TextColor = #C0C0C0 -spinbox1ButtonColor = #333842 -spinbox1Padding = 7 -radiobutton1Background = #21242D -radiobutton1TextColor = #C0C0C0 -entry1FieldBackground = #333842 -entry1Relief = flat -entry1BorderWidth = 0 -entry1Padding = 7 -text1Background = #333842 -text1TextColor = #C0C0C0 -text1Relief = flat -entry1TextColor = #C0C0C0 -label2BG = #21242D -label2TextColor = #C0C0C0 -label3BG = #21242D -label3TextColor = #C0C0C0 -label3Anchor = w -radiobutton1IndicatorBackground = #21242D -loadingListPadX = 12 -EPOSTypeStudentRadiobuttonPadY = 5 -EPOSTypeStudentRadiobuttonWidth = 20 -EPOSTypeTeacherRadiobuttonPadY = 5 -EPOSTypeTeacherRadiobuttonWidth = 20 -EPOSPersonSeparatorEntryWidth = 56 -EPOSRowSeparatorEntryWidth = 56 -EPOSDataSeparatorTextWidth = 42 -EPOSDataSeparatorTextHeight = 17 -EPDataLocalizationPadX = 6 -EPDataLocalizationPadY = 6 -label3BG = #21242D -label3TextColor = #C0C0C0 -label3Font = Segoe UI;6 -GIFSLocalizationEntryWidth = 109 -GIFFrameSeparators = 16 -generateInputFilesPlusMinusButtonsWidth = 2 -generateResetButtonWidth = 10 -generateInputFilesPadding = 6 -generateOutputFilesPadding = 6 -combobox2ArrowColor = #C0C0C0 -combobox2ButtonColor = #333842 -combobox2BorderColor = #21242D -combobox2FieldBackground = #333842 -combobox2TextColor = #C0C0C0 -combobox2Relief = flat -combobox2BorderWidth = 0 -combobox2Padding = 7 -combobox2ListBoxBackground = #333842 -combobox2ListBoxForeground = #C0C0C0 -combobox2ListBoxSelectBackground = #737373 -combobox2ListBoxSelectForeground = #FFFFFF -EPOSLabelWidth = 30 -EPOSLabelAnchor = center \ No newline at end of file +windowWidth(I) = 1200 +windowHeight(I) = 720 +windowWidthResizable(B) = 0 +windowHeightResizable(B) = 0 +windowMainBG(C) = #21242D +mainIcon(P) = icon.ico +mainMenuBG(C) = #21242D +mainMenuPosition(FAposition) = wn +tabFramesBorderWidth(I) = 0 +unselectedTabBG(C) = #21242D +menuTabsBorderWidth(I) = 0 +menuTabsPadding(I) = 10 +selectedTabBG(C) = #333842 +disabledTabBG(C) = #333842 +tabFrameBG(C) = #21242D +headerFont(F) = Segoe UI;15 +headerBG(C) = #333842 +headerTextColor(C) = #C0C0C0 +headerPadding(I) = 10 +headerTextAnchor(FAanchor) = center +contentTabFrameBG(C) = #21242D +layoutFrameBG(C) = #21242D +label1BG(C) = #21242D +label1TextColor(C) = #C0C0C0 +label1Font(F) = Segoe UI;10 +label2BG(C) = #21242D +label2TextColor(C) = #C0C0C0 +label2Font(F) = Segoe UI;9 +combobox1ArrowColor(C) = #C0C0C0 +combobox1ButtonColor(C) = #333842 +combobox1BorderColor(C) = #21242D +combobox1FieldBackground(C) = #333842 +combobox1TextColor(C) = #C0C0C0 +combobox1Relief(FArelief) = flat +combobox1BorderWidth(I) = 0 +combobox1Padding(I) = 5 +combobox1ListBoxBackground(C) = #333842 +combobox1ListBoxForeground(C) = #C0C0C0 +combobox1ListBoxSelectBackground(C) = #737373 +combobox1ListBoxSelectForeground(C) = #FFFFFF +combobox2ArrowColor(C) = #C0C0C0 +combobox2ButtonColor(C) = #333842 +combobox2BorderColor(C) = #21242D +combobox2FieldBackground(C) = #333842 +combobox2TextColor(C) = #C0C0C0 +combobox2Relief(FArelief) = flat +combobox2BorderWidth(I) = 0 +combobox2Padding(I) = 7 +combobox2ListBoxBackground(C) = #333842 +combobox2ListBoxForeground(C) = #C0C0C0 +combobox2ListBoxSelectBackground(C) = #737373 +combobox2ListBoxSelectForeground(C) = #FFFFFF +button1TextAnchor(FAanchor) = center +button1Background(C) = #333842 +button1Foreground(C) = #C0C0C0 +button1Padding(I) = 4 +separator1BG(C) = #21242D +spinbox1ArrowColor(C) = #C0C0C0 +spinbox1FieldBackground(C) = #333842 +spinbox1Relief(FArelief) = flat +spinbox1BorderWidth(I) = 0 +spinbox1TextColor(C) = #C0C0C0 +spinbox1ButtonColor(C) = #333842 +spinbox1Padding(I) = 7 +entry1FieldBackground(C) = #333842 +entry1Relief(FArelief) = flat +entry1BorderWidth(I) = 0 +entry1Padding(I) = 7 +entry1TextColor(C) = #C0C0C0 +iconTabIcon(P) = assets/tab-icons/icon.png +tabIconsSize(I) = 30 +generateTabIcon(P) = assets/tab-icons/generate.png +headerFill(FAfill) = x +tabFramePadding(I) = 10 +contentTabFrameFill(FAfill) = both +contentTabFrameExpand(I) = 1 +outsidelayoutFramesPadX(I) = 6 +GIFFrameSeparators(I) = 16 +generateFilesLabelWidth(I) = 15 +generateFilesLabelAnchor(FAanchor) = center +generateInputFilesPadding(I) = 6 +generateHorizontalSeparatorPadY(I) = 10 +generateOutputFilesPadding(I) = 6 +generateStartButtonPadding(I) = 10 +generateStartButtonPadY(I) = 6 +formatTabIcon(P) = assets/tab-icons/format.png +loadingListPadX(I) = 12 +loadingButtonWidth(I) = 15 +formatHorizontalSeparatorPadY(I) = 10 +formatVerticalSeparatorPadY(I) = 10 +EPOSTypeFramePadY(I) = 0 +EPOSPersonSeparatorFramePadY(I) = 0 +EPOSRowSeparatorFramePadY(I) = 0 +EPOSDataSeparatorFramePadY(I) = 7 +EPOSLabelWidth(I) = 30 +EPOSLabelAnchor(FAanchor) = center +radiobutton1Background(C) = #21242D +radiobutton1TextColor(C) = #C0C0C0 +radiobutton1IndicatorBackground(C) = #21242D +text1Background(C) = #333842 +text1TextColor(C) = #C0C0C0 +text1Relief(FArelief) = flat +EPDataLocalizationPadX(I) = 6 +EPDataLocalizationPadY(I) = 6 +editingPresetButtonsPadY(I) = 6 +editingPresetSaveButtonWidth(I) = 25 +editingPresetCancelButtonWidth(I) = 25 +settingsTabIcon(P) = assets/tab-icons/settings.png +aboutTabIcon(P) = assets/tab-icons/about.png \ No newline at end of file diff --git a/generator.pyw b/generator.pyw index ee7f221..12fe2d6 100644 --- a/generator.pyw +++ b/generator.pyw @@ -12,7 +12,7 @@ # ----------------------------------------- # Zmienne # ----------------------------------------- # -class VARS: +class VAR: programName = 'Generator CSV' programVersion = '4.0' programCustomer = 'ZSP Sobolew' @@ -126,7 +126,7 @@ if 'Generator CSV' not in [x for x in OS.listdir(appdata)]: class CFG: # Funkcje sprawdzające istnienie - def __checkIfConfigFileExist(self, write): + def __checkIfFileExist(self, write): if write: try: file = open((str(appdata) + '\Generator CSV\config.cfg'), 'a') @@ -205,7 +205,7 @@ class CFG: def R(self, record): - self.__checkIfConfigFileExist(False) + self.__checkIfFileExist(False) content = {} for x in CD.open((str(appdata) + '\Generator CSV\config.cfg'), 'r', 'utf-8').read().split('\n'): x = x.split(' = ') @@ -250,381 +250,170 @@ class CFG: def W(self): pass + """ + 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() -print(CFG.R('allowedCharactersInSeparator')) + # ---------------------------------- # Ładowanie pliku stylu # ---------------------------------- # class GUI: - def __checkInstance(self): + # Funkcje sprawdzające istnienie + def __checkIfFileExist(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('generateFilesLabelWidth') - if not check[0]: - return check - check = functions.fromArray('generateFilesLabelAnchor', ['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 - check = functions.color('radiobutton1IndicatorBackground') - if not check[0]: - return check - check = functions.integer('loadingListPadX') - if not check[0]: - return check - check = functions.integer('EPOSTypeStudentRadiobuttonPadY') - if not check[0]: - return check - check = functions.integer('EPOSTypeStudentRadiobuttonWidth') - if not check[0]: - return check - check = functions.integer('EPOSTypeTeacherRadiobuttonWidth') - if not check[0]: - return check - check = functions.integer('EPOSTypeTeacherRadiobuttonPadY') - if not check[0]: - return check - check = functions.integer('EPOSPersonSeparatorEntryWidth') - if not check[0]: - return check - check = functions.integer('EPOSRowSeparatorEntryWidth') - if not check[0]: - return check - check = functions.integer('EPOSDataSeparatorTextWidth') - if not check[0]: - return check - check = functions.integer('EPOSDataSeparatorTextHeight') - if not check[0]: - return check - check = functions.integer('EPDataLocalizationPadX') - if not check[0]: - return check - check = functions.integer('EPDataLocalizationPadY') - 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.font('label3Font') - if not check[0]: - return check - check = functions.integer('GIFSLocalizationEntryWidth') - if not check[0]: - return check - check = functions.integer('GIFFrameSeparators') - if not check[0]: - return check - check = functions.integer('generateInputFilesPlusMinusButtonsWidth') - if not check[0]: - return check - check = functions.integer('generateResetButtonWidth') - if not check[0]: - return check - check = functions.integer('generateInputFilesPadding') - if not check[0]: - return check - check = functions.integer('generateOutputFilesPadding') - if not check[0]: - return check - return [True, content] - def R(self): - self.__checkInstance() + def __checkIfRecordExist(self, content, record): + if record in list(content.keys()): + return [True] + else: + return [False, 'Brak danych - klucz: %s' % record] + + + # Funkcje sprawdzające poprawność rekordu + def __checkI(self, record, var): + try: + var = int(var) + except: + return (False, 'Niepoprawne dane - klucz: %s' % record) + return [True, var] + + def __checkB(self, record, var): + try: + var = int(var) + except: + return [False, 'Niepoprawne dane - klucz: %s' % record] + if var != 0 and var != 1: + return [False, 'Niepoprawne dane - klucz: %s' % record] + else: + if var == 0: + var = False + else: + var = True + return [True, var] + + def __checkC(self, record, var): + if len(var) != 7: + return [False, 'Niepoprawne dane - klucz: %s' % record] + else: + if var[0] != '#': + return [False, 'Niepoprawne dane - klucz: %s' % record] + return [True, var] + + def __checkP(self, record, var): + try: + check = open(var) + except: + return [False, 'Niepoprawne dane - klucz: %s' % record] + return [True, var] + + def __checkFA(self, record, var, array): + arrays = { + 'position' : ['nw', 'ne', 'en', 'es', 'se', 'sw', 'ws', 'wn'], + 'anchor' : ['center', 'nw', 'n', 'ne', 'w', 'e', 'sw', 's', 'se'], + 'relief' : ['flat', 'raised', 'sunken', 'groove', 'ridge'], + 'fill' : ['x', 'y', 'both'], + } + if var not in arrays[array]: + return [False, 'Niepoprawne dane - klucz: %s' % record] + return [True, var] + + def __checkF(self, record, var): + try: + check = int(var.split(';')[1]) + except: + return [False, 'Niepoprawne dane - klucz: %s' % record] + else: + var = (var.split(';')[0], int(var.split(';')[1])) + return [True, var] + + + + def R(self, record): + self.__checkIfFileExist() 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') + name = x[0].split('(')[0] + var = x[1] + type = x[0].split('(')[1].strip(')') + content[name] = [var.strip('\r'), type] except: continue - contentCheckingOutput = self.__checkContent(content) - if contentCheckingOutput[0]: - return contentCheckingOutput[1] + checkingOutput = self.__checkIfRecordExist(content, record) + if not checkingOutput[0]: + MSG('E0005', True, checkingOutput[1]) + var = content[record] + if var[1] == 'I': + # Integer + checkingOutput = self.__checkI(record, var[0]) + if checkingOutput[0]: + return checkingOutput[1] + else: + MSG('E0005', True, checkingOutput[1]) + elif var[1] == 'B': + # Boolean + checkingOutput = self.__checkB(record, var[0]) + if checkingOutput[0]: + return checkingOutput[1] + else: + MSG('E0005', True, checkingOutput[1]) + elif var[1] == 'C': + # Color + checkingOutput = self.__checkC(record, var[0]) + if checkingOutput[0]: + return checkingOutput[1] + else: + MSG('E0005', True, checkingOutput[1]) + elif var[1] == 'P': + # Path + checkingOutput = self.__checkP(record, var[0]) + if checkingOutput[0]: + return checkingOutput[1] + else: + MSG('E0005', True, checkingOutput[1]) + elif (var[1])[:2] == 'FA': + # From Array + checkingOutput = self.__checkFA(record, var[0], (var[1])[2:]) + if checkingOutput[0]: + return checkingOutput[1] + else: + MSG('E0005', True, checkingOutput[1]) + elif var[1] == 'F': + # Font + checkingOutput = self.__checkF(record, var[0]) + if checkingOutput[0]: + return checkingOutput[1] + else: + MSG('E0005', True, checkingOutput[1]) else: - MSG('E0005', True, contentCheckingOutput[1]) + MSG('E0005', True, 'Nie można rozpoznać typu klucza %s' % record) + + + GUI = GUI() -checkInstance = GUI.R() @@ -978,11 +767,11 @@ class mainWindow: def __init__(self, master): # Okno self.master = master - master.title('%s %s' % (VARS.programName, VARS.programVersion)) - master.geometry('%sx%s' % (str(GUI.R()['windowWidth']), str(GUI.R()['windowHeight']))) - master.resizable(width = GUI.R()['windowWidthResizable'], height = GUI.R()['windowHeightResizable']) - master.configure(bg = GUI.R()['windowMainBG']) - master.iconbitmap(GUI.R()['mainIcon']) + master.title('%s %s' % (VAR.programName, VAR.programVersion)) + master.geometry('%ix%i' % (GUI.R('windowWidth'), GUI.R('windowHeight'))) + master.resizable(width = GUI.R('windowWidthResizable'), height = GUI.R('windowHeightResizable')) + master.configure(bg = GUI.R('windowMainBG')) + master.iconbitmap(GUI.R('mainIcon')) @@ -991,116 +780,117 @@ class mainWindow: TKttk.Style().theme_create("main", parent = "default", settings = { "mainMenu.TNotebook": { "configure": { - "background": GUI.R()['mainMenuBG'], - "tabposition": GUI.R()['mainMenuPosition'], - "borderwidth": GUI.R()['tabFramesBorderWidth'], + "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'], + "background": GUI.R('unselectedTabBG'), + "borderwidth": GUI.R('menuTabsBorderWidth'), + "padding": GUI.R('menuTabsPadding'), }, "map": { "background": [ - ("selected", GUI.R()['selectedTabBG']), - ("disabled", GUI.R()['disabledTabBG']), + ("selected", GUI.R('selectedTabBG')), + ("disabled", GUI.R('disabledTabBG')), ] } }, "mainMenuTabFrame.TFrame": { "configure": { - "background": GUI.R()['tabFrameBG'], + "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'], + "font": GUI.R('headerFont'), + "background": GUI.R('headerBG'), + "foreground": GUI.R('headerTextColor'), + "padding": GUI.R('headerPadding'), + "anchor": GUI.R('headerTextAnchor'), }, }, - "tabFrame.TFrame": { + "contentTabFrame.TFrame": { "configure": { - "background": GUI.R()['tabFrameBG'], + "background": GUI.R('contentTabFrameBG'), }, }, "layoutFrame.TFrame": { "configure": { - "background": GUI.R()['tabFrameBG'], + "background": GUI.R('layoutFrameBG'), }, }, "label1.TLabel": { "configure": { - "background": GUI.R()['label1BG'], - "foreground": GUI.R()['label1TextColor'], - "font": ('Segoe UI', 10) + "background": GUI.R('label1BG'), + "foreground": GUI.R('label1TextColor'), + "font": GUI.R('label1Font'), }, }, "label2.TLabel": { "configure": { - "background": GUI.R()['label2BG'], - "foreground": GUI.R()['label2TextColor'], + "background": GUI.R('label2BG'), + "foreground": GUI.R('label2TextColor'), + "font" : GUI.R('label2Font') }, }, "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'], + "arrowcolor": GUI.R('combobox1ArrowColor'), + "background": GUI.R('combobox1ButtonColor'), + "bordercolor": GUI.R('combobox1BorderColor'), + "fieldbackground": GUI.R('combobox1FieldBackground'), + "foreground": GUI.R('combobox1TextColor'), + "relief": GUI.R('combobox1Relief'), + "borderwidth": GUI.R('combobox1BorderWidth'), + "padding": GUI.R('combobox1Padding'), }, }, "combobox2.TCombobox": { "configure": { - "arrowcolor": GUI.R()['combobox2ArrowColor'], - "background": GUI.R()['combobox2ButtonColor'], - "bordercolor": GUI.R()['combobox2BorderColor'], - "fieldbackground": GUI.R()['combobox2FieldBackground'], - "foreground": GUI.R()['combobox2TextColor'], - "relief": GUI.R()['combobox2Relief'], - "borderwidth": GUI.R()['combobox2BorderWidth'], - "padding": GUI.R()['combobox2Padding'], + "arrowcolor": GUI.R('combobox2ArrowColor'), + "background": GUI.R('combobox2ButtonColor'), + "bordercolor": GUI.R('combobox2BorderColor'), + "fieldbackground": GUI.R('combobox2FieldBackground'), + "foreground": GUI.R('combobox2TextColor'), + "relief": GUI.R('combobox2Relief'), + "borderwidth": GUI.R('combobox2BorderWidth'), + "padding": GUI.R('combobox2Padding'), }, }, "button1.TButton": { "configure": { - "anchor": GUI.R()['button1TextAnchor'], - "background": GUI.R()['button1Background'], - "foreground": GUI.R()['button1Foreground'], - "padding": GUI.R()['button1Padding'], + "anchor": GUI.R('button1TextAnchor'), + "background": GUI.R('button1Background'), + "foreground": GUI.R('button1Foreground'), + "padding": GUI.R('button1Padding'), }, }, "separator1.TSeparator": { "configure": { - "background": GUI.R()['tabFrameBG'], + "background": GUI.R('separator1BG'), }, }, "spinbox1.TSpinbox": { "configure": { - "arrowcolor": GUI.R()['spinbox1ArrowColor'], - "fieldbackground": GUI.R()['spinbox1FieldBackground'], - "relief": GUI.R()['spinbox1Relief'], - "borderwidth": GUI.R()['spinbox1BorderWidth'], - "foreground": GUI.R()['spinbox1TextColor'], - "background": GUI.R()['spinbox1ButtonColor'], - "padding" : GUI.R()['spinbox1Padding'], + "arrowcolor": GUI.R('spinbox1ArrowColor'), + "fieldbackground": GUI.R('spinbox1FieldBackground'), + "relief": GUI.R('spinbox1Relief'), + "borderwidth": GUI.R('spinbox1BorderWidth'), + "foreground": GUI.R('spinbox1TextColor'), + "background": GUI.R('spinbox1ButtonColor'), + "padding" : GUI.R('spinbox1Padding'), }, }, "entry1.TEntry": { "configure": { - "fieldbackground": GUI.R()['entry1FieldBackground'], - "relief": GUI.R()['entry1Relief'], - "borderwidth": GUI.R()['entry1BorderWidth'], - "padding": GUI.R()['entry1Padding'], - "foreground": GUI.R()['entry1TextColor'], + "fieldbackground": GUI.R('entry1FieldBackground'), + "relief": GUI.R('entry1Relief'), + "borderwidth": GUI.R('entry1BorderWidth'), + "padding": GUI.R('entry1Padding'), + "foreground": GUI.R('entry1TextColor'), }, }, }) @@ -1110,14 +900,14 @@ class mainWindow: # Menu główne - self.mainMenu = TKttk.Notebook(master, width = master.winfo_width() - (2 * GUI.R()['menuTabsPadding'] + GUI.R()['tabIconsSize']), height = master.winfo_height()) + self.mainMenu = TKttk.Notebook(master, width = master.winfo_width() - (2 * GUI.R('menuTabsPadding') + GUI.R('tabIconsSize')), height = master.winfo_height()) self.mainMenu.config(style = "mainMenu.TNotebook") self.mainMenu.grid(row = 0) # Ikona self.iconTab = TKttk.Frame(self.mainMenu) - self.iconTabImg = PLimg.open(GUI.R()['mainIcon']) - self.iconTabImg = self.iconTabImg.resize((GUI.R()['tabIconsSize'], GUI.R()['tabIconsSize']), PLimg.ANTIALIAS) + self.iconTabImg = PLimg.open(GUI.R('iconTabIcon')) + self.iconTabImg = self.iconTabImg.resize((GUI.R('tabIconsSize'), GUI.R('tabIconsSize')), PLimg.ANTIALIAS) self.iconTabImg = PLitk.PhotoImage(self.iconTabImg) self.mainMenu.add(self.iconTab, image = self.iconTabImg, state = TK.DISABLED) @@ -1128,8 +918,8 @@ class mainWindow: self.generateTab = TKttk.Frame(self.mainMenu) self.generateTab.config(style = "mainMenuTabFrame.TFrame") - self.generateTabImg = PLimg.open(GUI.R()['generateTabIcon']) - self.generateTabImg = self.generateTabImg.resize((GUI.R()['tabIconsSize'], GUI.R()['tabIconsSize']), PLimg.ANTIALIAS) + self.generateTabImg = PLimg.open(GUI.R('generateTabIcon')) + self.generateTabImg = self.generateTabImg.resize((GUI.R('tabIconsSize'), GUI.R('tabIconsSize')), PLimg.ANTIALIAS) self.generateTabImg = PLitk.PhotoImage(self.generateTabImg) self.mainMenu.add(self.generateTab, image = self.generateTabImg, state = TK.NORMAL) @@ -1138,13 +928,13 @@ class mainWindow: self.generateHeader = TKttk.Label(self.generateTab) self.generateHeader.config(style = 'tabHeader.TLabel') self.generateHeader.config(text = 'GENERATOR CSV') - self.generateHeader.pack(fill = TK.X) + self.generateHeader.pack(fill = GUI.R('headerFill')) # Zawartość self.generateFrame = TKttk.Frame(self.generateTab) - self.generateFrame.config(style = 'tabFrame.TFrame') - self.generateFrame.pack(fill = TK.BOTH, expand = 1, padx = GUI.R()['tabFramePadding'], pady = GUI.R()['tabFramePadding']) + self.generateFrame.config(style = 'contentTabFrame.TFrame') + self.generateFrame.pack(fill = GUI.R('contentTabFrameFill'), expand = GUI.R('contentTabFrameExpand'), padx = GUI.R('tabFramePadding'), pady = GUI.R('tabFramePadding')) # (1) Pliki ################################################# @@ -1157,20 +947,20 @@ class mainWindow: self.generateInputFilesFrame = TKttk.Frame(self.generateFilesFrame) self.generateInputFilesFrame.config(style = 'layoutFrame.TFrame') - self.generateInputFilesFrame.pack(fill = TK.BOTH, expand = 1, padx = 6) + self.generateInputFilesFrame.pack(fill = TK.BOTH, expand = 1, padx = GUI.R('outsidelayoutFramesPadX')) # (3) Plik źródłowy 1 ################### self.GIF1Frame = TKttk.Frame(self.generateInputFilesFrame) self.GIF1Frame.config(style = 'layoutFrame.TFrame') - self.GIF1Frame.pack(fill = TK.X, expand = 1, pady = int((GUI.R()['GIFFrameSeparators'])/2)) + self.GIF1Frame.pack(fill = TK.X, expand = 1, pady = int((GUI.R('GIFFrameSeparators')/2))) # "Plik źródłowy (1)" self.GIF1Label = TKttk.Label(self.GIF1Frame) self.GIF1Label.config(style = 'label1.TLabel') - self.GIF1Label.config(width = GUI.R()['generateFilesLabelWidth']) - self.GIF1Label.config(anchor = GUI.R()['generateFilesLabelAnchor']) - self.GIF1Label.config(padding = ('0 0 %s 0' % str(2 * GUI.R()['generateInputFilesPadding']))) + self.GIF1Label.config(width = GUI.R('generateFilesLabelWidth')) + self.GIF1Label.config(anchor = GUI.R('generateFilesLabelAnchor')) + self.GIF1Label.config(padding = ('0 0 %s 0' % str(2 * GUI.R('generateInputFilesPadding')))) self.GIF1Label.config(text = 'Plik źródłowy (1)') self.GIF1Label.pack(side = TK.LEFT) @@ -1182,45 +972,45 @@ class mainWindow: # Lokalizacja self.GIF1SLocalizationFrame = TKttk.Frame(self.GIF1SFrame) self.GIF1SLocalizationFrame.config(style = 'layoutFrame.TFrame') - self.GIF1SLocalizationFrame.pack(side = TK.TOP, fill = TK.X, expand = 1, pady = GUI.R()['generateInputFilesPadding']) + self.GIF1SLocalizationFrame.pack(side = TK.TOP, fill = TK.X, expand = 1, pady = GUI.R('generateInputFilesPadding')) # Lokalizacja - Entry self.GIF1SLocalizationEntryVar = TK.StringVar() self.GIF1SLocalizationEntry = TKttk.Entry(self.GIF1SLocalizationFrame) self.GIF1SLocalizationEntry.config(style = 'entry1.TEntry') self.GIF1SLocalizationEntry.config(textvariable = self.GIF1SLocalizationEntryVar) - self.GIF1SLocalizationEntry.pack(side = TK.LEFT, expand = 1, fill = TK.X, padx = GUI.R()['generateInputFilesPadding']) + self.GIF1SLocalizationEntry.pack(side = TK.LEFT, expand = 1, fill = TK.X, padx = GUI.R('generateInputFilesPadding')) # Lokalizacja - Button self.GIF1SLocalizationButton = TKttk.Button(self.GIF1SLocalizationFrame) self.GIF1SLocalizationButton.config(style = 'button1.TButton') self.GIF1SLocalizationButton.config(text = 'Przeglądaj') self.GIF1SLocalizationButton.config(command = self.GIF1SLocalizationButtonAction) - self.GIF1SLocalizationButton.pack(side = TK.RIGHT, padx = GUI.R()['generateInputFilesPadding']) + self.GIF1SLocalizationButton.pack(side = TK.RIGHT, padx = GUI.R('generateInputFilesPadding')) # Format self.GIF1SFormatFrame = TKttk.Frame(self.GIF1SFrame) self.GIF1SFormatFrame.config(style = 'layoutFrame.TFrame') - self.GIF1SFormatFrame.pack(side = TK.BOTTOM, fill = TK.X, expand = 1, pady = GUI.R()['generateInputFilesPadding']) + self.GIF1SFormatFrame.pack(side = TK.BOTTOM, fill = TK.X, expand = 1, pady = GUI.R('generateInputFilesPadding')) # Format - Label self.GIF1SFormatLabel = TKttk.Label(self.GIF1SFormatFrame) self.GIF1SFormatLabel.config(style = 'label2.TLabel') self.GIF1SFormatLabel.config(text = 'Format') - self.GIF1SFormatLabel.pack(side = TK.LEFT, padx = GUI.R()['generateInputFilesPadding']) + self.GIF1SFormatLabel.pack(side = TK.LEFT, padx = GUI.R('generateInputFilesPadding')) # Format - Combobox self.GIF1SFormatComboboxVar = TK.StringVar() self.GIF1SFormatCombobox = TKttk.Combobox(self.GIF1SFormatFrame) self.GIF1SFormatCombobox.config(style = 'combobox1.TCombobox') - self.GIF1SFormatCombobox.option_add("*TCombobox*Listbox.background", GUI.R()['combobox1ListBoxBackground']) - self.GIF1SFormatCombobox.option_add("*TCombobox*Listbox.foreground", GUI.R()['combobox1ListBoxForeground']) - self.GIF1SFormatCombobox.option_add("*TCombobox*Listbox.selectBackground", GUI.R()['combobox1ListBoxSelectBackground']) - self.GIF1SFormatCombobox.option_add("*TCombobox*Listbox.selectForeground", GUI.R()['combobox1ListBoxSelectForeground']) + self.GIF1SFormatCombobox.option_add("*TCombobox*Listbox.background", GUI.R('combobox1ListBoxBackground')) + self.GIF1SFormatCombobox.option_add("*TCombobox*Listbox.foreground", GUI.R('combobox1ListBoxForeground')) + self.GIF1SFormatCombobox.option_add("*TCombobox*Listbox.selectBackground", GUI.R('combobox1ListBoxSelectBackground')) + self.GIF1SFormatCombobox.option_add("*TCombobox*Listbox.selectForeground", GUI.R('combobox1ListBoxSelectForeground')) self.GIF1SFormatCombobox.config(state = 'readonly') self.GIF1SFormatCombobox.config(textvariable = self.GIF1SFormatComboboxVar) self.GIF1SFormatCombobox['values'] = tuple(FMT.getList()) - self.GIF1SFormatCombobox.pack(side = TK.LEFT, expand = 1, fill = TK.X, padx = GUI.R()['generateInputFilesPadding']) + self.GIF1SFormatCombobox.pack(side = TK.LEFT, expand = 1, fill = TK.X, padx = GUI.R('generateInputFilesPadding')) ######################################### @@ -1228,15 +1018,15 @@ class mainWindow: self.GIF2Frame = TKttk.Frame(self.generateInputFilesFrame) self.GIF2Frame.config(style = 'layoutFrame.TFrame') - self.GIF2Frame.pack(fill = TK.X, expand = 1, pady = int((GUI.R()['GIFFrameSeparators'])/2)) + self.GIF2Frame.pack(fill = TK.X, expand = 1, pady = int((GUI.R('GIFFrameSeparators')/2))) - # "Plik źródłowy (2)" + # "Plik źródłowy (1)" self.GIF2Label = TKttk.Label(self.GIF2Frame) self.GIF2Label.config(style = 'label1.TLabel') - self.GIF2Label.config(width = GUI.R()['generateFilesLabelWidth']) - self.GIF2Label.config(anchor = GUI.R()['generateFilesLabelAnchor']) - self.GIF2Label.config(padding = ('0 0 %s 0' % str(2 * GUI.R()['generateInputFilesPadding']))) - self.GIF2Label.config(text = 'Plik źródłowy (2)') + self.GIF2Label.config(width = GUI.R('generateFilesLabelWidth')) + self.GIF2Label.config(anchor = GUI.R('generateFilesLabelAnchor')) + self.GIF2Label.config(padding = ('0 0 %s 0' % str(2 * GUI.R('generateInputFilesPadding')))) + self.GIF2Label.config(text = 'Plik źródłowy (1)') self.GIF2Label.pack(side = TK.LEFT) # Plik żródłowy (1) - Ustawienia @@ -1247,45 +1037,45 @@ class mainWindow: # Lokalizacja self.GIF2SLocalizationFrame = TKttk.Frame(self.GIF2SFrame) self.GIF2SLocalizationFrame.config(style = 'layoutFrame.TFrame') - self.GIF2SLocalizationFrame.pack(side = TK.TOP, fill = TK.X, expand = 1, pady = GUI.R()['generateInputFilesPadding']) + self.GIF2SLocalizationFrame.pack(side = TK.TOP, fill = TK.X, expand = 1, pady = GUI.R('generateInputFilesPadding')) # Lokalizacja - Entry self.GIF2SLocalizationEntryVar = TK.StringVar() self.GIF2SLocalizationEntry = TKttk.Entry(self.GIF2SLocalizationFrame) self.GIF2SLocalizationEntry.config(style = 'entry1.TEntry') self.GIF2SLocalizationEntry.config(textvariable = self.GIF2SLocalizationEntryVar) - self.GIF2SLocalizationEntry.pack(side = TK.LEFT, expand = 1, fill = TK.X, padx = GUI.R()['generateInputFilesPadding']) + self.GIF2SLocalizationEntry.pack(side = TK.LEFT, expand = 1, fill = TK.X, padx = GUI.R('generateInputFilesPadding')) # Lokalizacja - Button self.GIF2SLocalizationButton = TKttk.Button(self.GIF2SLocalizationFrame) self.GIF2SLocalizationButton.config(style = 'button1.TButton') self.GIF2SLocalizationButton.config(text = 'Przeglądaj') self.GIF2SLocalizationButton.config(command = self.GIF2SLocalizationButtonAction) - self.GIF2SLocalizationButton.pack(side = TK.RIGHT, padx = GUI.R()['generateInputFilesPadding']) + self.GIF2SLocalizationButton.pack(side = TK.RIGHT, padx = GUI.R('generateInputFilesPadding')) # Format self.GIF2SFormatFrame = TKttk.Frame(self.GIF2SFrame) self.GIF2SFormatFrame.config(style = 'layoutFrame.TFrame') - self.GIF2SFormatFrame.pack(side = TK.BOTTOM, fill = TK.X, expand = 1, pady = GUI.R()['generateInputFilesPadding']) + self.GIF2SFormatFrame.pack(side = TK.BOTTOM, fill = TK.X, expand = 1, pady = GUI.R('generateInputFilesPadding')) # Format - Label self.GIF2SFormatLabel = TKttk.Label(self.GIF2SFormatFrame) self.GIF2SFormatLabel.config(style = 'label2.TLabel') self.GIF2SFormatLabel.config(text = 'Format') - self.GIF2SFormatLabel.pack(side = TK.LEFT, padx = GUI.R()['generateInputFilesPadding']) + self.GIF2SFormatLabel.pack(side = TK.LEFT, padx = GUI.R('generateInputFilesPadding')) # Format - Combobox self.GIF2SFormatComboboxVar = TK.StringVar() self.GIF2SFormatCombobox = TKttk.Combobox(self.GIF2SFormatFrame) self.GIF2SFormatCombobox.config(style = 'combobox1.TCombobox') - self.GIF2SFormatCombobox.option_add("*TCombobox*Listbox.background", GUI.R()['combobox1ListBoxBackground']) - self.GIF2SFormatCombobox.option_add("*TCombobox*Listbox.foreground", GUI.R()['combobox1ListBoxForeground']) - self.GIF2SFormatCombobox.option_add("*TCombobox*Listbox.selectBackground", GUI.R()['combobox1ListBoxSelectBackground']) - self.GIF2SFormatCombobox.option_add("*TCombobox*Listbox.selectForeground", GUI.R()['combobox1ListBoxSelectForeground']) + self.GIF2SFormatCombobox.option_add("*TCombobox*Listbox.background", GUI.R('combobox1ListBoxBackground')) + self.GIF2SFormatCombobox.option_add("*TCombobox*Listbox.foreground", GUI.R('combobox1ListBoxForeground')) + self.GIF2SFormatCombobox.option_add("*TCombobox*Listbox.selectBackground", GUI.R('combobox1ListBoxSelectBackground')) + self.GIF2SFormatCombobox.option_add("*TCombobox*Listbox.selectForeground", GUI.R('combobox1ListBoxSelectForeground')) self.GIF2SFormatCombobox.config(state = 'readonly') self.GIF2SFormatCombobox.config(textvariable = self.GIF2SFormatComboboxVar) self.GIF2SFormatCombobox['values'] = tuple(FMT.getList()) - self.GIF2SFormatCombobox.pack(side = TK.LEFT, expand = 1, fill = TK.X, padx = GUI.R()['generateInputFilesPadding']) + self.GIF2SFormatCombobox.pack(side = TK.LEFT, expand = 1, fill = TK.X, padx = GUI.R('generateInputFilesPadding')) ######################################### @@ -1293,15 +1083,15 @@ class mainWindow: self.GIF3Frame = TKttk.Frame(self.generateInputFilesFrame) self.GIF3Frame.config(style = 'layoutFrame.TFrame') - self.GIF3Frame.pack(fill = TK.X, expand = 1, pady = int((GUI.R()['GIFFrameSeparators'])/2)) + self.GIF3Frame.pack(fill = TK.X, expand = 1, pady = int((GUI.R('GIFFrameSeparators')/2))) - # "Plik źródłowy (3)" + # "Plik źródłowy (1)" self.GIF3Label = TKttk.Label(self.GIF3Frame) self.GIF3Label.config(style = 'label1.TLabel') - self.GIF3Label.config(width = GUI.R()['generateFilesLabelWidth']) - self.GIF3Label.config(anchor = GUI.R()['generateFilesLabelAnchor']) - self.GIF3Label.config(padding = ('0 0 %s 0' % str(2 * GUI.R()['generateInputFilesPadding']))) - self.GIF3Label.config(text = 'Plik źródłowy (3)') + self.GIF3Label.config(width = GUI.R('generateFilesLabelWidth')) + self.GIF3Label.config(anchor = GUI.R('generateFilesLabelAnchor')) + self.GIF3Label.config(padding = ('0 0 %s 0' % str(2 * GUI.R('generateInputFilesPadding')))) + self.GIF3Label.config(text = 'Plik źródłowy (1)') self.GIF3Label.pack(side = TK.LEFT) # Plik żródłowy (1) - Ustawienia @@ -1312,45 +1102,45 @@ class mainWindow: # Lokalizacja self.GIF3SLocalizationFrame = TKttk.Frame(self.GIF3SFrame) self.GIF3SLocalizationFrame.config(style = 'layoutFrame.TFrame') - self.GIF3SLocalizationFrame.pack(side = TK.TOP, fill = TK.X, expand = 1, pady = GUI.R()['generateInputFilesPadding']) + self.GIF3SLocalizationFrame.pack(side = TK.TOP, fill = TK.X, expand = 1, pady = GUI.R('generateInputFilesPadding')) # Lokalizacja - Entry self.GIF3SLocalizationEntryVar = TK.StringVar() self.GIF3SLocalizationEntry = TKttk.Entry(self.GIF3SLocalizationFrame) self.GIF3SLocalizationEntry.config(style = 'entry1.TEntry') self.GIF3SLocalizationEntry.config(textvariable = self.GIF3SLocalizationEntryVar) - self.GIF3SLocalizationEntry.pack(side = TK.LEFT, expand = 1, fill = TK.X, padx = GUI.R()['generateInputFilesPadding']) + self.GIF3SLocalizationEntry.pack(side = TK.LEFT, expand = 1, fill = TK.X, padx = GUI.R('generateInputFilesPadding')) # Lokalizacja - Button self.GIF3SLocalizationButton = TKttk.Button(self.GIF3SLocalizationFrame) self.GIF3SLocalizationButton.config(style = 'button1.TButton') self.GIF3SLocalizationButton.config(text = 'Przeglądaj') self.GIF3SLocalizationButton.config(command = self.GIF3SLocalizationButtonAction) - self.GIF3SLocalizationButton.pack(side = TK.RIGHT, padx = GUI.R()['generateInputFilesPadding']) + self.GIF3SLocalizationButton.pack(side = TK.RIGHT, padx = GUI.R('generateInputFilesPadding')) # Format self.GIF3SFormatFrame = TKttk.Frame(self.GIF3SFrame) self.GIF3SFormatFrame.config(style = 'layoutFrame.TFrame') - self.GIF3SFormatFrame.pack(side = TK.BOTTOM, fill = TK.X, expand = 1, pady = GUI.R()['generateInputFilesPadding']) + self.GIF3SFormatFrame.pack(side = TK.BOTTOM, fill = TK.X, expand = 1, pady = GUI.R('generateInputFilesPadding')) # Format - Label self.GIF3SFormatLabel = TKttk.Label(self.GIF3SFormatFrame) self.GIF3SFormatLabel.config(style = 'label2.TLabel') self.GIF3SFormatLabel.config(text = 'Format') - self.GIF3SFormatLabel.pack(side = TK.LEFT, padx = GUI.R()['generateInputFilesPadding']) + self.GIF3SFormatLabel.pack(side = TK.LEFT, padx = GUI.R('generateInputFilesPadding')) # Format - Combobox self.GIF3SFormatComboboxVar = TK.StringVar() self.GIF3SFormatCombobox = TKttk.Combobox(self.GIF3SFormatFrame) self.GIF3SFormatCombobox.config(style = 'combobox1.TCombobox') - self.GIF3SFormatCombobox.option_add("*TCombobox*Listbox.background", GUI.R()['combobox1ListBoxBackground']) - self.GIF3SFormatCombobox.option_add("*TCombobox*Listbox.foreground", GUI.R()['combobox1ListBoxForeground']) - self.GIF3SFormatCombobox.option_add("*TCombobox*Listbox.selectBackground", GUI.R()['combobox1ListBoxSelectBackground']) - self.GIF3SFormatCombobox.option_add("*TCombobox*Listbox.selectForeground", GUI.R()['combobox1ListBoxSelectForeground']) + self.GIF3SFormatCombobox.option_add("*TCombobox*Listbox.background", GUI.R('combobox1ListBoxBackground')) + self.GIF3SFormatCombobox.option_add("*TCombobox*Listbox.foreground", GUI.R('combobox1ListBoxForeground')) + self.GIF3SFormatCombobox.option_add("*TCombobox*Listbox.selectBackground", GUI.R('combobox1ListBoxSelectBackground')) + self.GIF3SFormatCombobox.option_add("*TCombobox*Listbox.selectForeground", GUI.R('combobox1ListBoxSelectForeground')) self.GIF3SFormatCombobox.config(state = 'readonly') self.GIF3SFormatCombobox.config(textvariable = self.GIF3SFormatComboboxVar) self.GIF3SFormatCombobox['values'] = tuple(FMT.getList()) - self.GIF3SFormatCombobox.pack(side = TK.LEFT, expand = 1, fill = TK.X, padx = GUI.R()['generateInputFilesPadding']) + self.GIF3SFormatCombobox.pack(side = TK.LEFT, expand = 1, fill = TK.X, padx = GUI.R('generateInputFilesPadding')) ######################################### @@ -1358,15 +1148,15 @@ class mainWindow: self.GIF4Frame = TKttk.Frame(self.generateInputFilesFrame) self.GIF4Frame.config(style = 'layoutFrame.TFrame') - self.GIF4Frame.pack(fill = TK.X, expand = 1, pady = int((GUI.R()['GIFFrameSeparators'])/2)) + self.GIF4Frame.pack(fill = TK.X, expand = 1, pady = int((GUI.R('GIFFrameSeparators')/2))) - # "Plik źródłowy (4)" + # "Plik źródłowy (1)" self.GIF4Label = TKttk.Label(self.GIF4Frame) self.GIF4Label.config(style = 'label1.TLabel') - self.GIF4Label.config(width = GUI.R()['generateFilesLabelWidth']) - self.GIF4Label.config(anchor = GUI.R()['generateFilesLabelAnchor']) - self.GIF4Label.config(padding = ('0 0 %s 0' % str(2 * GUI.R()['generateInputFilesPadding']))) - self.GIF4Label.config(text = 'Plik źródłowy (4)') + self.GIF4Label.config(width = GUI.R('generateFilesLabelWidth')) + self.GIF4Label.config(anchor = GUI.R('generateFilesLabelAnchor')) + self.GIF4Label.config(padding = ('0 0 %s 0' % str(2 * GUI.R('generateInputFilesPadding')))) + self.GIF4Label.config(text = 'Plik źródłowy (1)') self.GIF4Label.pack(side = TK.LEFT) # Plik żródłowy (1) - Ustawienia @@ -1377,45 +1167,45 @@ class mainWindow: # Lokalizacja self.GIF4SLocalizationFrame = TKttk.Frame(self.GIF4SFrame) self.GIF4SLocalizationFrame.config(style = 'layoutFrame.TFrame') - self.GIF4SLocalizationFrame.pack(side = TK.TOP, fill = TK.X, expand = 1, pady = GUI.R()['generateInputFilesPadding']) + self.GIF4SLocalizationFrame.pack(side = TK.TOP, fill = TK.X, expand = 1, pady = GUI.R('generateInputFilesPadding')) # Lokalizacja - Entry self.GIF4SLocalizationEntryVar = TK.StringVar() self.GIF4SLocalizationEntry = TKttk.Entry(self.GIF4SLocalizationFrame) self.GIF4SLocalizationEntry.config(style = 'entry1.TEntry') self.GIF4SLocalizationEntry.config(textvariable = self.GIF4SLocalizationEntryVar) - self.GIF4SLocalizationEntry.pack(side = TK.LEFT, expand = 1, fill = TK.X, padx = GUI.R()['generateInputFilesPadding']) + self.GIF4SLocalizationEntry.pack(side = TK.LEFT, expand = 1, fill = TK.X, padx = GUI.R('generateInputFilesPadding')) # Lokalizacja - Button self.GIF4SLocalizationButton = TKttk.Button(self.GIF4SLocalizationFrame) self.GIF4SLocalizationButton.config(style = 'button1.TButton') self.GIF4SLocalizationButton.config(text = 'Przeglądaj') self.GIF4SLocalizationButton.config(command = self.GIF4SLocalizationButtonAction) - self.GIF4SLocalizationButton.pack(side = TK.RIGHT, padx = GUI.R()['generateInputFilesPadding']) + self.GIF4SLocalizationButton.pack(side = TK.RIGHT, padx = GUI.R('generateInputFilesPadding')) # Format self.GIF4SFormatFrame = TKttk.Frame(self.GIF4SFrame) self.GIF4SFormatFrame.config(style = 'layoutFrame.TFrame') - self.GIF4SFormatFrame.pack(side = TK.BOTTOM, fill = TK.X, expand = 1, pady = GUI.R()['generateInputFilesPadding']) + self.GIF4SFormatFrame.pack(side = TK.BOTTOM, fill = TK.X, expand = 1, pady = GUI.R('generateInputFilesPadding')) # Format - Label self.GIF4SFormatLabel = TKttk.Label(self.GIF4SFormatFrame) self.GIF4SFormatLabel.config(style = 'label2.TLabel') self.GIF4SFormatLabel.config(text = 'Format') - self.GIF4SFormatLabel.pack(side = TK.LEFT, padx = GUI.R()['generateInputFilesPadding']) + self.GIF4SFormatLabel.pack(side = TK.LEFT, padx = GUI.R('generateInputFilesPadding')) # Format - Combobox self.GIF4SFormatComboboxVar = TK.StringVar() self.GIF4SFormatCombobox = TKttk.Combobox(self.GIF4SFormatFrame) self.GIF4SFormatCombobox.config(style = 'combobox1.TCombobox') - self.GIF4SFormatCombobox.option_add("*TCombobox*Listbox.background", GUI.R()['combobox1ListBoxBackground']) - self.GIF4SFormatCombobox.option_add("*TCombobox*Listbox.foreground", GUI.R()['combobox1ListBoxForeground']) - self.GIF4SFormatCombobox.option_add("*TCombobox*Listbox.selectBackground", GUI.R()['combobox1ListBoxSelectBackground']) - self.GIF4SFormatCombobox.option_add("*TCombobox*Listbox.selectForeground", GUI.R()['combobox1ListBoxSelectForeground']) + self.GIF4SFormatCombobox.option_add("*TCombobox*Listbox.background", GUI.R('combobox1ListBoxBackground')) + self.GIF4SFormatCombobox.option_add("*TCombobox*Listbox.foreground", GUI.R('combobox1ListBoxForeground')) + self.GIF4SFormatCombobox.option_add("*TCombobox*Listbox.selectBackground", GUI.R('combobox1ListBoxSelectBackground')) + self.GIF4SFormatCombobox.option_add("*TCombobox*Listbox.selectForeground", GUI.R('combobox1ListBoxSelectForeground')) self.GIF4SFormatCombobox.config(state = 'readonly') self.GIF4SFormatCombobox.config(textvariable = self.GIF4SFormatComboboxVar) self.GIF4SFormatCombobox['values'] = tuple(FMT.getList()) - self.GIF4SFormatCombobox.pack(side = TK.LEFT, expand = 1, fill = TK.X, padx = GUI.R()['generateInputFilesPadding']) + self.GIF4SFormatCombobox.pack(side = TK.LEFT, expand = 1, fill = TK.X, padx = GUI.R('generateInputFilesPadding')) ######################################### @@ -1425,7 +1215,8 @@ class mainWindow: self.generateSeparator1 = TKttk.Separator(self.generateFilesFrame) self.generateSeparator1.config(style = 'separator1.TSeparator') - self.generateSeparator1.pack(fill = TK.X, pady = 10) + self.generateSeparator1.config(orient = TK.HORIZONTAL) + self.generateSeparator1.pack(fill = TK.X, pady = GUI.R('generateHorizontalSeparatorPadY')) ################################################### @@ -1433,19 +1224,19 @@ class mainWindow: self.generateOutputFilesFrame = TKttk.Frame(self.generateFilesFrame) self.generateOutputFilesFrame.config(style = 'layoutFrame.TFrame') - self.generateOutputFilesFrame.pack(fill = TK.X, pady = 10, padx = 12) + self.generateOutputFilesFrame.pack(fill = TK.X, padx = GUI.R('outsidelayoutFramesPadX')) # (3) Poczta ############################ self.GOFMailFrame = TKttk.Frame(self.generateOutputFilesFrame) self.GOFMailFrame.config(style = 'layoutFrame.TFrame') - self.GOFMailFrame.pack(pady = GUI.R()['generateOutputFilesPadding'], fill = TK.X, expand = 1) + self.GOFMailFrame.pack(pady = GUI.R('generateOutputFilesPadding'), fill = TK.X, expand = 1) # "Poczta" self.GOFMailLabel = TKttk.Label(self.GOFMailFrame) self.GOFMailLabel.config(style = 'label1.TLabel') - self.GOFMailLabel.config(width = GUI.R()['generateFilesLabelWidth']) - self.GOFMailLabel.config(anchor = GUI.R()['generateFilesLabelAnchor']) + self.GOFMailLabel.config(width = GUI.R('generateFilesLabelWidth')) + self.GOFMailLabel.config(anchor = GUI.R('generateFilesLabelAnchor')) self.GOFMailLabel.config(text = 'Poczta') self.GOFMailLabel.pack(side = TK.LEFT) @@ -1454,7 +1245,7 @@ class mainWindow: self.GOFMailEntry = TKttk.Entry(self.GOFMailFrame) self.GOFMailEntry.config(style = 'entry1.TEntry') self.GOFMailEntry.config(textvariable = self.GOFMailEntryVar) - self.GOFMailEntry.pack(padx = 2 * GUI.R()['generateOutputFilesPadding'], side = TK.LEFT, fill = TK.X, expand = 1) + self.GOFMailEntry.pack(padx = 2 * GUI.R('generateOutputFilesPadding'), side = TK.LEFT, fill = TK.X, expand = 1) # Plik poczty - Lokalizacja (Button) self.GOFMailButton = TKttk.Button(self.GOFMailFrame) @@ -1469,13 +1260,13 @@ class mainWindow: self.GOFOfficeFrame = TKttk.Frame(self.generateOutputFilesFrame) self.GOFOfficeFrame.config(style = 'layoutFrame.TFrame') - self.GOFOfficeFrame.pack(pady = GUI.R()['generateOutputFilesPadding'], fill = TK.X, expand = 1) + self.GOFOfficeFrame.pack(pady = GUI.R('generateOutputFilesPadding'), fill = TK.X, expand = 1) # "Office" self.GOFOfficeLabel = TKttk.Label(self.GOFOfficeFrame) self.GOFOfficeLabel.config(style = 'label1.TLabel') - self.GOFOfficeLabel.config(width = GUI.R()['generateFilesLabelWidth']) - self.GOFOfficeLabel.config(anchor = GUI.R()['generateFilesLabelAnchor']) + self.GOFOfficeLabel.config(width = GUI.R('generateFilesLabelWidth')) + self.GOFOfficeLabel.config(anchor = GUI.R('generateFilesLabelAnchor')) self.GOFOfficeLabel.config(text = 'Office') self.GOFOfficeLabel.pack(side = TK.LEFT) @@ -1484,7 +1275,7 @@ class mainWindow: self.GOFOfficeEntry = TKttk.Entry(self.GOFOfficeFrame) self.GOFOfficeEntry.config(style = 'entry1.TEntry') self.GOFOfficeEntry.config(textvariable = self.GOFOfficeEntryVar) - self.GOFOfficeEntry.pack(padx = 2 * GUI.R()['generateOutputFilesPadding'], side = TK.LEFT, fill = TK.X, expand = 1) + self.GOFOfficeEntry.pack(padx = 2 * GUI.R('generateOutputFilesPadding'), side = TK.LEFT, fill = TK.X, expand = 1) # Plik office - Lokalizacja (Button) self.GOFOfficeButton = TKttk.Button(self.GOFOfficeFrame) @@ -1503,7 +1294,8 @@ class mainWindow: self.generateSeparator2 = TKttk.Separator(self.generateFrame) self.generateSeparator2.config(style = 'separator1.TSeparator') - self.generateSeparator2.pack(fill = TK.X, pady = 10) + self.generateSeparator2.config(orient = TK.HORIZONTAL) + self.generateSeparator2.pack(fill = TK.X, pady = GUI.R('generateHorizontalSeparatorPadY')) ############################################################# @@ -1511,15 +1303,15 @@ class mainWindow: self.generateButtonsFrame = TKttk.Frame(self.generateFrame) self.generateButtonsFrame.config(style = 'layoutFrame.TFrame') - self.generateButtonsFrame.pack(fill = TK.X, pady = 10, padx = 12) + self.generateButtonsFrame.pack(fill = TK.X, padx = GUI.R('outsidelayoutFramesPadX')) # Przycisk "START" self.generateStartButton = TKttk.Button(self.generateButtonsFrame) self.generateStartButton.config(style = 'button1.TButton') - self.generateStartButton.config(padding = 10) + self.generateStartButton.config(padding = GUI.R('generateStartButtonPadding')) self.generateStartButton.config(text = 'START') self.generateStartButton.config(command = self.generateStartButtonAction) - self.generateStartButton.pack(side = TK.LEFT, fill = TK.X, expand = 1) + self.generateStartButton.pack(side = TK.LEFT, fill = TK.X, expand = 1, pady = GUI.R('generateStartButtonPadY')) ############################################################## @@ -1532,8 +1324,8 @@ class mainWindow: self.formatTab = TKttk.Frame(self.mainMenu) self.formatTab.config(style = "mainMenuTabFrame.TFrame") - self.formatTabImg = PLimg.open(GUI.R()['formatTabIcon']) - self.formatTabImg = self.formatTabImg.resize((GUI.R()['tabIconsSize'], GUI.R()['tabIconsSize']), PLimg.ANTIALIAS) + self.formatTabImg = PLimg.open(GUI.R('formatTabIcon')) + self.formatTabImg = self.formatTabImg.resize((GUI.R('tabIconsSize'), GUI.R('tabIconsSize')), PLimg.ANTIALIAS) self.formatTabImg = PLitk.PhotoImage(self.formatTabImg) self.mainMenu.add(self.formatTab, image = self.formatTabImg, state = TK.NORMAL) @@ -1542,20 +1334,20 @@ class mainWindow: self.formatHeader = TKttk.Label(self.formatTab) self.formatHeader.config(style = 'tabHeader.TLabel') self.formatHeader.config(text = 'FORMAT DANYCH') - self.formatHeader.pack(fill = TK.X) + self.formatHeader.pack(fill = GUI.R('headerFill')) # Zawartość self.formatFrame = TKttk.Frame(self.formatTab) - self.formatFrame.config(style = 'tabFrame.TFrame') - self.formatFrame.pack(fill = TK.BOTH, expand = 1, padx = GUI.R()['tabFramePadding'], pady = GUI.R()['tabFramePadding']) - + self.formatFrame.config(style = 'contentTabFrame.TFrame') + self.formatFrame.pack(fill = GUI.R('contentTabFrameFill'), expand = GUI.R('contentTabFrameExpand'), padx = GUI.R('tabFramePadding'), pady = GUI.R('tabFramePadding')) + # (1) Ładowanie presetu ##################################### self.loadingPresetFrame = TKttk.Frame(self.formatFrame) self.loadingPresetFrame.config(style = 'layoutFrame.TFrame') - self.loadingPresetFrame.pack(fill = TK.X, side = TK.TOP, pady = 5, padx = 10) + self.loadingPresetFrame.pack(fill = TK.X, side = TK.TOP, padx = GUI.R('outsidelayoutFramesPadX'))#, pady = 5, padx = 10) # "Wybierz preset do edycji lub wpisz nazwę nowego" self.loadingListLabel = TKttk.Label(self.loadingPresetFrame) @@ -1568,18 +1360,18 @@ class mainWindow: self.loadingList = TKttk.Combobox(self.loadingPresetFrame) self.loadingList.config(textvariable = self.loadingListVar) self.loadingList.config(style = 'combobox2.TCombobox') - self.loadingList.option_add("*TCombobox*Listbox.background", GUI.R()['combobox2ListBoxBackground']) - self.loadingList.option_add("*TCombobox*Listbox.foreground", GUI.R()['combobox2ListBoxForeground']) - self.loadingList.option_add("*TCombobox*Listbox.selectBackground", GUI.R()['combobox2ListBoxSelectBackground']) - self.loadingList.option_add("*TCombobox*Listbox.selectForeground", GUI.R()['combobox2ListBoxSelectForeground']) - self.loadingList.pack(side = TK.LEFT, padx = GUI.R()['loadingListPadX'], fill = TK.X, expand = 1) + self.loadingList.option_add("*TCombobox*Listbox.background", GUI.R('combobox2ListBoxBackground')) + self.loadingList.option_add("*TCombobox*Listbox.foreground", GUI.R('combobox2ListBoxForeground')) + self.loadingList.option_add("*TCombobox*Listbox.selectBackground", GUI.R('combobox2ListBoxSelectBackground')) + self.loadingList.option_add("*TCombobox*Listbox.selectForeground", GUI.R('combobox2ListBoxSelectForeground')) + self.loadingList.pack(side = TK.LEFT, padx = GUI.R('loadingListPadX'), fill = TK.X, expand = 1) self.loadingList['values'] = tuple(FMT.getList()) # Przycisk "WCZYTAJ" self.loadingButton = TKttk.Button(self.loadingPresetFrame) self.loadingButton.config(style = 'button1.TButton') self.loadingButton.config(command = self.loadingButtonAction) - self.loadingButton.config(width = GUI.R()['loadingButtonWidth']) + self.loadingButton.config(width = GUI.R('loadingButtonWidth')) self.loadingButton.config(text = 'WCZYTAJ') self.loadingButton.pack(side = TK.RIGHT) @@ -1590,7 +1382,7 @@ class mainWindow: self.formatSeparator1 = TKttk.Separator(self.formatFrame) self.formatSeparator1.config(style = 'separator1.TSeparator') self.formatSeparator1.config(orient = TK.HORIZONTAL) - self.formatSeparator1.pack(fill = TK.X, pady = 10) + self.formatSeparator1.pack(fill = TK.X, pady = GUI.R('formatHorizontalSeparatorPadY')) ############################################################# @@ -1598,8 +1390,8 @@ class mainWindow: self.editingPresetFrame = TKttk.Frame(self.formatFrame) self.editingPresetFrame.config(style = 'layoutFrame.TFrame') - self.editingPresetFrame.pack(fill = TK.BOTH, expand = 1, padx = 10) - + self.editingPresetFrame.pack(fill = TK.BOTH, expand = 1, padx = GUI.R('outsidelayoutFramesPadX')) + # (2) Ustawienia ################################## self.editingPresetSettingsFrame = TKttk.Frame(self.editingPresetFrame) @@ -1611,18 +1403,18 @@ class mainWindow: self.editingPresetOSFrame = TKttk.Frame(self.editingPresetSettingsFrame) self.editingPresetOSFrame.config(style = 'layoutFrame.TFrame') self.editingPresetOSFrame.pack(fill = TK.BOTH, expand = 1, side = TK.LEFT) - + # (5) Typ osoby ############### self.EPOSTypeFrame = TKttk.Frame(self.editingPresetOSFrame) self.EPOSTypeFrame.config(style = 'layoutFrame.TFrame') - self.EPOSTypeFrame.pack(fill = TK.X, expand = 1, pady = 5) + self.EPOSTypeFrame.pack(fill = TK.X, expand = 1, pady = GUI.R('EPOSTypeFramePadY')) # "Typ osoby" self.EPOSTypeLabel = TKttk.Label(self.EPOSTypeFrame) self.EPOSTypeLabel.config(style = 'label1.TLabel') - self.EPOSTypeLabel.config(width = GUI.R()['EPOSLabelWidth']) - self.EPOSTypeLabel.config(anchor = GUI.R()['EPOSLabelAnchor']) + self.EPOSTypeLabel.config(width = GUI.R('EPOSLabelWidth')) + self.EPOSTypeLabel.config(anchor = GUI.R('EPOSLabelAnchor')) self.EPOSTypeLabel.config(text = 'Typ osoby') self.EPOSTypeLabel.pack(side = TK.LEFT) @@ -1630,11 +1422,11 @@ class mainWindow: self.EPOSTypeVar = TK.BooleanVar(value = True) self.EPOSTypeStudentRadiobutton = TK.Radiobutton(self.EPOSTypeFrame) - self.EPOSTypeStudentRadiobutton.config(background = GUI.R()['radiobutton1Background']) - self.EPOSTypeStudentRadiobutton.config(foreground = GUI.R()['radiobutton1TextColor']) - self.EPOSTypeStudentRadiobutton.config(selectcolor = GUI.R()['radiobutton1IndicatorBackground']) - self.EPOSTypeStudentRadiobutton.config(activebackground = GUI.R()['radiobutton1Background']) - self.EPOSTypeStudentRadiobutton.config(activeforeground = GUI.R()['radiobutton1TextColor']) + self.EPOSTypeStudentRadiobutton.config(background = GUI.R('radiobutton1Background')) + self.EPOSTypeStudentRadiobutton.config(foreground = GUI.R('radiobutton1TextColor')) + self.EPOSTypeStudentRadiobutton.config(selectcolor = GUI.R('radiobutton1IndicatorBackground')) + self.EPOSTypeStudentRadiobutton.config(activebackground = GUI.R('radiobutton1Background')) + self.EPOSTypeStudentRadiobutton.config(activeforeground = GUI.R('radiobutton1TextColor')) self.EPOSTypeStudentRadiobutton.config(variable = self.EPOSTypeVar) self.EPOSTypeStudentRadiobutton.config(value = True) self.EPOSTypeStudentRadiobutton.config(state = TK.DISABLED) @@ -1642,11 +1434,11 @@ class mainWindow: self.EPOSTypeStudentRadiobutton.pack(side = TK.RIGHT, fill = TK.X, expand = 1) self.EPOSTypeTeacherRadiobutton = TK.Radiobutton(self.EPOSTypeFrame) - self.EPOSTypeTeacherRadiobutton.config(background = GUI.R()['radiobutton1Background']) - self.EPOSTypeTeacherRadiobutton.config(foreground = GUI.R()['radiobutton1TextColor']) - self.EPOSTypeTeacherRadiobutton.config(selectcolor = GUI.R()['radiobutton1IndicatorBackground']) - self.EPOSTypeTeacherRadiobutton.config(activebackground = GUI.R()['radiobutton1Background']) - self.EPOSTypeTeacherRadiobutton.config(activeforeground = GUI.R()['radiobutton1TextColor']) + self.EPOSTypeTeacherRadiobutton.config(background = GUI.R('radiobutton1Background')) + self.EPOSTypeTeacherRadiobutton.config(foreground = GUI.R('radiobutton1TextColor')) + self.EPOSTypeTeacherRadiobutton.config(selectcolor = GUI.R('radiobutton1IndicatorBackground')) + self.EPOSTypeTeacherRadiobutton.config(activebackground = GUI.R('radiobutton1Background')) + self.EPOSTypeTeacherRadiobutton.config(activeforeground = GUI.R('radiobutton1TextColor')) self.EPOSTypeTeacherRadiobutton.config(variable = self.EPOSTypeVar) self.EPOSTypeTeacherRadiobutton.config(value = False) self.EPOSTypeTeacherRadiobutton.config(state = TK.DISABLED) @@ -1659,13 +1451,13 @@ class mainWindow: self.EPOSPersonSeparatorFrame = TKttk.Frame(self.editingPresetOSFrame) self.EPOSPersonSeparatorFrame.config(style = 'layoutFrame.TFrame') - self.EPOSPersonSeparatorFrame.pack(fill = TK.X, expand = 1, pady = 5) + self.EPOSPersonSeparatorFrame.pack(fill = TK.X, expand = 1, pady = GUI.R('EPOSPersonSeparatorFramePadY')) # "Separator pomiędzy osobami" self.EPOSPersonSeparatorLabel = TKttk.Label(self.EPOSPersonSeparatorFrame) self.EPOSPersonSeparatorLabel.config(style = 'label1.TLabel') - self.EPOSPersonSeparatorLabel.config(width = GUI.R()['EPOSLabelWidth']) - self.EPOSPersonSeparatorLabel.config(anchor = GUI.R()['EPOSLabelAnchor']) + self.EPOSPersonSeparatorLabel.config(width = GUI.R('EPOSLabelWidth')) + self.EPOSPersonSeparatorLabel.config(anchor = GUI.R('EPOSLabelAnchor')) self.EPOSPersonSeparatorLabel.config(text = 'Separator pomiędzy osobami') self.EPOSPersonSeparatorLabel.pack(side = TK.LEFT) @@ -1675,7 +1467,6 @@ class mainWindow: self.EPOSPersonSeparatorEntry.config(style = 'entry1.TEntry') self.EPOSPersonSeparatorEntry.config(textvariable = self.EPOSPersonSeparatorVar) self.EPOSPersonSeparatorEntry.config(state = TK.DISABLED) - self.EPOSPersonSeparatorEntry.config(width = GUI.R()['EPOSPersonSeparatorEntryWidth']) self.EPOSPersonSeparatorEntry.pack(side = TK.RIGHT, fill = TK.X, expand = 1) ##################### @@ -1684,13 +1475,13 @@ class mainWindow: self.EPOSRowSeparatorFrame = TKttk.Frame(self.editingPresetOSFrame) self.EPOSRowSeparatorFrame.config(style = 'layoutFrame.TFrame') - self.EPOSRowSeparatorFrame.pack(fill = TK.X, expand = 1, pady = 5) + self.EPOSRowSeparatorFrame.pack(fill = TK.X, expand = 1, pady = GUI.R('EPOSRowSeparatorFramePadY')) # "Separator pomiędzy wierszami" self.EPOSRowSeparatorLabel = TKttk.Label(self.EPOSRowSeparatorFrame) self.EPOSRowSeparatorLabel.config(style = 'label1.TLabel') - self.EPOSRowSeparatorLabel.config(width = GUI.R()['EPOSLabelWidth']) - self.EPOSRowSeparatorLabel.config(anchor = GUI.R()['EPOSLabelAnchor']) + self.EPOSRowSeparatorLabel.config(width = GUI.R('EPOSLabelWidth')) + self.EPOSRowSeparatorLabel.config(anchor = GUI.R('EPOSLabelAnchor')) self.EPOSRowSeparatorLabel.config(text = 'Separator pomiędzy wierszami') self.EPOSRowSeparatorLabel.pack(side = TK.LEFT) @@ -1700,7 +1491,6 @@ class mainWindow: self.EPOSRowSeparatorEntry.config(style = 'entry1.TEntry') self.EPOSRowSeparatorEntry.config(textvariable = self.EPOSRowSeparatorVar) self.EPOSRowSeparatorEntry.config(state = TK.DISABLED) - self.EPOSRowSeparatorEntry.config(width = GUI.R()['EPOSRowSeparatorEntryWidth']) self.EPOSRowSeparatorEntry.pack(side = TK.RIGHT, fill = TK.X, expand = 1) ##################### @@ -1709,63 +1499,63 @@ class mainWindow: self.EPOSDataSeparatorFrame = TKttk.Frame(self.editingPresetOSFrame) self.EPOSDataSeparatorFrame.config(style = 'layoutFrame.TFrame') - self.EPOSDataSeparatorFrame.pack(fill = TK.BOTH, expand = 1, pady = 5) + self.EPOSDataSeparatorFrame.pack(fill = TK.BOTH, expand = 1, pady = GUI.R('EPOSDataSeparatorFramePadY')) # "Separatory pomiędzy danymi" self.EPOSDataSeparatorLabel = TKttk.Label(self.EPOSDataSeparatorFrame) self.EPOSDataSeparatorLabel.config(style = 'label1.TLabel') - self.EPOSDataSeparatorLabel.config(width = GUI.R()['EPOSLabelWidth']) - self.EPOSDataSeparatorLabel.config(anchor = GUI.R()['EPOSLabelAnchor']) + self.EPOSDataSeparatorLabel.config(width = GUI.R('EPOSLabelWidth')) + self.EPOSDataSeparatorLabel.config(anchor = GUI.R('EPOSLabelAnchor')) self.EPOSDataSeparatorLabel.config(text = 'Separatory pomiędzy danymi') self.EPOSDataSeparatorLabel.pack(side = TK.LEFT) # Entry - Separator pomiedzy wierszami self.EPOSDataSeparatorText = TK.Text(self.EPOSDataSeparatorFrame) self.EPOSDataSeparatorText.config(state = TK.DISABLED) - self.EPOSDataSeparatorText.config(background = GUI.R()['text1Background']) - self.EPOSDataSeparatorText.config(foreground = GUI.R()['text1TextColor']) - self.EPOSDataSeparatorText.config(relief = GUI.R()['text1Relief']) + self.EPOSDataSeparatorText.config(background = GUI.R('text1Background')) + self.EPOSDataSeparatorText.config(foreground = GUI.R('text1TextColor')) + self.EPOSDataSeparatorText.config(relief = GUI.R('text1Relief')) self.EPOSDataSeparatorText.pack(side = TK.TOP, fill = TK.BOTH) ##################### - + ############################### - # (4) Separator 2 ############# + # (5) Separator 2 ############# self.formatSeparator2 = TKttk.Separator(self.editingPresetSettingsFrame) self.formatSeparator2.config(style = 'separator1.TSeparator') self.formatSeparator2.config(orient = TK.VERTICAL) - self.formatSeparator2.pack(fill = TK.Y, padx = 12, expand = 1, side = TK.LEFT) + self.formatSeparator2.pack(fill = TK.Y, padx = GUI.R('formatVerticalSeparatorPadY'), side = TK.LEFT) ############################### - # (4) Lokalizacja danych ###### + # (5) Lokalizacja danych ###### self.editingPresetDLFrame = TKttk.Frame(self.editingPresetSettingsFrame) self.editingPresetDLFrame.config(style = 'layoutFrame.TFrame') self.editingPresetDLFrame.pack(fill = TK.BOTH, side = TK.RIGHT) self.editingPresetDLFrame.grid_columnconfigure(1, weight = 1) self.editingPresetDLFrame.grid_columnconfigure(2, weight = 1) - + # C1 - "Wiersz" self.EPDLC1Label = TKttk.Label(self.editingPresetDLFrame) self.EPDLC1Label.config(style = 'label1.TLabel') self.EPDLC1Label.config(text = 'Wiersz') - self.EPDLC1Label.grid(row = 0, column = 1, padx = GUI.R()['EPDataLocalizationPadX'], pady = GUI.R()['EPDataLocalizationPadY']) + self.EPDLC1Label.grid(row = 0, column = 1, padx = GUI.R('EPDataLocalizationPadX'), pady = GUI.R('EPDataLocalizationPadY')) # C2 - "Pozycja w wierszu" self.EPDLC2Label = TKttk.Label(self.editingPresetDLFrame) self.EPDLC2Label.config(style = 'label1.TLabel') self.EPDLC2Label.config(justify = TK.CENTER) self.EPDLC2Label.config(text = 'Pozycja\nw wierszu') - self.EPDLC2Label.grid(row = 0, column = 2, padx = GUI.R()['EPDataLocalizationPadX'], pady = GUI.R()['EPDataLocalizationPadY']) + self.EPDLC2Label.grid(row = 0, column = 2, padx = GUI.R('EPDataLocalizationPadX'), pady = GUI.R('EPDataLocalizationPadY')) # W1 - "Login" self.EPDLW1Label = TKttk.Label(self.editingPresetDLFrame) self.EPDLW1Label.config(style = 'label1.TLabel') self.EPDLW1Label.config(text = 'Login') - self.EPDLW1Label.grid(row = 1, column = 0, padx = GUI.R()['EPDataLocalizationPadX'], pady = GUI.R()['EPDataLocalizationPadY']) + self.EPDLW1Label.grid(row = 1, column = 0, padx = GUI.R('EPDataLocalizationPadX'), pady = GUI.R('EPDataLocalizationPadY')) # Lokalizacja loginu (wiersz) self.EPDLLoginRowVar = TK.IntVar() @@ -1775,7 +1565,7 @@ class mainWindow: self.EPDLLoginRowSpinbox.config(to = 1000000) self.EPDLLoginRowSpinbox.config(state = TK.DISABLED) self.EPDLLoginRowSpinbox.config(style = 'spinbox1.TSpinbox') - self.EPDLLoginRowSpinbox.grid(row = 1, column = 1, padx = GUI.R()['EPDataLocalizationPadX'], pady = GUI.R()['EPDataLocalizationPadY']) + self.EPDLLoginRowSpinbox.grid(row = 1, column = 1, padx = GUI.R('EPDataLocalizationPadX'), pady = GUI.R('EPDataLocalizationPadY')) # Lokalizacja loginu (pozycja w wierszu) self.EPDLLoginPosInRowVar = TK.IntVar() @@ -1785,13 +1575,13 @@ class mainWindow: self.EPDLLoginPosInRowSpinbox.config(to = 1000000) self.EPDLLoginPosInRowSpinbox.config(state = TK.DISABLED) self.EPDLLoginPosInRowSpinbox.config(style = 'spinbox1.TSpinbox') - self.EPDLLoginPosInRowSpinbox.grid(row = 1, column = 2, padx = GUI.R()['EPDataLocalizationPadX'], pady = GUI.R()['EPDataLocalizationPadY']) + self.EPDLLoginPosInRowSpinbox.grid(row = 1, column = 2, padx = GUI.R('EPDataLocalizationPadX'), pady = GUI.R('EPDataLocalizationPadY')) # W2 - "Imię" self.EPDLW2Label = TKttk.Label(self.editingPresetDLFrame) self.EPDLW2Label.config(style = 'label1.TLabel') self.EPDLW2Label.config(text = 'Imię') - self.EPDLW2Label.grid(row = 2, column = 0, padx = GUI.R()['EPDataLocalizationPadX'], pady = GUI.R()['EPDataLocalizationPadY']) + self.EPDLW2Label.grid(row = 2, column = 0, padx = GUI.R('EPDataLocalizationPadX'), pady = GUI.R('EPDataLocalizationPadY')) # Lokalizacja imienia (wiersz) self.EPDLFnameRowVar = TK.IntVar() @@ -1801,7 +1591,7 @@ class mainWindow: self.EPDLFnameRowSpinbox.config(to = 1000000) self.EPDLFnameRowSpinbox.config(state = TK.DISABLED) self.EPDLFnameRowSpinbox.config(style = 'spinbox1.TSpinbox') - self.EPDLFnameRowSpinbox.grid(row = 2, column = 1, padx = GUI.R()['EPDataLocalizationPadX'], pady = GUI.R()['EPDataLocalizationPadY']) + self.EPDLFnameRowSpinbox.grid(row = 2, column = 1, padx = GUI.R('EPDataLocalizationPadX'), pady = GUI.R('EPDataLocalizationPadY')) # Lokalizacja imienia (pozycja w wierszu) self.EPDLFnamePosInRowVar = TK.IntVar() @@ -1811,13 +1601,13 @@ class mainWindow: self.EPDLFnamePosInRowSpinbox.config(to = 1000000) self.EPDLFnamePosInRowSpinbox.config(state = TK.DISABLED) self.EPDLFnamePosInRowSpinbox.config(style = 'spinbox1.TSpinbox') - self.EPDLFnamePosInRowSpinbox.grid(row = 2, column = 2, padx = GUI.R()['EPDataLocalizationPadX'], pady = GUI.R()['EPDataLocalizationPadY']) + self.EPDLFnamePosInRowSpinbox.grid(row = 2, column = 2, padx = GUI.R('EPDataLocalizationPadX'), pady = GUI.R('EPDataLocalizationPadY')) # W3 - "Nazwisko" self.EPDLW3Label = TKttk.Label(self.editingPresetDLFrame) self.EPDLW3Label.config(style = 'label1.TLabel') self.EPDLW3Label.config(text = 'Nazwisko') - self.EPDLW3Label.grid(row = 3, column = 0, padx = GUI.R()['EPDataLocalizationPadX'], pady = GUI.R()['EPDataLocalizationPadY']) + self.EPDLW3Label.grid(row = 3, column = 0, padx = GUI.R('EPDataLocalizationPadX'), pady = GUI.R('EPDataLocalizationPadY')) # Lokalizacja nazwiska (wiersz) self.EPDLLnameRowVar = TK.IntVar() @@ -1827,7 +1617,7 @@ class mainWindow: self.EPDLLnameRowSpinbox.config(to = 1000000) self.EPDLLnameRowSpinbox.config(state = TK.DISABLED) self.EPDLLnameRowSpinbox.config(style = 'spinbox1.TSpinbox') - self.EPDLLnameRowSpinbox.grid(row = 3, column = 1, padx = GUI.R()['EPDataLocalizationPadX'], pady = GUI.R()['EPDataLocalizationPadY']) + self.EPDLLnameRowSpinbox.grid(row = 3, column = 1, padx = GUI.R('EPDataLocalizationPadX'), pady = GUI.R('EPDataLocalizationPadY')) # Lokalizacja nazwiska (pozycja w wierszu) self.EPDLLnamePosInRowVar = TK.IntVar() @@ -1837,13 +1627,13 @@ class mainWindow: self.EPDLLnamePosInRowSpinbox.config(to = 1000000) self.EPDLLnamePosInRowSpinbox.config(state = TK.DISABLED) self.EPDLLnamePosInRowSpinbox.config(style = 'spinbox1.TSpinbox') - self.EPDLLnamePosInRowSpinbox.grid(row = 3, column = 2, padx = GUI.R()['EPDataLocalizationPadX'], pady = GUI.R()['EPDataLocalizationPadY']) + self.EPDLLnamePosInRowSpinbox.grid(row = 3, column = 2, padx = GUI.R('EPDataLocalizationPadX'), pady = GUI.R('EPDataLocalizationPadY')) # W4 - "Szkoła" self.EPDLW4Label = TKttk.Label(self.editingPresetDLFrame) self.EPDLW4Label.config(style = 'label1.TLabel') self.EPDLW4Label.config(text = 'Szkoła') - self.EPDLW4Label.grid(row = 4, column = 0, padx = GUI.R()['EPDataLocalizationPadX'], pady = GUI.R()['EPDataLocalizationPadY']) + self.EPDLW4Label.grid(row = 4, column = 0, padx = GUI.R('EPDataLocalizationPadX'), pady = GUI.R('EPDataLocalizationPadY')) # Lokalizacja nazwiska (wiersz) self.EPDLSchoolRowVar = TK.IntVar() @@ -1853,7 +1643,7 @@ class mainWindow: self.EPDLSchoolRowSpinbox.config(to = 1000000) self.EPDLSchoolRowSpinbox.config(state = TK.DISABLED) self.EPDLSchoolRowSpinbox.config(style = 'spinbox1.TSpinbox') - self.EPDLSchoolRowSpinbox.grid(row = 4, column = 1, padx = GUI.R()['EPDataLocalizationPadX'], pady = GUI.R()['EPDataLocalizationPadY']) + self.EPDLSchoolRowSpinbox.grid(row = 4, column = 1, padx = GUI.R('EPDataLocalizationPadX'), pady = GUI.R('EPDataLocalizationPadY')) # Lokalizacja nazwiska (pozycja w wierszu) self.EPDLSchoolPosInRowVar = TK.IntVar() @@ -1863,13 +1653,13 @@ class mainWindow: self.EPDLSchoolPosInRowSpinbox.config(to = 1000000) self.EPDLSchoolPosInRowSpinbox.config(state = TK.DISABLED) self.EPDLSchoolPosInRowSpinbox.config(style = 'spinbox1.TSpinbox') - self.EPDLSchoolPosInRowSpinbox.grid(row = 4, column = 2, padx = GUI.R()['EPDataLocalizationPadX'], pady = GUI.R()['EPDataLocalizationPadY']) + self.EPDLSchoolPosInRowSpinbox.grid(row = 4, column = 2, padx = GUI.R('EPDataLocalizationPadX'), pady = GUI.R('EPDataLocalizationPadY')) # W5 - "Klasa" self.EPDLW5Label = TKttk.Label(self.editingPresetDLFrame) self.EPDLW5Label.config(style = 'label1.TLabel') self.EPDLW5Label.config(text = 'Klasa') - self.EPDLW5Label.grid(row = 5, column = 0, padx = GUI.R()['EPDataLocalizationPadX'], pady = GUI.R()['EPDataLocalizationPadY']) + self.EPDLW5Label.grid(row = 5, column = 0, padx = GUI.R('EPDataLocalizationPadX'), pady = GUI.R('EPDataLocalizationPadY')) # Lokalizacja nazwiska (wiersz) self.EPDLClassRowVar = TK.IntVar() @@ -1879,7 +1669,7 @@ class mainWindow: self.EPDLClassRowSpinbox.config(to = 1000000) self.EPDLClassRowSpinbox.config(state = TK.DISABLED) self.EPDLClassRowSpinbox.config(style = 'spinbox1.TSpinbox') - self.EPDLClassRowSpinbox.grid(row = 5, column = 1, padx = GUI.R()['EPDataLocalizationPadX'], pady = GUI.R()['EPDataLocalizationPadY']) + self.EPDLClassRowSpinbox.grid(row = 5, column = 1, padx = GUI.R('EPDataLocalizationPadX'), pady = GUI.R('EPDataLocalizationPadY')) # Lokalizacja nazwiska (pozycja w wierszu) self.EPDLClassPosInRowVar = TK.IntVar() @@ -1889,20 +1679,20 @@ class mainWindow: self.EPDLClassPosInRowSpinbox.config(to = 1000000) self.EPDLClassPosInRowSpinbox.config(state = TK.DISABLED) self.EPDLClassPosInRowSpinbox.config(style = 'spinbox1.TSpinbox') - self.EPDLClassPosInRowSpinbox.grid(row = 5, column = 2, padx = GUI.R()['EPDataLocalizationPadX'], pady = GUI.R()['EPDataLocalizationPadY']) + self.EPDLClassPosInRowSpinbox.grid(row = 5, column = 2, padx = GUI.R('EPDataLocalizationPadX'), pady = GUI.R('EPDataLocalizationPadY')) ############################### ######################################### ################################################### - + # (1) Separator 3 ########################################### self.formatSeparator3 = TKttk.Separator(self.formatFrame) self.formatSeparator3.config(style = 'separator1.TSeparator') self.formatSeparator3.config(orient = TK.HORIZONTAL) - self.formatSeparator3.pack(fill = TK.X, expand = 1, pady = 6) + self.formatSeparator3.pack(fill = TK.X, pady = GUI.R('formatHorizontalSeparatorPadY')) ############################################################# @@ -1910,14 +1700,14 @@ class mainWindow: self.editingPresetButtonsFrame = TKttk.Frame(self.formatFrame) self.editingPresetButtonsFrame.config(style = 'layoutFrame.TFrame') - self.editingPresetButtonsFrame.pack(fill = TK.X, expand = 1, side = TK.BOTTOM) + self.editingPresetButtonsFrame.pack(fill = TK.X, side = TK.BOTTOM, pady = GUI.R('editingPresetButtonsPadY')) # Przycisk 'ZAPISZ' self.editingPresetSaveButton = TKttk.Button(self.editingPresetButtonsFrame) self.editingPresetSaveButton.config(command = self.editingPresetSaveButtonAction) self.editingPresetSaveButton.config(state = TK.DISABLED) self.editingPresetSaveButton.config(style = 'button1.TButton') - self.editingPresetSaveButton.config(width = GUI.R()['editingPresetSaveButtonWidth']) + self.editingPresetSaveButton.config(width = GUI.R('editingPresetSaveButtonWidth')) self.editingPresetSaveButton.config(text = 'ZAPISZ') self.editingPresetSaveButton.pack(side = TK.LEFT, expand = 1) @@ -1926,7 +1716,7 @@ class mainWindow: self.editingPresetCancelButton.config(command = self.editingPresetCancelButtonAction) self.editingPresetCancelButton.config(state = TK.DISABLED) self.editingPresetCancelButton.config(style = 'button1.TButton') - self.editingPresetCancelButton.config(width = GUI.R()['editingPresetCancelButtonWidth']) + self.editingPresetCancelButton.config(width = GUI.R('editingPresetCancelButtonWidth')) self.editingPresetCancelButton.config(text = 'Anuluj') self.editingPresetCancelButton.pack(side = TK.RIGHT, expand = 1) @@ -1941,8 +1731,8 @@ class mainWindow: self.settingsTab = TKttk.Frame(self.mainMenu) self.settingsTab.config(style = "mainMenuTabFrame.TFrame") - self.settingsTabImg = PLimg.open(GUI.R()['settingsTabIcon']) - self.settingsTabImg = self.settingsTabImg.resize((GUI.R()['tabIconsSize'], GUI.R()['tabIconsSize']), PLimg.ANTIALIAS) + self.settingsTabImg = PLimg.open(GUI.R('settingsTabIcon')) + self.settingsTabImg = self.settingsTabImg.resize((GUI.R('tabIconsSize'), GUI.R('tabIconsSize')), PLimg.ANTIALIAS) self.settingsTabImg = PLitk.PhotoImage(self.settingsTabImg) self.mainMenu.add(self.settingsTab, image = self.settingsTabImg, state = TK.NORMAL) @@ -1951,13 +1741,13 @@ class mainWindow: self.settingsHeader = TKttk.Label(self.settingsTab) self.settingsHeader.config(style = 'tabHeader.TLabel') self.settingsHeader.config(text = 'USTAWIENIA') - self.settingsHeader.pack(fill = TK.X) + self.settingsHeader.pack(fill = GUI.R('headerFill')) # Zawartość self.settingsFrame = TKttk.Frame(self.settingsTab) - self.settingsFrame.config(style = 'tabFrame.TFrame') - self.settingsFrame.pack(fill = TK.BOTH, expand = 1, padx = GUI.R()['tabFramePadding'], pady = GUI.R()['tabFramePadding']) + self.settingsFrame.config(style = 'contentTabFrame.TFrame') + self.settingsFrame.pack(fill = GUI.R('contentTabFrameFill'), expand = GUI.R('contentTabFrameExpand'), padx = GUI.R('tabFramePadding'), pady = GUI.R('tabFramePadding')) ###################################################################### @@ -1968,8 +1758,8 @@ class mainWindow: self.aboutTab = TKttk.Frame(self.mainMenu) self.aboutTab.config(style = "mainMenuTabFrame.TFrame") - self.aboutTabImg = PLimg.open(GUI.R()['aboutTabIcon']) - self.aboutTabImg = self.aboutTabImg.resize((GUI.R()['tabIconsSize'], GUI.R()['tabIconsSize']), PLimg.ANTIALIAS) + self.aboutTabImg = PLimg.open(GUI.R('aboutTabIcon')) + self.aboutTabImg = self.aboutTabImg.resize((GUI.R('tabIconsSize'), GUI.R('tabIconsSize')), PLimg.ANTIALIAS) self.aboutTabImg = PLitk.PhotoImage(self.aboutTabImg) self.mainMenu.add(self.aboutTab, image = self.aboutTabImg, state = TK.NORMAL) @@ -1978,16 +1768,16 @@ class mainWindow: self.aboutHeader = TKttk.Label(self.aboutTab) self.aboutHeader.config(style = 'tabHeader.TLabel') self.aboutHeader.config(text = 'O PROGRAMIE') - self.aboutHeader.pack(fill = TK.X) + self.aboutHeader.pack(fill = GUI.R('headerFill')) # Zawartość self.aboutFrame = TKttk.Frame(self.aboutTab) - self.aboutFrame.config(style = 'tabFrame.TFrame') - self.aboutFrame.pack(fill = TK.BOTH, expand = 1, padx = GUI.R()['tabFramePadding'], pady = GUI.R()['tabFramePadding']) + self.aboutFrame.config(style = 'contentTabFrame.TFrame') + self.aboutFrame.pack(fill = GUI.R('contentTabFrameFill'), expand = GUI.R('contentTabFrameExpand'), padx = GUI.R('tabFramePadding'), pady = GUI.R('tabFramePadding')) ###################################################################### - + # Akcje przycisków - TAB1 diff --git a/assets/icon.ico b/icon.ico similarity index 100% rename from assets/icon.ico rename to icon.ico