From 066e1f6a17361c1c1b32540ba37ed9277ea0ac91 Mon Sep 17 00:00:00 2001 From: Mateusz Skoczek Date: Tue, 1 Sep 2020 19:15:30 +0200 Subject: [PATCH] 4.0 Beta (Build 20245) --- configs/config.cfg | 6 +- configs/style.cfg | 5 + dev-changelog.txt | 13 +- documentation/about_program.html | 37 ---- documentation/how_to_use.html | 4 + documentation/program_documentation.html | 2 +- generator.pyw | 231 ++++++++++++++++++++--- 7 files changed, 235 insertions(+), 63 deletions(-) diff --git a/configs/config.cfg b/configs/config.cfg index 628ff5e..4880304 100644 --- a/configs/config.cfg +++ b/configs/config.cfg @@ -5,4 +5,8 @@ domain(S) = losobolew.pl quota(I) = 500 country(S) = Rzeczypospolita Polska schoolData(MSAs) = [LO, 4, 0]|[BS, 3, 1] -schoolyearStart(D) = 01.09.* *:*:* \ No newline at end of file +schoolyearStart(D) = 01.09.* *:*:* +ifHeadlineInMail(B) = 0 +headlineInMail(S) = beta +ifHeadlineInOffice(B) = 0 +headlineInOffice(S) = beta \ No newline at end of file diff --git a/configs/style.cfg b/configs/style.cfg index e3db8dc..4130065 100644 --- a/configs/style.cfg +++ b/configs/style.cfg @@ -103,6 +103,9 @@ EPOSLabelAnchor(FAanchor) = center radiobutton1Background(C) = #21242D radiobutton1TextColor(C) = #C0C0C0 radiobutton1IndicatorBackground(C) = #21242D +checkbutton1Background(C) = #21242D +checkbutton1TextColor(C) = #C0C0C0 +checkbutton1IndicatorBackground(C) = #21242D text1Background(C) = #333842 text1TextColor(C) = #C0C0C0 text1Relief(FArelief) = flat @@ -118,6 +121,8 @@ settingsCodeLabelWidth(I) = 35 settingsCodeLabelAnchor(FAanchor) = w settingsOtherLabelWidth(I) = 35 settingsOtherLabelAnchor(FAanchor) = w +settingsHeadlineLabelWidth(I) = 35 +settingsHeadlineLabelAnchor(FAanchor) = w settingsSchoolDataLabelAnchor(FAanchor) = center settingsButtonsPadY(I) = 6 settingsButtonSaveWidth(I) = 20 diff --git a/dev-changelog.txt b/dev-changelog.txt index 162d67d..3d16cc8 100644 --- a/dev-changelog.txt +++ b/dev-changelog.txt @@ -128,4 +128,15 @@ - Wyeliminowanie błędu wyrzucającego wyjątek po naciśnięciu przycisku START bez wprowadzenia danych powyżej - Poprawki w pliku wyjściowym office (usunięcie dwóch przecinków pomiedzy stanowiskiem a klasą) - Wyeliminowanie błędu pokazującego w komunikacie o błędnych danych, przy zapisie format presetu, wpisanej wartości zamiast recordu -- Wyeliminowanie błędu pozwalającego na zapisanie wprowadzonego w spinboxie tekstu \ No newline at end of file +- Wyeliminowanie błędu pozwalającego na zapisanie wprowadzonego w spinboxie tekstu. + +4.0 Beta (Build 20245) +- Wyeliminowanie błędu uniemożliwającego pierwsze uruchomienie programu +- Wyeliminowanie błędu pozwalającego na wybranie tej samej lokalizacji dla pliku wyjściowego poczty i office +- Skrócenie sekcji strony "O programie" +- Dodanie mechanizmu usuwania katalogu programu w appdata po aktualizacji programu +- Wyeliminowanie błędu uniemożliwiającego zapisanie ustawień +- Dodanie możliwości dodawania nagłówków do plików wyjściowych +- Wsparcie dla kodowania ISO-8859-2 +- Wyeliminowanie błędu wyrzucającego wyjątek w przypadku próby zapisania format presetu o nazwie zawierającej zakazane znaki. +- Dodanie mechanizmu pozwalającego na automatyczne resetowanie katalogu programu w appdata podczas uruchamiania programu \ No newline at end of file diff --git a/documentation/about_program.html b/documentation/about_program.html index 646817c..e046a42 100644 --- a/documentation/about_program.html +++ b/documentation/about_program.html @@ -27,42 +27,5 @@
dla ZSP Sobolew

-
-
-
-
-
-
-

- Inne informacje:
-

- Język programowania, użyty w programie: Python
-
- Biblioteki: -

- - - -

-
- Biblioteki GUI: -

- - - -

-
- Języki, użyte do stworzenia strony z instrukcją i dokumentacją techniczną: HTML, CSS, JavaScript -

\ No newline at end of file diff --git a/documentation/how_to_use.html b/documentation/how_to_use.html index 663c5ff..1d3a51a 100644 --- a/documentation/how_to_use.html +++ b/documentation/how_to_use.html @@ -79,6 +79,10 @@

W tym polu należy wpisać ilość miejsca (w megabajtach) przeznaczoną dla każdego użytkownika na przechowywanie maili. Te dane są używane w pliku wyjściowym poczty. Przykład: jan.kowalski2023a@losobolew.pl,1234567u:JK,500

Kraj (zapisany w danych na office)

W tym polu należy wpisać nazwę kraju zamieszkania użytkowników. Będzie ona wykorzystywana w pliku wyjściowym office oraz widoczna w profilu użytkownika w serwisie office. Przykład: jan.kowalski2023a@losobolew.pl,Jan,Kowalski,Jan Kowalski,uczeń,1b LO,,,,,,,,,Rzeczpospolita Polska

+
Nagłówek dla pliku wyjściowego poczty
+

Jeżeli chcesz aby w pierwszej linii pliku wyjściowego dla poczty znajdował się nagłowek, zaznacz opcję "Umieść w pliku". Zawartość nagłówka można edytować w polu tekstowym po lewej.

+
Nagłówek dla pliku wyjściowego office
+

Jeżeli chcesz aby w pierwszej linii pliku wyjściowego dla office znajdował się nagłowek, zaznacz opcję "Umieść w pliku". Zawartość nagłówka można edytować w polu tekstowym po lewej.

Rozpoczęcie roku szkolnego (DD | MM)

W tych polach należy wpisać datę rozpoczęcia roku szkolnego (z reguły). W pierwszym polu (po lewo) należy wpisać dzień, a w drugim (po prawo) miesiąc. Te dane są używane do obliczania roku w znaczniku klasy (przykłądowy znacznik klasy: 2023a).

Dane o szkołach
diff --git a/documentation/program_documentation.html b/documentation/program_documentation.html index deefc17..71ad1e4 100644 --- a/documentation/program_documentation.html +++ b/documentation/program_documentation.html @@ -7,6 +7,6 @@ Generator CSV -

nic

+

reset_appdata

\ No newline at end of file diff --git a/generator.pyw b/generator.pyw index 5bcf42f..71f33fc 100644 --- a/generator.pyw +++ b/generator.pyw @@ -16,14 +16,14 @@ class VAR: # Informacje o programie programName = 'Generator CSV' programVersion = '4.0' - programVersionStage = '' - programVersionBuild = '20242' + programVersionStage = 'Beta' + programVersionBuild = '20245' programCustomer = 'ZSP Sobolew' programAuthors = ['Mateusz Skoczek'] programToW = ['styczeń', '2019', 'wrzesień', '2020'] # Dozwolone kodowanie plików - allowedCoding = ['utf-8', 'ANSI'] + allowedCoding = ['utf-8', 'ANSI', 'iso-8859-2'] # Dozwolone znaki allowedCharactersInSeparator = ['`', '~', '!', '@', '#', '$', '%', '^', '&', '(', ')', '-', '_', '=', '+', '[', ']', ' ', '?', '/', '>', '.', '<', ',', '"', "'", ':', ';', '|'] @@ -87,6 +87,7 @@ MSGlist = { 'I0002' : 'Aplikacja zostanie zamknięta w celu przeładowania ustawień', 'E0015' : 'Nie można usunąć wybranych format presetów', 'E0016' : 'Nie można uruchomić pliku instrukcji (documentation/index.html)', + 'E0017' : 'Nie można zapisać pliku formatu', } def MSG(code, terminate, *optionalInfo): @@ -124,37 +125,76 @@ def MSG(code, terminate, *optionalInfo): +# ----------------------------------- # Opcje deweloperskie # ----------------------------------- # + +dev_config = [] +if 'dev.cfg' in [x for x in OS.listdir('.\configs')]: + try: + dev_config = CD.open(r'.\configs\dev.cfg', 'r', 'utf-8').read().split('\n') + except Exception as exceptInfo: + print('DEVELOPER CONSOLE LOG: Nie można załadować listy aktywnych opcji developerskich') + else: + print('DEVELOPER CONSOLE LOG: Pomyślnie załadowano listę aktywnych opcji developerskich') + print('DEVELOPER CONSOLE LOG: Lista aktywnych opcji developerskich: %s' % str(dev_config)) + + + + + # ------------------------- # Sprawdzanie katalogu programu w APPDATA # ------------------------- # appdata = PT.Path.home() / 'Appdata/Roaming' -#TODO -#SU.rmtree(str(appdata) + '/Generator CSV') -#TODO +if 'reset_appdata' in dev_config: + try: + SU.rmtree(str(appdata) + '\Generator CSV') + OS.mkdir(str(appdata) + '\Generator CSV') + versionFile = CD.open((str(appdata) + r'\Generator CSV\version'), 'w', 'utf-8') + versionFile.write(VAR.programVersionBuild) + versionFile.close() + SU.copy('configs\config.cfg', str(appdata) + '\Generator CSV\config.cfg') + SU.copy('configs\style.cfg', str(appdata) + '\Generator CSV\style.cfg') + OS.mkdir(str(appdata) + r'\Generator CSV\format-presets') + except Exception as exceptInfo: + print("DEVELOPER CONSOLE LOG: Folder 'Generator CSV' w folderze 'APPDATA' nie został zresetowany z powodu błędu: %s" % exceptInfo) + else: + print("DEVELOPER CONSOLE LOG: Folder 'Generator CSV' w folderze 'APPDATA' został zresetowany pomyślnie") def checkAppdata(): if 'Generator CSV' not in [x for x in OS.listdir(appdata)]: try: - OS.mkdir(str(appdata) + '/Generator CSV') - SU.copy('configs/config.cfg', str(appdata) + '\Generator CSV\config.cfg') - SU.copy('configs/style.cfg', str(appdata) + '\Generator CSV\style.cfg') - OS.mkdir(str(appdata) + '/Generator CSV/format-presets') + OS.mkdir(str(appdata) + '\Generator CSV') + versionFile = CD.open((str(appdata) + r'\Generator CSV\version'), 'w', 'utf-8') + versionFile.write(VAR.programVersionBuild) + versionFile.close() + SU.copy('configs\config.cfg', str(appdata) + '\Generator CSV\config.cfg') + SU.copy('configs\style.cfg', str(appdata) + '\Generator CSV\style.cfg') + OS.mkdir(str(appdata) + r'\Generator CSV\format-presets') except Exception as exceptInfo: MSG('E0001', True, exceptInfo) else: - if 'config.cfg' not in [x for x in OS.listdir(str(appdata) + '/Generator CSV')]: + if 'version' not in [x for x in OS.listdir(str(appdata) + '\Generator CSV')]: + SU.rmtree(str(appdata) + '\Generator CSV') + checkAppdata() + else: + versionFile = CD.open((str(appdata) + r'\Generator CSV\version'), 'r', 'utf-8') + if versionFile.read() != VAR.programVersionBuild: + versionFile.close() + SU.rmtree(str(appdata) + '\Generator CSV') + checkAppdata() + if 'config.cfg' not in [x for x in OS.listdir(str(appdata) + '\Generator CSV')]: try: - SU.copy('configs/config.cfg', str(appdata) + '\Generator CSV\config.cfg') + SU.copy('configs\config.cfg', str(appdata) + '\Generator CSV\config.cfg') except Exception as exceptInfo: MSG('E0001', True, exceptInfo) - if 'style.cfg' not in [x for x in OS.listdir(str(appdata) + '/Generator CSV')]: + if 'style.cfg' not in [x for x in OS.listdir(str(appdata) + '\Generator CSV')]: try: - SU.copy('configs/style.cfg', str(appdata) + '\Generator CSV\style.cfg') + SU.copy('configs\style.cfg', str(appdata) + '\Generator CSV\style.cfg') except Exception as exceptInfo: MSG('E0001', True, exceptInfo) - if 'format-presets'not in [x for x in OS.listdir(str(appdata) + '/Generator CSV')]: + if 'format-presets' not in [x for x in OS.listdir(str(appdata) + '\Generator CSV')]: try: - OS.mkdir(str(appdata) + '/Generator CSV/format-presets') + OS.mkdir(str(appdata) + r'\Generator CSV\format-presets') except Exception as exceptInfo: MSG('E0001', True, exceptInfo) @@ -221,7 +261,7 @@ class CFG: var['D'] = int(var['D']) except: return (False, 'Niepoprawne dane - klucz: %s' % record) - if int(var['s']) > 31 or int(var['s']) < 1: + if int(var['D']) > 31 or int(var['D']) < 1: return (False, 'Niepoprawne dane - klucz: %s' % record) day = str(var['D']) if len(day) == 1: @@ -235,7 +275,7 @@ class CFG: var['M'] = int(var['M']) except: return (False, 'Niepoprawne dane - klucz: %s' % record) - if int(var['s']) > 12 or int(var['s']) < 1: + if int(var['M']) > 12 or int(var['M']) < 1: return (False, 'Niepoprawne dane - klucz: %s' % record) month = str(var['M']) if len(month) == 1: @@ -307,6 +347,7 @@ class CFG: return (False, 'Niepoprawne dane - klucz: %s' % record) index = 0 for x in var: + x = x.strip('\r') if x != '*': try: x = int(x) @@ -366,6 +407,26 @@ class CFG: if var not in VAR.allowedCoding: return [False, 'Niepoprawne dane - klucz: %s' % record] return [True, var] + + def __checkB(self, write, record, var): + if write: + if var: + var = '1' + else: + var = '0' + else: + try: + var = int(var) + except: + return [False, 'Niepoprawne dane - klucz: %s' % record] + if var != 0 and var != 1: + return [False, 'Niepoprawne dane - klucz: %s' % record] + else: + if var == 0: + var = False + else: + var = True + return [True, var] @@ -417,6 +478,13 @@ class CFG: return checkingOutput[1] else: MSG('E0003', True, checkingOutput[1]) + elif var[1] == 'B': + # Boolean + checkingOutput = self.__checkB(False, record, var[0]) + if checkingOutput[0]: + return checkingOutput[1] + else: + MSG('E0003', True, checkingOutput[1]) else: MSG('E0003', True, 'Nie można rozpoznać typu klucza %s' % record) @@ -474,6 +542,14 @@ class CFG: else: MSG('E0006', False, checkingOutput[1]) return False + elif type == 'B': + # Boolean + checkingOutput = self.__checkB(True, name, var) + if checkingOutput[0]: + var = checkingOutput[1] + else: + MSG('E0006', False, checkingOutput[1]) + return False else: MSG('E0003', False, 'Nie można rozpoznać typu klucza %s' % name) return False @@ -889,12 +965,16 @@ class FMT: MSG('E0006', False, checkingOutput[1]) return False else: - MSG('E0003', False, 'Nie można rozpoznać typu klucza %s' % name) + MSG('E0006', False, 'Nie można rozpoznać typu klucza %s' % name) return False content[name] = [var, type] - with CD.open(str(appdata) + '/Generator CSV/format-presets/%s.fmt' % preset, 'w', 'utf-8') as file: - for x in content: - file.write('%s(%s) = %s\n' % (x, (content[x])[1], (content[x][0]))) + try: + with CD.open(str(appdata) + '/Generator CSV/format-presets/%s.fmt' % preset, 'w', 'utf-8') as file: + for x in content: + file.write('%s(%s) = %s\n' % (x, (content[x])[1], (content[x][0]))) + except Exception as exceptInfo: + MSG('E0017', False, exceptInfo) + return False return True @@ -936,6 +1016,8 @@ class dataProcess: return True def __checkIfCreatingOutputFilesIsPossible(self, files): + if files[0] == files[1]: + return False try: check = CD.open(files[0], 'w', CFG.R('mailOutputCoding')) check = CD.open(files[1], 'w', CFG.R('officeOutputCoding')) @@ -1103,8 +1185,12 @@ class dataProcess: mailData = data[0] officeData = data[1] with CD.open(mailPath, 'w', CFG.R('mailOutputCoding')) as mail: + if CFG.R('ifHeadlineInMail'): + mail.write(CFG.R('headlineInMail') + '\n') mail.write('\n'.join(mailData)) with CD.open(officePath, 'w', CFG.R('officeOutputCoding')) as office: + if CFG.R('ifHeadlineInOffice'): + office.write(CFG.R('headlineInOffice') + '\n') office.write('\n'.join(officeData)) @@ -2412,7 +2498,7 @@ class mainWindow: ############################### - # (4) Rozpoczęcir roku szkolnego + # (4) Rozpoczęcie roku szkolnego self.settingsOtherDRRSFrame = TKttk.Frame(self.settingsOtherFrame) self.settingsOtherDRRSFrame.config(style = 'layoutFrame.TFrame') @@ -2450,6 +2536,97 @@ class mainWindow: ######################################### + # (3) Separator ######################### + + self.settingsSeparator4 = TKttk.Separator(self.settingsLeftFrame) + self.settingsSeparator4.config(style = 'separator1.TSeparator') + self.settingsSeparator4.config(orient = TK.HORIZONTAL) + self.settingsSeparator4.pack(fill = TK.X, pady = GUI.R('settingsHorizontalSeparatorPadY')) + + ######################################### + + # (4) Nagłówki ########################## + + self.settingsHeadlinesFrame = TKttk.Frame(self.settingsLeftFrame) + self.settingsHeadlinesFrame.config(style = 'layoutFrame.TFrame') + self.settingsHeadlinesFrame.pack(fill = TK.X) + + # (4) Nagłówek poczty ######### + + self.settingsHeadlinesMailFrame = TKttk.Frame(self.settingsHeadlinesFrame) + self.settingsHeadlinesMailFrame.config(style = 'layoutFrame.TFrame') + self.settingsHeadlinesMailFrame.pack(fill = TK.X, expand = 1, pady = 6) + + # 'Nagłówek dla pliku wyjściowego poczty' + self.settingsHeadlinesMailLabel = TKttk.Label(self.settingsHeadlinesMailFrame) + self.settingsHeadlinesMailLabel.config(style = 'label1.TLabel') + self.settingsHeadlinesMailLabel.config(width = GUI.R('settingsHeadlineLabelWidth')) + self.settingsHeadlinesMailLabel.config(anchor = GUI.R('settingsHeadlineLabelAnchor')) + self.settingsHeadlinesMailLabel.config(text = 'Nagłówek dla pliku wyjściowego poczty') + self.settingsHeadlinesMailLabel.pack(side = TK.LEFT) + + # Nagłówek poczty - checkbutton + self.settingsHeadlinesMailCheckbuttonVar = TK.BooleanVar() + self.settingsHeadlinesMailCheckbutton = TK.Checkbutton(self.settingsHeadlinesMailFrame) + self.settingsHeadlinesMailCheckbutton.config(bg = GUI.R('checkbutton1Background')) + self.settingsHeadlinesMailCheckbutton.config(fg = GUI.R('checkbutton1TextColor')) + self.settingsHeadlinesMailCheckbutton.config(selectcolor = GUI.R('checkbutton1IndicatorBackground')) + self.settingsHeadlinesMailCheckbutton.config(activebackground = GUI.R('checkbutton1Background')) + self.settingsHeadlinesMailCheckbutton.config(activeforeground = GUI.R('checkbutton1TextColor')) + self.settingsHeadlinesMailCheckbutton.config(text = 'Umieść w pliku') + self.settingsHeadlinesMailCheckbutton.config(variable = self.settingsHeadlinesMailCheckbuttonVar) + self.settingsHeadlinesMailCheckbutton.pack(side = TK.RIGHT, padx = (6, 0)) + self.settingsHeadlinesMailCheckbuttonVar.set(CFG.R('ifHeadlineInMail')) + + # Nagłówek poczty - Entry + self.settingsHeadlinesMailEntryVar = TK.StringVar() + self.settingsHeadlinesMailEntry = TKttk.Entry(self.settingsHeadlinesMailFrame) + self.settingsHeadlinesMailEntry.config(style = 'entry1.TEntry') + self.settingsHeadlinesMailEntry.config(textvariable = self.settingsHeadlinesMailEntryVar) + self.settingsHeadlinesMailEntry.pack(side = TK.RIGHT, fill = TK.X, expand = 1, padx = (0, 6)) + self.settingsHeadlinesMailEntryVar.set(CFG.R('headlineInMail')) + + ############################### + + # (4) Nagłówek office ######### + + self.settingsHeadlinesOfficeFrame = TKttk.Frame(self.settingsHeadlinesFrame) + self.settingsHeadlinesOfficeFrame.config(style = 'layoutFrame.TFrame') + self.settingsHeadlinesOfficeFrame.pack(fill = TK.X, expand = 1, pady = 6) + + # 'Nagłówek dla pliku wyjściowego poczty' + self.settingsHeadlinesOfficeLabel = TKttk.Label(self.settingsHeadlinesOfficeFrame) + self.settingsHeadlinesOfficeLabel.config(style = 'label1.TLabel') + self.settingsHeadlinesOfficeLabel.config(width = GUI.R('settingsHeadlineLabelWidth')) + self.settingsHeadlinesOfficeLabel.config(anchor = GUI.R('settingsHeadlineLabelAnchor')) + self.settingsHeadlinesOfficeLabel.config(text = 'Nagłówek dla pliku wyjściowego office') + self.settingsHeadlinesOfficeLabel.pack(side = TK.LEFT) + + # Nagłówek poczty - checkbutton + self.settingsHeadlinesOfficeCheckbuttonVar = TK.BooleanVar() + self.settingsHeadlinesOfficeCheckbutton = TK.Checkbutton(self.settingsHeadlinesOfficeFrame) + self.settingsHeadlinesOfficeCheckbutton.config(bg = GUI.R('checkbutton1Background')) + self.settingsHeadlinesOfficeCheckbutton.config(fg = GUI.R('checkbutton1TextColor')) + self.settingsHeadlinesOfficeCheckbutton.config(selectcolor = GUI.R('checkbutton1IndicatorBackground')) + self.settingsHeadlinesOfficeCheckbutton.config(activebackground = GUI.R('checkbutton1Background')) + self.settingsHeadlinesOfficeCheckbutton.config(activeforeground = GUI.R('checkbutton1TextColor')) + self.settingsHeadlinesOfficeCheckbutton.config(text = 'Umieść w pliku') + self.settingsHeadlinesOfficeCheckbutton.config(variable = self.settingsHeadlinesOfficeCheckbuttonVar) + self.settingsHeadlinesOfficeCheckbutton.pack(side = TK.RIGHT, padx = (6, 0)) + self.settingsHeadlinesOfficeCheckbuttonVar.set(CFG.R('ifHeadlineInOffice')) + + # Nagłówek poczty - Entry + self.settingsHeadlinesOfficeEntryVar = TK.StringVar() + self.settingsHeadlinesOfficeEntry = TKttk.Entry(self.settingsHeadlinesOfficeFrame) + self.settingsHeadlinesOfficeEntry.config(style = 'entry1.TEntry') + self.settingsHeadlinesOfficeEntry.config(textvariable = self.settingsHeadlinesOfficeEntryVar) + self.settingsHeadlinesOfficeEntry.pack(side = TK.RIGHT, fill = TK.X, expand = 1, padx = (0, 6)) + self.settingsHeadlinesOfficeEntryVar.set(CFG.R('headlineInOffice')) + + ############################### + + ######################################### + ################################################### # (2) Separator ################################### @@ -2939,6 +3116,10 @@ class mainWindow: x[2] = '0' x[1] = str(x[1]) self.settingsSchoolDataText.insert(TK.END, (' | '.join(x) + '\n')) + self.settingsHeadlinesMailCheckbuttonVar.set(CFG.R('ifHeadlineInMail')) + self.settingsHeadlinesMailEntryVar.set(CFG.R('headlineInMail')) + self.settingsHeadlinesOfficeCheckbuttonVar.set(CFG.R('ifHeadlineInOffice')) + self.settingsHeadlinesOfficeEntryVar.set(CFG.R('headlineInOffice')) def settingsButtonSaveAction(self): if MSG('A0004', False): @@ -2957,6 +3138,10 @@ class mainWindow: 's' : None, } changes['schoolData'] = (self.settingsSchoolDataText.get("1.0", TK.END)).split('\n') + changes['ifHeadlineInMail'] = self.settingsHeadlinesMailCheckbuttonVar.get() + changes['headlineInMail'] = self.settingsHeadlinesMailEntryVar.get() + changes['ifHeadlineInOffice'] = self.settingsHeadlinesOfficeCheckbuttonVar.get() + changes['headlineInOffice'] = self.settingsHeadlinesOfficeEntryVar.get() CFG.W(changes) self.settingsReset() else: