From bf5540b7adf569ca549ec16c90bf5ac4a22b8c13 Mon Sep 17 00:00:00 2001 From: Mateusz Skoczek Date: Thu, 6 Aug 2020 18:33:32 +0200 Subject: [PATCH] 4.0 Alpha (Build 20016) --- .idea/GeneratorCSV 3.1.iml | 13 - .../inspectionProfiles/profiles_settings.xml | 6 - .idea/misc.xml | 7 - .idea/modules.xml | 8 - .idea/vcs.xml | 6 - .idea/workspace.xml | 114 -- assets/icon.ico | Bin 0 -> 112027 bytes assets/other_images/icon.png | Bin 0 -> 4157 bytes assets/tab_icons/generate.png | Bin 0 -> 623 bytes assets/tab_icons/icon.png | Bin 0 -> 4157 bytes assets/tab_icons/info.png | Bin 0 -> 1125 bytes assets/tab_icons/link.png | Bin 0 -> 631 bytes assets/tab_icons/merge.png | Bin 0 -> 882 bytes assets/tab_icons/settings.png | Bin 0 -> 1056 bytes changelog-UC.txt | 9 +- config.cfg | 7 - format.fmt | 5 - generator.py | 1052 +++++------------ modules/__init__.py | 0 modules/__pycache__/__init__.cpython-38.pyc | Bin 164 -> 0 bytes modules/__pycache__/dialog.cpython-38.pyc | Bin 4266 -> 0 bytes .../__pycache__/load_config.cpython-38.pyc | Bin 2665 -> 0 bytes .../__pycache__/load_format.cpython-38.pyc | Bin 3541 -> 0 bytes modules/dialog.py | 105 -- modules/load_config.py | 135 --- modules/load_format.py | 249 ---- readme.txt | 107 -- src/__pycache__/vars.cpython-38.pyc | Bin 0 -> 2402 bytes src/vars.py | 102 ++ 29 files changed, 390 insertions(+), 1535 deletions(-) delete mode 100644 .idea/GeneratorCSV 3.1.iml delete mode 100644 .idea/inspectionProfiles/profiles_settings.xml delete mode 100644 .idea/misc.xml delete mode 100644 .idea/modules.xml delete mode 100644 .idea/vcs.xml delete mode 100644 .idea/workspace.xml create mode 100644 assets/icon.ico create mode 100644 assets/other_images/icon.png create mode 100644 assets/tab_icons/generate.png create mode 100644 assets/tab_icons/icon.png create mode 100644 assets/tab_icons/info.png create mode 100644 assets/tab_icons/link.png create mode 100644 assets/tab_icons/merge.png create mode 100644 assets/tab_icons/settings.png delete mode 100644 config.cfg delete mode 100644 format.fmt delete mode 100644 modules/__init__.py delete mode 100644 modules/__pycache__/__init__.cpython-38.pyc delete mode 100644 modules/__pycache__/dialog.cpython-38.pyc delete mode 100644 modules/__pycache__/load_config.cpython-38.pyc delete mode 100644 modules/__pycache__/load_format.cpython-38.pyc delete mode 100644 modules/dialog.py delete mode 100644 modules/load_config.py delete mode 100644 modules/load_format.py delete mode 100644 readme.txt create mode 100644 src/__pycache__/vars.cpython-38.pyc create mode 100644 src/vars.py diff --git a/.idea/GeneratorCSV 3.1.iml b/.idea/GeneratorCSV 3.1.iml deleted file mode 100644 index ed5ea5b..0000000 --- a/.idea/GeneratorCSV 3.1.iml +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - - - - - - - \ No newline at end of file diff --git a/.idea/inspectionProfiles/profiles_settings.xml b/.idea/inspectionProfiles/profiles_settings.xml deleted file mode 100644 index 20fc29e..0000000 --- a/.idea/inspectionProfiles/profiles_settings.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml deleted file mode 100644 index adbabba..0000000 --- a/.idea/misc.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml deleted file mode 100644 index 84256e7..0000000 --- a/.idea/modules.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml deleted file mode 100644 index 9661ac7..0000000 --- a/.idea/vcs.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/.idea/workspace.xml b/.idea/workspace.xml deleted file mode 100644 index 27fa3ca..0000000 --- a/.idea/workspace.xml +++ /dev/null @@ -1,114 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 1575129057993 - - - - - - - - - - - - - - \ No newline at end of file diff --git a/assets/icon.ico b/assets/icon.ico new file mode 100644 index 0000000000000000000000000000000000000000..11e00aac42bb02dc40b1b21338d40411f1f97227 GIT binary patch literal 112027 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

x$L06^o(PZ#skbr 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 H$W{Lj$*EGf literal 0 HcmV?d00001 diff --git a/assets/other_images/icon.png b/assets/other_images/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..91780fd565e3f45a7ba99abab73ee0c77e6b2a63 GIT binary patch literal 4157 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 mE3&9W+x>cahE-*C{wrT>5+NS%G}U;vjb? zhIQv;UIIA^$sR$z3=CCj3=9n|3=F@3LJcn%7)pVryh>nTu$sZZAYL$MSD+10f-TA0 z-33Sk!B6Mi^+1ZVz$3C4NPB>>+sSM@pz#KtE{-7?_ukIf?Zx6K;OgHwQz9d8kJ_f+ z`c3m6EsQrGzc2J(HQ}?2#BaS4o;&_GgRbT;zP-Mlj}~^>emN-*D)DC;IsG; zcJq+-hK#ihGuJj+ZeW?T{T8oK0jtiLH%Fs=1X%vh^;c@U-ea--f+;W%RZCnWN>UO_ zQmvAUQh^kMk%5tcu7RPhp;3sTrIn$%m5G_Qfq|8Q0jriwE{cZS{FKbJO57Ss%9mUO zYR~}LP+XR7m6TYVs#{u=$&i+rlWL`}uV0c|pr4zVo|&AjTjuK@8f6h^);04YFy$~X Nc)I$ztaD0e0st(H<^2Ev literal 0 HcmV?d00001 diff --git a/assets/tab_icons/icon.png b/assets/tab_icons/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..91780fd565e3f45a7ba99abab73ee0c77e6b2a63 GIT binary patch literal 4157 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 mE3&9W+x>cahE-*C{wrT>5+NS%G}U;vjb? zhIQv;UIIA^$sR$z3=CCj3=9n|3=F@3LJcn%7)pVryh>nTu$sZZAYL$MSD+10f-TA0 z-33Sk!B6Mi^+1ZVz$3C4NPB>>+sSM@1_ov|PZ!6KjC*fq?)4W56gm2yVYgbttcDo^ zc3jeLbp$5#v;C3gafx>M$GnJB_l7cK^7@NmOOD+0NNVC0GF4&>(O|i<^kcf=`iOUX zrdAr~moIwf>9ND$`<>!@XZG}4D}{!9tXKZv$aJO4qrZcv(_?x^jL^g|!Az6sGF>O8 zb*$+;(bb{Ted4qNM_uYGxfcxY7-#QzENsBMC0%h3YXyUhs=&HJmNU%HwN(GHZFugu z23M>GSinC|832#Pdmgk;j`{Oxd^Sm0`3_MuVjB7 zYxpWO=X~ssM?HIdYZzxRNd*=8OX>Bx>X$D%lDwJsOQqz(4Q}=ul2;nfpY~%}Yl-NK z532iCge`w~O~TXb22V|BiuF^0^*%4GH@Z*KoK`ST|Cs;u<8J(mo$oa~ojapg^uA-s z#92j8JW>ukxwp|r;$wKup|_5P+hWpZPhtCXz}nSN*nH=-7x&T*xjIBKtJTK@<}jER z3jGdwWVcUD)SQ|3K;xxLi`Q?qlnVNoB*0>?m8-zf^j>Mxl7BWb#~r43#fL=I2u}0A zkY-vCcyzt7$%5?c+@N&Ntk93`DpS99OS3pmx;%f~+O3iA9TsaEMKVrCH?IUhUsS8`Tnyqd$6^%c4p#h|acTdpA4Jqx}>KWZkJ6zzfXX^Zdjq@L6Shx})D$8MdO`9yN+p1#M7)=$fRiF}9)^w}-2McDR& zPuPV6u~Xw1ZpB!%Y`DAJ^VjKI28k^^_ts3VaK6&=H{kwDAF=(*-UjUVzO+x%z)NKH zQ-j1K`!`v?=(t3u3@W1W6ek3RZ4@9^2VGnSk1HK-rRT_A3e?`Dx-_g?i)lD+D# zLvqzQdwOd)m6cu6)#ZOU-4efc(8buGeXs7jE+zwRlTepEMwi@nyuIO}P{TaqSZQnM zhp#iYy1A_L*zxto~HcG2Wrp&*-%`TZk3c+oT^(|l*y2mnUiXzudiQ{TcDqtn4X!Oty^kb=;Q5Q VVyQJPcQH^8gQu&X%Q~loCIG|{(t7{^ literal 0 HcmV?d00001 diff --git a/assets/tab_icons/link.png b/assets/tab_icons/link.png new file mode 100644 index 0000000000000000000000000000000000000000..8a8667224fc9d4fcf170d60488c3489412a64716 GIT binary patch literal 631 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA1|-9oezpTCmUKs7M+SzC{oH>NS%G}U;vjb? zhIQv;UIIA^$sR$z3=CCj3=9n|3=F@3LJcn%7)pVryh>nTu$sZZAYL$MSD+10f-TA0 z-33Sk!B6Mi^+1ZVz$3C4NPB>>+sSM@pz#)-E{-7?_ukGp8+h12pmqP*f>aMt71;?~ zlCu;SGM>A@WFn};RS{#sAun|M*T<|2<)3y5w%@)Oxr|x?=$tUY>s&1z>ufS#lVqPHr>17-yMU^KM%*Mf47-EWxDMJ z)-`8+-*OhOU;9k<1=BS(&xZClTYk8!W%BO{)UT^yWHs+k;p7V^)IaxoL zyX)hRgJ|2})eT)^aX@DOvsoS;7hg z29>4gZ3^yU*4uRX(Yc4F)@Q{OUutA(RP3P#Mut|VX4(b@Rt5&KHC$U!H00)|WTsW( z)}W)fi4&+n17t&SS-MqHVsWZ&X;CIaT4qkFmA<}yNp69DZen_7a<*=mhqJ%8YqB%z TwUd{DdKf%i{an^LB{Ts54AtY$ literal 0 HcmV?d00001 diff --git a/assets/tab_icons/merge.png b/assets/tab_icons/merge.png new file mode 100644 index 0000000000000000000000000000000000000000..19d4ac50d9049d7633b54eea26f3e8dcc19e5ca1 GIT binary patch literal 882 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA1|-9oezpTCmUKs7M+SzC{oH>NS%G}U;vjb? zhIQv;UIIA^$sR$z3=CCj3=9n|3=F@3LJcn%7)pVryh>nTu$sZZAYL$MSD+10f-TA0 z-33Sk!B6Mi^+1ZVz$3C4NPB>>+sSM@1_mZ$PZ!6KjC*fq?)E!uAkiwjAmq$}kP7x2 zznF4z6w=-a3Ay(4tnujav0>zI*s(_8U6X=hS=x~!xeQbL4~li^Sa0+W+8)$*MRDWn zIg|h2_*d`VA*AXx_^G@v}P=ALzCIF*T5wl|HS*u6wRj!+95e zJr{RdmH9T)_HN7*HxLYJFy|5b#bep{x#K{CK$7YdhWvgp3uE9EK;J~W=mIo}v+R91AI z-Q?DztBV?J;`;x;zIs6^OHwJx>MOImlgs{3Pg_4_?u*k6T;$TZ?uh=f%J(U=ANEND z(~)Y4YeY#(Vo9o1a#1RfVlXl=GSD?J)HO5;F|@P-A_FsR0|P4qgZV3!R8TbJ=BH$) zRpQq0?#nD-dS=i7*-%`TZk3c+oT^(|l*y2mnUiXzudiQ{TcDqtn4X!Ots9)@o)PHf VmF)D}^czqQgQu&X%Q~loCIHoeUjzUE literal 0 HcmV?d00001 diff --git a/assets/tab_icons/settings.png b/assets/tab_icons/settings.png new file mode 100644 index 0000000000000000000000000000000000000000..09f4cbb83fb1eaeacbbd89462a773bbaa2aaf100 GIT binary patch literal 1056 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA1|-9oezpTCmUKs7M+SzC{oH>NS%G}U;vjb? zhIQv;UIIA^$sR$z3=CCj3=9n|3=F@3LJcn%7)pVryh>nTu$sZZAYL$MSD+10f-TA0 z-33Sk!B6Mi^+1ZVz$3C4NPB>>+sSM@1_q{wo-U3d8Ta1KJnt2XK5>4qr1+PZ3m!ixO|W33fEVpT5s2}HTC_L?-Ukz0IQ=3;>>YG=h3O_dS}o51=j z)9~|xw#wr4cV|9p?$NiY*i-zxdf)w-*3a)%&%5Fx>?^{Sz-7KnYVGD}Kaw?%gkKB{ zxo68-Wf8c1mKB)>|=OyJ~=@_@#lP*Lz@eDRWi4* zd~{bm>#enV;}6A`OJ>&gajWe;^1ZyF!c)srYNcpTEtA9cC6S`hOFt!e2hE>()`fX1 zOW#|CkD+suU9=L`Fh1C{q}X!OT2HA-S9D(n{IJx`wCMTysAoy{xj+Z`4G$xI=P@p2 zc_(D>@Z?^`FUvM@ePQU9d!);{y>dnbOO=tW{sP$IR*@fDsoOzS(#;odj zU$`x2#!W|Y|69kM18jBcu>Ru${2Bz8ROC}&#i z(9OP`rG(*fsn+7u2i{)qGB=eOa)dozI)!u9428c=-)xk>3tgD*y61gZ5>rO$ou6wS zt?sz%b>!@NGtYg;cg&u2j+tL&Z$N>qU>u1syH{LMHN?WgLo3-Ut{RacTJzJ{zzQ(3)6B1vu zbHdD)6)06n)%9-^i*9t>v|a4IK;&Ldv7KHsvM26Yd$h-Geu}||9V_;@Zu1j+Wm0yV zr)I_F8_OEEWSkJu5_$7%f8^|pr0I|J>-%Rd%W6y70ZjF(C9V-ADTyViR>?)FK#IZ0 zz{o(?z);uFD8$gx3W$u&v<(cb3=9O-RF9)*$jwj5OsmALA)$J1HBf^F$cEywbgQJq z;#A$zqD+Rg%$!s!eSQ6s+yedF#PrPMY+a9x@Ty>!aEo1juQY*r7(8A5T-G@yGywot C=Bw)f literal 0 HcmV?d00001 diff --git a/changelog-UC.txt b/changelog-UC.txt index def0dfb..601629f 100644 --- a/changelog-UC.txt +++ b/changelog-UC.txt @@ -51,4 +51,11 @@ - Zmiana nazwy pliku instrukcji na 'readme.txt' - Naprawienie przycisków filedialog - Zmiana zmiennej treści błędu na string -- Ulepszona obsługa wyjątków dla ładowania pliku konfiguracyjnego, formatu i 'readme.txt' \ No newline at end of file +- Ulepszona obsługa wyjątków dla ładowania pliku konfiguracyjnego, formatu i 'readme.txt' + +4.0 Alpha (Build 20016) +- Całkowite przeprojektowanie interfejsu +- Całkowite przeprojektowanie struktury plików programu +- Przywrócenie systemu crashlogów +- Ukończenie karty 'informacje' +- Użycie skryptu instalującego automatycznie bibliotekę PIL \ No newline at end of file diff --git a/config.cfg b/config.cfg deleted file mode 100644 index 59688b9..0000000 --- a/config.cfg +++ /dev/null @@ -1,7 +0,0 @@ -Ciemny motyw(0/1): 1 -Kodowanie wyjsciowe: utf-8 -Domena: losobolew.pl -Quota: 500 -Kraj: Rzeczypospolita Polska -Dlugosc liceum: 4 -Dlugosc branzowej: 3 \ No newline at end of file diff --git a/format.fmt b/format.fmt deleted file mode 100644 index 1ac672d..0000000 --- a/format.fmt +++ /dev/null @@ -1,5 +0,0 @@ -K O N, I X L X -Q - -N, I X L X -Q \ No newline at end of file diff --git a/generator.py b/generator.py index 7aec5bc..3a34c22 100644 --- a/generator.py +++ b/generator.py @@ -1,8 +1,8 @@ """ # Generator CSV -# Wersja 4.0 Experimental +# 4.0 Experimental # by Mateusz Skoczek -# luty 2019 - grudzień 2019 +# styczeń 2019 - luty 2020 # dla ZSP Sobolew # @@ -14,784 +14,292 @@ +# -------------------- # Import bibliotek zewnętrznych # -------------------- # - - -# -------------------------------------------- # Informacje o programie # -------------------------------------------- # - -Nazwa = 'Generator CSV' -Wersja = '4.0 Experimental' -LataPracy = '2019' -Autorzy = 'Mateusz Skoczek' - - - - - - - - -# ----------------------------------- # Import bibliotek zewnętrznych i modułów # ------------------------------------ # - -# Biblioteki zewnętrzne +# Biblioteki główne import os as OS import sys as SS +import time as TM -# Moduły składowe programu -try: - from modules import dialog as MDdlg -except ModuleNotFoundError: - print('Wystąpił krytyczny błąd!') - print('Nie znaleziono jednego z modułów programu (dialog.py). Nie można załadować programu') - print('Kod błędu: E00x0011') - wait = input('Naciśnij ENTER aby wyjść') - SS.exit(0) -except Exception as exc: - print('Wystąpił krytyczny błąd!') - print('Nieznany błąd podczas ładowania jednego z modułów programu (dialog.py). Nie można załadować programu.') - print('Treść błędu: ' + str(exc)) - print('Kod błędu: E00x0010') - wait = input('Naciśnij ENTER aby wyjść') - SS.exit(0) - -try: - from modules import load_config as MDlcg -except ModuleNotFoundError: - print('Wystąpił krytyczny błąd!') - print('Nie znaleziono jednego z modułów programu (load_config.py). Nie można załadować programu') - print('Kod błędu: E00x0021') - wait = input('Naciśnij ENTER aby wyjść') - SS.exit(0) -except Exception as exc: - print('Wystąpił krytyczny błąd!') - print('Nieznany błąd podczas ładowania jednego z modułów programu (load_config.py). Nie można załadować programu.') - print('Treść błędu: ' + str(exc)) - print('Kod błędu: E00x0020') - wait = input('Naciśnij ENTER aby wyjść') - SS.exit(0) - -try: - from modules import load_format as MDlfm -except ModuleNotFoundError: - print('Wystąpił krytyczny błąd!') - print('Nie znaleziono jednego z modułów programu (load_format.py). Nie można załadować programu') - print('Kod błędu: E00x0031') - wait = input('Naciśnij ENTER aby wyjść') - SS.exit(0) -except Exception as exc: - print('Wystąpił krytyczny błąd!') - print('Nieznany błąd podczas ładowania jednego z modułów programu (load_format.py). Nie można załadować programu.') - print('Treść błędu: ' + str(exc)) - print('Kod błędu: E00x0030') - wait = input('Naciśnij ENTER aby wyjść') - SS.exit(0) - - -# Biblioteki zewnętrzne interfejsu graficznego +# Framework i inne biblioteki interfejsu graficznego import tkinter as TK - -from tkinter import filedialog as TKfld from tkinter import ttk as TKttk +from tkinter import filedialog as TKfld +try: + from PIL import ImageTk as PLitk + from PIL import Image as PLimg +except ModuleNotFoundError: + OS.system("python -m pip install pip") + OS.system("python -m pip install Pillow") + OS.system("cls") + from PIL import ImageTk as PLitk + from PIL import Image as PLimg + + + + + +# ------------------ # Import plików składowych programu # ------------------ # + +# Funkcja tworząca plik zawierający logi błędu +def excpt(filename, importingFilename, errorcode, exceptInfo): + filepath = './crashlogs/crash_' + str(TM.localtime()[2]) + str(TM.localtime()[1]) + str(TM.localtime()[0]) + str(TM.localtime()[3]) + str(TM.localtime()[4]) + str(TM.localtime()[5]) + '.txt' + try: + OS.mkdir('./crashlogs') + except: + pass + crashfile = open(filepath, 'w') + crashfile.write('CRASH!\n') + crashfile.write('An error occurred while loading the component file: %s\n' % importingFilename) + crashfile.write('In file: %s\n' % filename) + crashfile.write('%s\n' % exceptInfo) + crashfile.write('Errorcode: %s' % errorcode) + crashfile.close() + SS.exit(0) + + + +# vars.py +try: + from src.vars import prgInfo as SCvar_inf + from src.vars import guiVars as SCvar_gui +except Exception as exceptInfo: + excpt('generator.py', 'variables.py', 'E000000', exceptInfo) #TODO Kod + + + + + +# -------------------------------- # Okno # --------------------------------- # + +# Budowa okna +def gui(): + # Ustawienia okna + root = TK.Tk() + root.title(SCvar_inf.name + " " + SCvar_inf.version) + root.resizable(width = SCvar_gui.other.windowWidthResize, height = SCvar_gui.other.windowHeightResize) + root.configure(bg = SCvar_gui.color.mainBG) + root.iconbitmap(SCvar_gui.image.programIcon) + + + + + # Motyw + TKttk.Style().theme_create("main", parent = "alt", settings = { + "mainMenu.TNotebook":{ + "configure": { + "background": SCvar_gui.color.mainBG, + "tabposition": SCvar_gui.other.tabPosition, + "borderwidth": SCvar_gui.dimension.tabWindowBorderWidth, + } + }, + "mainMenu.TNotebook.Tab":{ + "configure": { + "background": SCvar_gui.color.unselectedTabBG, + "borderwidth": SCvar_gui.dimension.borderTab, + "padding": SCvar_gui.dimension.iconPaddingTab, + }, + "map": { + "background": [("selected", SCvar_gui.color.selectedTabBG), ("disabled", SCvar_gui.color.headerBG)], + } + } + }) + TKttk.Style().theme_use("main") - - - - - - -# ------------------------------------- # Uruchomienie interfejsu graficznego # -------------------------------------- # - -# Zmienne globalne środowiska graficznego -if int(MDlcg.read()[0]) == 1: - CiemnyMotyw = True -else: - CiemnyMotyw = False -SzerokoscOpisu = 17 -SzerokoscOpisu2 = 30 -SzerokoscOpisu3 = 10 -SzerokoscPola = 122 -SzerokoscPola2 = 107 -SzerokoscPola3 = 130 - - - -# Zmienne motywu -if CiemnyMotyw: - ZmienneMotywu = ['#1F1F1F', '#191919', '#B8B8B8', '#FFFFFF', '#404040', '#FFFFFF', '#1F1F1F', 1] -else: - ZmienneMotywu = ['#F0F0F0', '#D4D4D4', '#000000', '#000000', '#A6A6A6', '#000000', '#FFFFFF', 2] - -M_tlo = ZmienneMotywu[0] -M_tytultlo = ZmienneMotywu[1] -M_tytultext = ZmienneMotywu[2] -M_text = ZmienneMotywu[3] -M_przycisktlo = ZmienneMotywu[4] -M_przycisktext = ZmienneMotywu[5] -M_entrytlo = ZmienneMotywu[6] -M_framewielkosc = ZmienneMotywu[7] - - - -# Okno główne -class Main(TK.Tk): - def __init__(self): - # Ustawienia okna - TK.Tk.__init__(self) - self.title(Nazwa + " " + Wersja) - self.resizable(width = False, height = False) - self.configure(bg = M_tlo) - - - # Tytuł - Tytul = TK.Label(self) - Tytul.config(text = Nazwa) - Tytul.config(width = 41) - Tytul.config(bg = M_tytultlo) - Tytul.config(fg = M_tytultext) - Tytul.config(font = ('Segoe UI Semilight', 30)) - Tytul.grid(row = 0) - - - # Frame1 - Pliki z danymi - Ramka1 = TK.LabelFrame(self) - Ramka1.config(text=' Pliki tekstowe zawierające dane (wymagany przynajmniej jeden) ') - Ramka1.config(borderwidth = M_framewielkosc) - Ramka1.config(bg = M_tlo) - Ramka1.config(fg = M_text) - Ramka1.grid(row = 1) - - - # Ścieżka pliku txt nr 1 - wiersz = 1 - text1 = TK.StringVar() - - Pole1Label = TK.Label(Ramka1) - Pole1Label.config(text = 'Plik z danymi (1)') - Pole1Label.config(width = SzerokoscOpisu) - Pole1Label.config(bg = M_tlo) - Pole1Label.config(fg = M_text) - Pole1Label.grid(row = wiersz, column = 0) - - Pole1 = TK.Entry(Ramka1) - Pole1.config(textvariable = text1) - Pole1.config(width = SzerokoscPola) - Pole1.config(bg = M_entrytlo) - Pole1.config(fg = M_text) - Pole1.grid(row = wiersz, column = 1) - - def Pole1BrowseDialog(): - Pole1Browse.filename = TKfld.askopenfilename(title = "Wybierz plik tekstowy z danymi", filetypes = (("Pliki txt", "*.txt"), ("Wszystkie pliki", "*.*"))) - Pole1.delete(0, 'end') - Pole1.insert(0, Pole1Browse.filename) - - Pole1Browse = TK.Button(Ramka1) - Pole1Browse.config(text = '...') - Pole1Browse.config(command = Pole1BrowseDialog) - Pole1Browse.config(bg = M_przycisktlo) - Pole1Browse.config(fg = M_przycisktext) - Pole1Browse.config(relief = 'flat') - Pole1Browse.config(activebackground = M_przycisktlo) - Pole1Browse.grid(row = wiersz, column = 2, padx=5, pady=3) - - - # Ścieżka pliku txt nr 2 - wiersz = 2 - text2 = TK.StringVar() - - Pole2Label = TK.Label(Ramka1) - Pole2Label.config(text = 'Plik z danymi (2)') - Pole2Label.config(width = SzerokoscOpisu) - Pole2Label.config(bg = M_tlo) - Pole2Label.config(fg = M_text) - Pole2Label.grid(row = wiersz, column = 0) - - Pole2 = TK.Entry(Ramka1) - Pole2.config(textvariable = text2) - Pole2.config(width = SzerokoscPola) - Pole2.config(bg = M_entrytlo) - Pole2.config(fg = M_text) - Pole2.grid(row = wiersz, column = 1) - - def Pole2BrowseDialog(): - Pole2Browse.filename = TKfld.askopenfilename(title = "Wybierz plik tekstowy z danymi", filetypes = (("Pliki txt", "*.txt"), ("Wszystkie pliki", "*.*"))) - Pole2.delete(0, 'end') - Pole2.insert(0, Pole2Browse.filename) - - Pole2Browse = TK.Button(Ramka1) - Pole2Browse.config(text = '...') - Pole2Browse.config(command = Pole2BrowseDialog) - Pole2Browse.config(bg = M_przycisktlo) - Pole2Browse.config(fg = M_przycisktext) - Pole2Browse.config(relief = 'flat') - Pole2Browse.config(activebackground = M_przycisktlo) - Pole2Browse.grid(row = wiersz, column = 2, padx = 5, pady = 3) - - # Ścieżka pliku txt nr 3 - wiersz = 3 - text3 = TK.StringVar() - - Pole3Label = TK.Label(Ramka1) - Pole3Label.config(text = 'Plik z danymi (3)') - Pole3Label.config(width = SzerokoscOpisu) - Pole3Label.config(bg = M_tlo) - Pole3Label.config(fg = M_text) - Pole3Label.grid(row = wiersz, column = 0) - - Pole3 = TK.Entry(Ramka1) - Pole3.config(textvariable = text3) - Pole3.config(width = SzerokoscPola) - Pole3.config(bg = M_entrytlo) - Pole3.config(fg = M_text) - Pole3.grid(row = wiersz, column = 1) - - def Pole3BrowseDialog(): - Pole3Browse.filename = TKfld.askopenfilename(title = "Wybierz plik tekstowy z danymi", filetypes = (("Pliki txt", "*.txt"), ("Wszystkie pliki", "*.*"))) - Pole3.delete(0, 'end') - Pole3.insert(0, Pole3Browse.filename) - - Pole3Browse = TK.Button(Ramka1) - Pole3Browse.config(text = '...') - Pole3Browse.config(command = Pole3BrowseDialog) - Pole3Browse.config(bg = M_przycisktlo) - Pole3Browse.config(fg = M_przycisktext) - Pole3Browse.config(relief = 'flat') - Pole3Browse.config(activebackground = M_przycisktlo) - Pole3Browse.grid(row = wiersz, column = 2, padx = 5, pady = 3) - - - # Frame2 - Dołącz pliki .csv - Ramka2 = TK.LabelFrame(self) - Ramka2.config(text = ' Dołącz pliki .csv (opcjonalne) ') - Ramka2.config(borderwidth = M_framewielkosc) - Ramka2.config(bg = M_tlo) - Ramka2.config(fg = M_text) - Ramka2.grid(row = 2) - - - # Sciezka do konta.csv - wiersz = 1 - textKonta = TK.StringVar() - - PoleKontaLabel = TK.Label(Ramka2) - PoleKontaLabel.config(text = 'Ściezka do pliku .csv dla poczty') - PoleKontaLabel.config(width = SzerokoscOpisu2) - PoleKontaLabel.config(bg = M_tlo) - PoleKontaLabel.config(fg = M_text) - PoleKontaLabel.grid(row = wiersz, column = 0) - - PoleKonta = TK.Entry(Ramka2) - PoleKonta.config(textvariable = textKonta) - PoleKonta.config(width = SzerokoscPola2) - PoleKonta.config(bg = M_entrytlo) - PoleKonta.config(fg = M_text) - PoleKonta.grid(row = wiersz, column = 1) - - def PoleKontaBrowseDialog(): - PoleKontaBrowse.filename = TKfld.askopenfilename(title="Wybierz plik .csv dla poczty", filetypes=(("Pliki csv", "*.csv"), ("Wszystkie pliki", "*.*"))) - PoleKonta.delete(0, 'end') - PoleKonta.insert(0, PoleKontaBrowse.filename) - - PoleKontaBrowse = TK.Button(Ramka2) - PoleKontaBrowse.config(text = '...') - PoleKontaBrowse.config(command = PoleKontaBrowseDialog) - PoleKontaBrowse.config(bg = M_przycisktlo) - PoleKontaBrowse.config(fg = M_przycisktext) - PoleKontaBrowse.config(relief = 'flat') - PoleKontaBrowse.config(activebackground = M_przycisktlo) - PoleKontaBrowse.grid(row = wiersz, column = 2, padx = 5, pady = 3) - - - # Sciezka do office.csv - wiersz = 2 - textOffice = TK.StringVar() - - PoleOfficeLabel = TK.Label(Ramka2) - PoleOfficeLabel.config(text = 'Ściezka do pliku .csv dla office365') - PoleOfficeLabel.config(width = SzerokoscOpisu2) - PoleOfficeLabel.config(bg = M_tlo) - PoleOfficeLabel.config(fg = M_text) - PoleOfficeLabel.grid(row = wiersz, column = 0) - - PoleOffice = TK.Entry(Ramka2) - PoleOffice.config(textvariable = textOffice) - PoleOffice.config(width = SzerokoscPola2) - PoleOffice.config(bg = M_entrytlo) - PoleOffice.config(fg = M_text) - PoleOffice.grid(row = wiersz, column = 1) - - def PoleOfficeBrowseDialog(): - PoleOfficeBrowse.filename = TKfld.askopenfilename(title = "Wybierz plik .csv dla office365", filetypes = (("Pliki csv", "*.csv"), ("Wszystkie pliki", "*.*"))) - PoleOffice.delete(0, 'end') - PoleOffice.insert(0, PoleOfficeBrowse.filename) - - PoleOfficeBrowse = TK.Button(Ramka2) - PoleOfficeBrowse.config(text = '...') - PoleOfficeBrowse.config(command = PoleOfficeBrowseDialog) - PoleOfficeBrowse.config(bg = M_przycisktlo) - PoleOfficeBrowse.config(fg = M_przycisktext) - PoleOfficeBrowse.config(relief = 'flat') - PoleOfficeBrowse.config(activebackground = M_przycisktlo) - PoleOfficeBrowse.grid(row = wiersz, column = 2, padx = 5, pady = 3) - - - # Frame3 - Eksport - Ramka3 = TK.LabelFrame(self) - Ramka3.config(text=' Eksport ') - Ramka3.config(borderwidth = M_framewielkosc) - Ramka3.config(bg = M_tlo) - Ramka3.config(fg = M_text) - Ramka3.grid(row = 3) - - - # Sciezka do pliku poczty - wiersz = 1 - textKontaEksport = TK.StringVar() - - PoleKontaEksportLabel = TK.Label(Ramka3) - PoleKontaEksportLabel.config(text = 'Poczta') - PoleKontaEksportLabel.config(width = SzerokoscOpisu3) - PoleKontaEksportLabel.config(bg = M_tlo) - PoleKontaEksportLabel.config(fg = M_text) - PoleKontaEksportLabel.grid(row = wiersz, column = 0) - - PoleKontaEksport = TK.Entry(Ramka3) - PoleKontaEksport.config(textvariable = textKontaEksport) - PoleKontaEksport.config(width = SzerokoscPola3) - PoleKontaEksport.config(bg = M_entrytlo) - PoleKontaEksport.config(fg = M_text) - PoleKontaEksport.grid(row = wiersz, column = 1) - - def PoleKontaEksportBrowseDialog(): - PoleKontaEksportBrowse.filename = TKfld.askdirectory(title = "Zapisz w...") - PoleKontaEksport.delete(0, 'end') - PoleKontaEksport.insert(0, PoleKontaEksportBrowse.filename) - - PoleKontaEksportBrowse = TK.Button(Ramka3) - PoleKontaEksportBrowse.config(text = '...') - PoleKontaEksportBrowse.config(command = PoleKontaEksportBrowseDialog) - PoleKontaEksportBrowse.config(bg = M_przycisktlo) - PoleKontaEksportBrowse.config(fg = M_przycisktext) - PoleKontaEksportBrowse.config(relief = 'flat') - PoleKontaEksportBrowse.config(activebackground = M_przycisktlo) - PoleKontaEksportBrowse.grid(row = wiersz, column = 2, padx = 5, pady = 3) - - # Sciezka do pliku office - wiersz = 2 - textOfficeEksport = TK.StringVar() - - PoleOfficeEksportLabel = TK.Label(Ramka3) - PoleOfficeEksportLabel.config(text = 'Office') - PoleOfficeEksportLabel.config(width = SzerokoscOpisu3) - PoleOfficeEksportLabel.config(bg = M_tlo) - PoleOfficeEksportLabel.config(fg = M_text) - PoleOfficeEksportLabel.grid(row = wiersz, column = 0) - - PoleOfficeEksport = TK.Entry(Ramka3) - PoleOfficeEksport.config(textvariable = textOfficeEksport) - PoleOfficeEksport.config(width = SzerokoscPola3) - PoleOfficeEksport.config(bg = M_entrytlo) - PoleOfficeEksport.config(fg = M_text) - PoleOfficeEksport.grid(row = wiersz, column = 1) - - def PoleOfficeEksportBrowseDialog(): - PoleOfficeEksportBrowse.filename = TKfld.askdirectory(title = "Zapisz w...",) - PoleOfficeEksport.delete(0, 'end') - PoleOfficeEksport.insert(0, PoleOfficeEksportBrowse.filename) - - PoleOfficeEksportBrowse = TK.Button(Ramka3) - PoleOfficeEksportBrowse.config(text = '...') - PoleOfficeEksportBrowse.config(command = PoleOfficeEksportBrowseDialog) - PoleOfficeEksportBrowse.config(bg = M_przycisktlo) - PoleOfficeEksportBrowse.config(fg = M_przycisktext) - PoleOfficeEksportBrowse.config(relief = 'flat') - PoleOfficeEksportBrowse.config(activebackground = M_przycisktlo) - PoleOfficeEksportBrowse.grid(row = wiersz, column = 2, padx = 5, pady = 3) - - # Przycisk START - def PathPreprocess(): - pass - - PrzyciskSTART = TK.Button(self) - PrzyciskSTART.config(text = 'START') - PrzyciskSTART.config(command = PathPreprocess) - PrzyciskSTART.config(width = 50) - PrzyciskSTART.config(bg = M_przycisktlo) - PrzyciskSTART.config(fg = M_przycisktext) - PrzyciskSTART.config(relief = 'flat') - PrzyciskSTART.config(activebackground = M_przycisktlo) - PrzyciskSTART.grid(row = 4, pady = 15) - - # Pasek dolny - PasekDolny = TK.LabelFrame(self) - PasekDolny.config(bd = 0) - PasekDolny.config(bg = M_tytultlo) - PasekDolny.config(fg = M_tytultext) - PasekDolny.grid(row=5) - - InfoLabel = TK.Label(PasekDolny) - InfoLabel.config(text = Nazwa + ' ' + Wersja + ' | © ' + Autorzy + ' ' + LataPracy + ' dla ZSP Sobolew') - InfoLabel.config(width = 107) - InfoLabel.config(justify = 'left') - InfoLabel.config(anchor='w') - InfoLabel.config(bg = M_tytultlo) - InfoLabel.config(fg = M_tytultext) - InfoLabel.grid(row = 0, column = 0) - - def InfoOpen(): - try: - x = open('readme.txt') - except FileNotFoundError: - MDdlg.err(4) - except: - MDdlg.err(22) - else: - OS.system("notepad readme.txt") - - PrzyciskINFO = TK.Button(PasekDolny) - PrzyciskINFO.config(text = 'Instrukcja') - PrzyciskINFO.config(command = InfoOpen) - PrzyciskINFO.config(bg = M_przycisktlo) - PrzyciskINFO.config(fg = M_przycisktext) - PrzyciskINFO.config(relief = 'flat') - PrzyciskINFO.config(activebackground = M_przycisktlo) - PrzyciskINFO.grid(row = 0, column = 1, padx = 5, pady = 5) - - PrzyciskUSTAWIENIA = TK.Button(PasekDolny) - PrzyciskUSTAWIENIA.config(text = 'Ustawienia') - PrzyciskUSTAWIENIA.config(command = self.settingsButton) - PrzyciskUSTAWIENIA.config(bg = M_przycisktlo) - PrzyciskUSTAWIENIA.config(fg = M_przycisktext) - PrzyciskUSTAWIENIA.config(relief = 'flat') - PrzyciskUSTAWIENIA.grid(row = 0, column = 2, padx = 5, pady = 5) - - def settingsButton(self): - self.child = Settings(self) - - def run(self): - self.mainloop() - -# Okno ustawień -class Settings(TK.Toplevel): - def __init__(self, parent): - # Ustawienia okna - TK.Toplevel.__init__(self, parent) - self.title('Ustawienia') - self.resizable(width = False, height = False) - self.configure(bg = M_tlo) - - liczbawierszy = 0 - - # Tytuł - Tytul = TK.Label(self) - Tytul.config(text = 'Ustawienia') - Tytul.config(width = 40) - Tytul.config(bg = M_tytultlo) - Tytul.config(fg = M_tytultext) - Tytul.config(font = ('Segoe UI Semilight', 20)) - Tytul.grid(row = 0) - - - # Frame1 - Motyw - liczbawierszy += 1 - Ramka1 = TK.LabelFrame(self) - Ramka1.config(text = ' Motyw programu ') - Ramka1.config(bg = M_tlo) - Ramka1.config(fg = M_text) - Ramka1.config(borderwidth = M_framewielkosc) - Ramka1.grid(row = 1, pady = 5) - - - if int(MDlcg.read()[0]) == 1: - Motyw_list_set = 1 - else: - Motyw_list_set = 0 - Motyw_list = TKttk.Combobox(Ramka1) - Motyw_list.config(textvariable = TK.StringVar()) - Motyw_list.config(state = 'readonly') - Motyw_list.config(width = 93) - Motyw_list.grid(row = 0, pady = 5, padx = 5) - Motyw_list['values'] = ('Jasny', 'Ciemny') - Motyw_list.current(Motyw_list_set) - - - # Frame2 - Kodowanie - liczbawierszy += 1 - Ramka2 = TK.LabelFrame(self) - Ramka2.config(text = ' Kodowanie wyjściowe ') - Ramka2.config(bg = M_tlo) - Ramka2.config(fg = M_text) - Ramka2.config(borderwidth = M_framewielkosc) - Ramka2.grid(row = 2, pady = 5) - - Code_list = TKttk.Combobox(Ramka2) - Code_list.config(textvariable = TK.StringVar()) - Code_list.config(state = 'readonly') - Code_list.config(width = 93) - Code_list.grid(row = 0, pady = 5, padx = 5) - Code_list['values'] = ('utf-8') - Code_list.set(MDlcg.read()[1]) - - - # Frame3 - Format plików wejściowych - SzerokoscPolaWej = 35 - WysokoscPolaWej = 8 - - liczbawierszy += 1 - Ramka3 = TK.LabelFrame(self) - Ramka3.config(text = ' Format plików wejściowych ') - Ramka3.config(bg = M_tlo) - Ramka3.config(fg = M_text) - Ramka3.config(borderwidth = M_framewielkosc) - Ramka3.grid(row = 3, pady = 5) - - UczniowieLabel = TK.Label(Ramka3) - UczniowieLabel.config(text = 'Uczniowie') - UczniowieLabel.config(justify = 'center') - UczniowieLabel.config(bg = M_tlo) - UczniowieLabel.config(fg = M_text) - UczniowieLabel.grid(row = 0, column = 0) - - uczfmt = MDlfm.read()[0] - uczfmt = '\n'.join(uczfmt) - UczniowieFormat = TK.Text(Ramka3) - UczniowieFormat.config(width = SzerokoscPolaWej) - UczniowieFormat.config(height = WysokoscPolaWej) - UczniowieFormat.config(bg = M_entrytlo) - UczniowieFormat.config(fg = M_text) - UczniowieFormat.grid(row = 1, column = 0, padx = 5, pady = 5) - UczniowieFormat.insert(TK.END, uczfmt) - - NauczycieleLabel = TK.Label(Ramka3) - NauczycieleLabel.config(text = 'Nauczyciele') - NauczycieleLabel.config(justify = 'center') - NauczycieleLabel.config(bg = M_tlo) - NauczycieleLabel.config(fg = M_text) - NauczycieleLabel.grid(row = 0, column = 1) - - nczfmt = MDlfm.read()[1] - nczfmt = '\n'.join(nczfmt) - NauczycieleFormat = TK.Text(Ramka3) - NauczycieleFormat.config(width = SzerokoscPolaWej) - NauczycieleFormat.config(height = WysokoscPolaWej) - NauczycieleFormat.config(bg = M_entrytlo) - NauczycieleFormat.config(fg = M_text) - NauczycieleFormat.grid(row = 1, column = 1, padx = 5, pady = 5) - NauczycieleFormat.insert(TK.END, nczfmt) - - OpisFmt = TK.LabelFrame(Ramka3) - OpisFmt.config(bg=M_tlo) - OpisFmt.config(fg=M_text) - OpisFmt.config(borderwidth=0) - OpisFmt.grid(row=2, pady=5, columnspan=4) - - Opis1 = TK.Label(OpisFmt) - Opis1.config(text='Dozwolone znaki:') - Opis1.config(bg=M_tlo) - Opis1.config(fg=M_text) - Opis1.grid(row=0, columnspan=7) - - Opis2_1 = TK.Label(OpisFmt) - Opis2_1.config(text='K - Klasa') - Opis2_1.config(bg=M_tlo) - Opis2_1.config(fg=M_text) - Opis2_1.grid(row=1, column=0) - - Opis2_2 = TK.Label(OpisFmt) - Opis2_2.config(text='O - Oddzial') - Opis2_2.config(bg=M_tlo) - Opis2_2.config(fg=M_text) - Opis2_2.grid(row=1, column=1) - - Opis2_3 = TK.Label(OpisFmt) - Opis2_3.config(text='N - Nazwisko') - Opis2_3.config(bg=M_tlo) - Opis2_3.config(fg=M_text) - Opis2_3.grid(row=1, column=2) - - Opis2_4 = TK.Label(OpisFmt) - Opis2_4.config(text='I - Imię') - Opis2_4.config(bg=M_tlo) - Opis2_4.config(fg=M_text) - Opis2_4.grid(row=1, column=3) - - Opis2_5 = TK.Label(OpisFmt) - Opis2_5.config(text='L - Login') - Opis2_5.config(bg=M_tlo) - Opis2_5.config(fg=M_text) - Opis2_5.grid(row=1, column=4) - - Opis2_6 = TK.Label(OpisFmt) - Opis2_6.config(text = 'X - Dane nieznaczące') - Opis2_6.config(bg = M_tlo) - Opis2_6.config(fg = M_text) - Opis2_6.grid(row = 1, column = 5) - - Opis2_6 = TK.Label(OpisFmt) - Opis2_6.config(text='Q - Pusta linia') - Opis2_6.config(bg=M_tlo) - Opis2_6.config(fg=M_text) - Opis2_6.grid(row=1, column=6) - - Opis3 = TK.Label(OpisFmt) - Opis3.config(text='Pozostałe znaki oprócz cyfr i pozostałych liter') - Opis3.config(bg=M_tlo) - Opis3.config(fg=M_text) - Opis3.grid(row=2, columnspan = 7) - - - # Frame4 - Stałe - liczbawierszy += 1 - Ramka4 = TK.LabelFrame(self) - Ramka4.config(text = ' Ustawienia generowania ') - Ramka4.config(bg = M_tlo) - Ramka4.config(fg = M_text) - Ramka4.config(borderwidth = M_framewielkosc) - Ramka4.grid(row = 4, pady = 5) - - - # Długość liceum i branżowej - RamkaDl = TK.LabelFrame(Ramka4) - RamkaDl.config(bg = M_tlo) - RamkaDl.config(fg = M_text) - RamkaDl.config(borderwidth = 0) - RamkaDl.grid(row = 0, pady = 5, columnspan = 2) - - DlLicLabel = TK.Label(RamkaDl) - DlLicLabel.config(text = 'Lata nauki w liceum') - DlLicLabel.config(width = SzerokoscOpisu + 5) - DlLicLabel.config(bg = M_tlo) - DlLicLabel.config(fg = M_text) - DlLicLabel.grid(row = 0, column = 0) - - DlLicValue = TK.IntVar() - DlLicPole = TK.Spinbox(RamkaDl) - DlLicPole.config(textvariable = DlLicValue) - DlLicPole.config(from_ = 1, to = 10) - DlLicPole.config(width = 18) - DlLicPole.config(bg = M_entrytlo) - DlLicPole.config(fg = M_text) - DlLicPole.grid(row = 0, column = 1, padx = 5, pady = 5) - DlLicPole.delete(0, 'end') - DlLicPole.insert(0, int(MDlcg.read()[5])) - - DlBrLabel = TK.Label(RamkaDl) - DlBrLabel.config(text='Lata nauki w branżowej') - DlBrLabel.config(width = SzerokoscOpisu + 5) - DlBrLabel.config(bg = M_tlo) - DlBrLabel.config(fg = M_text) - DlBrLabel.grid(row = 0, column = 2) - - DlBrValue = TK.IntVar() - DlBrPole = TK.Spinbox(RamkaDl) - DlBrPole.config(textvariable = DlBrValue) - DlBrPole.config(from_ = 1, to=10) - DlBrPole.config(width = 18) - DlBrPole.config(bg = M_entrytlo) - DlBrPole.config(fg = M_text) - DlBrPole.grid(row = 0, column = 3, padx = 5, pady = 5) - DlBrPole.delete(0, 'end') - DlBrPole.insert(0, int(MDlcg.read()[6])) - - - # Domena - - DomenaLabel = TK.Label(Ramka4) - DomenaLabel.config(text = 'Domena') - DomenaLabel.config(width = SzerokoscOpisu + 5) - DomenaLabel.config(bg = M_tlo) - DomenaLabel.config(fg = M_text) - DomenaLabel.grid(row = 2, column = 0) - - text1 = TK.StringVar() - PoleDomena = TK.Entry(Ramka4) - PoleDomena.config(textvariable = text1) - PoleDomena.config(width = 69) - PoleDomena.config(bg = M_entrytlo) - PoleDomena.config(fg = M_text) - PoleDomena.grid(row = 2, column = 1, padx = 5, pady = 5) - PoleDomena.insert(0, MDlcg.read()[2]) - - - # Quota - - QuotaLabel = TK.Label(Ramka4) - QuotaLabel.config(text = 'Quota (MB)') - QuotaLabel.config(width = SzerokoscOpisu) - QuotaLabel.config(bg = M_tlo) - QuotaLabel.config(fg = M_text) - QuotaLabel.grid(row = 3, column = 0) - - value2 = TK.IntVar() - PoleQuota = TK.Spinbox(Ramka4) - PoleQuota.config(textvariable = value2) - PoleQuota.config(from_ = 1, to = 100000) - PoleQuota.config(width = 67) - PoleQuota.config(bg = M_entrytlo) - PoleQuota.config(fg = M_text) - PoleQuota.grid(row = 3, column = 1, padx = 5, pady = 5) - PoleQuota.delete(0, 'end') - PoleQuota.insert(0, int(MDlcg.read()[3])) - - - # Kraj - - KrajLabel = TK.Label(Ramka4) - KrajLabel.config(text = 'Kraj') - KrajLabel.config(width = SzerokoscOpisu + 5) - KrajLabel.config(bg = M_tlo) - KrajLabel.config(fg = M_text) - KrajLabel.grid(row = 4, column = 0) - - KrajValue = TK.StringVar() - KrajPole = TK.Entry(Ramka4) - KrajPole.config(textvariable = KrajValue) - KrajPole.config(width = 69) - KrajPole.config(bg = M_entrytlo) - KrajPole.config(fg = M_text) - KrajPole.grid(row = 4, column = 1, padx = 5, pady = 5) - KrajPole.insert(0, MDlcg.read()[4]) - - - # Przycisk ZAPISZ - def save(): - if MDdlg.ask(1): - motyw = Motyw_list.get() - if motyw == 'Jasny': - motyw = '0' - else: - motyw = '1' - kodowanie = Code_list.get() - uczniowiefmt = UczniowieFormat.get('1.0', 'end') - nauczycielefmt = NauczycieleFormat.get('1.0', 'end') - liclata = DlLicPole.get() - brlata = DlBrPole.get() - domena = PoleDomena.get() - quota = PoleQuota.get() - kraj = KrajPole.get() - SettingsToSave = [motyw, kodowanie, domena, quota, kraj, liclata, brlata] - FormatToSave = [uczniowiefmt, nauczycielefmt] - if MDlfm.edit(FormatToSave): - MDlcg.edit(SettingsToSave) - MDdlg.inf(0) - self.destroy() - else: - pass - PrzyciskZAPISZ = TK.Button(self) - PrzyciskZAPISZ.config(text = 'ZAPISZ') - PrzyciskZAPISZ.config(command = save) - PrzyciskZAPISZ.config(width = 50) - PrzyciskZAPISZ.config(bg = M_przycisktlo) - PrzyciskZAPISZ.config(fg = M_przycisktext) - PrzyciskZAPISZ.config(relief = 'flat') - PrzyciskZAPISZ.config(activebackground = M_przycisktlo) - PrzyciskZAPISZ.grid(row = liczbawierszy + 1, pady = 15) - - - -# Inicjacja okna głównego -OknoGlowne = Main() -OknoGlowne.run() \ No newline at end of file + + + # Menu główne + mainMenu = TKttk.Notebook(root) + mainMenu.config(style = "mainMenu.TNotebook") + mainMenu.grid(row = 1) + + # TAB1 - Ikona + iconTab = TK.Frame(mainMenu) + iconTab.config(background = SCvar_gui.color.mainBG) + iconTabImg = PLimg.open(SCvar_gui.image.iconTab) + iconTabImg = iconTabImg.resize((SCvar_gui.dimension.iconTab, SCvar_gui.dimension.iconTab), PLimg.ANTIALIAS) + iconTabImg = PLitk.PhotoImage(iconTabImg) + mainMenu.add(iconTab, image = iconTabImg, state = TK.DISABLED) + + # TAB2 - Generowanie plików + generateTab = TK.Frame(mainMenu) + generateTab.config(background = SCvar_gui.color.mainBG) + generateTabImg = PLimg.open(SCvar_gui.image.generateTab) + generateTabImg = generateTabImg.resize((SCvar_gui.dimension.iconTab, SCvar_gui.dimension.iconTab), PLimg.ANTIALIAS) + generateTabImg = PLitk.PhotoImage(generateTabImg) + mainMenu.add(generateTab, image = generateTabImg) + + # TAB3 - Dołącz do pliku + linkTab = TK.Frame(mainMenu) + linkTab.config(background = SCvar_gui.color.mainBG) + linkTabImg = PLimg.open(SCvar_gui.image.linkTab) + linkTabImg = linkTabImg.resize((SCvar_gui.dimension.iconTab, SCvar_gui.dimension.iconTab), PLimg.ANTIALIAS) + linkTabImg = PLitk.PhotoImage(linkTabImg) + mainMenu.add(linkTab, image = linkTabImg) + + # TAB4 - Łączenie plików + mergeTab = TK.Frame(mainMenu) + mergeTab.config(background = SCvar_gui.color.mainBG) + mergeTabImg = PLimg.open(SCvar_gui.image.mergeTab) + mergeTabImg = mergeTabImg.resize((SCvar_gui.dimension.iconTab, SCvar_gui.dimension.iconTab), PLimg.ANTIALIAS) + mergeTabImg = PLitk.PhotoImage(mergeTabImg) + mainMenu.add(mergeTab, image = mergeTabImg) + + # TAB5 - Ustawienia + settingsTab = TK.Frame(mainMenu) + settingsTab.config(background = SCvar_gui.color.mainBG) + settingsTabImg = PLimg.open(SCvar_gui.image.settingsTab) + settingsTabImg = settingsTabImg.resize((SCvar_gui.dimension.iconTab, SCvar_gui.dimension.iconTab), PLimg.ANTIALIAS) + settingsTabImg = PLitk.PhotoImage(settingsTabImg) + mainMenu.add(settingsTab, image = settingsTabImg) + + # TAB6 - Informacje + infoTab = TK.Frame(mainMenu) + infoTab.config(background = SCvar_gui.color.mainBG) + infoTabImg = PLimg.open(SCvar_gui.image.infoTab) + infoTabImg = infoTabImg.resize((SCvar_gui.dimension.iconTab, SCvar_gui.dimension.iconTab), PLimg.ANTIALIAS) + infoTabImg = PLitk.PhotoImage(infoTabImg) + mainMenu.add(infoTab, image = infoTabImg) + + + + + # TAB2 + tab2Label = TK.Label(generateTab) + tab2Label.config(text = 'GENEROWANIE PLIKÓW CSV') + tab2Label.config(font = (SCvar_gui.fonts.tabHeader[0], SCvar_gui.fonts.tabHeader[1])) + tab2Label.config(bg = SCvar_gui.color.headerBG) + tab2Label.config(fg = SCvar_gui.color.headerText) + tab2Label.config(bd = SCvar_gui.dimension.tabHeaderHeight) + tab2Label.config(width = SCvar_gui.dimension.tabHeaderWidth) + tab2Label.grid(row = 0) + + + + + # TAB3 + tab3Label = TK.Label(linkTab) + tab3Label.config(text = 'DOŁĄCZANIE DO PLIKU CSV') + tab3Label.config(font = (SCvar_gui.fonts.tabHeader[0], SCvar_gui.fonts.tabHeader[1])) + tab3Label.config(bg = SCvar_gui.color.headerBG) + tab3Label.config(fg = SCvar_gui.color.headerText) + tab3Label.config(bd = SCvar_gui.dimension.tabHeaderHeight) + tab3Label.config(width = SCvar_gui.dimension.tabHeaderWidth) + tab3Label.grid(row = 0) + + + + + # TAB4 + tab4Label = TK.Label(mergeTab) + tab4Label.config(text = 'ŁĄCZENIE PLIKÓW CSV') + tab4Label.config(font = (SCvar_gui.fonts.tabHeader[0], SCvar_gui.fonts.tabHeader[1])) + tab4Label.config(bg = SCvar_gui.color.headerBG) + tab4Label.config(fg = SCvar_gui.color.headerText) + tab4Label.config(bd = SCvar_gui.dimension.tabHeaderHeight) + tab4Label.config(width = SCvar_gui.dimension.tabHeaderWidth) + tab4Label.grid(row = 0) + + + + + # TAB5 + tab5Label = TK.Label(settingsTab) + tab5Label.config(text = 'USTAWIENIA') + tab5Label.config(font = (SCvar_gui.fonts.tabHeader[0], SCvar_gui.fonts.tabHeader[1])) + tab5Label.config(bg = SCvar_gui.color.headerBG) + tab5Label.config(fg = SCvar_gui.color.headerText) + tab5Label.config(bd = SCvar_gui.dimension.tabHeaderHeight) + tab5Label.config(width = SCvar_gui.dimension.tabHeaderWidth) + tab5Label.grid(row = 0) + + + + + # TAB6 + tab6Label = TK.Label(infoTab) + tab6Label.config(text = 'INFORMACJE') + tab6Label.config(font = (SCvar_gui.fonts.tabHeader[0], SCvar_gui.fonts.tabHeader[1])) + tab6Label.config(bg = SCvar_gui.color.headerBG) + tab6Label.config(fg = SCvar_gui.color.headerText) + tab6Label.config(bd = SCvar_gui.dimension.tabHeaderHeight) + tab6Label.config(width = SCvar_gui.dimension.tabHeaderWidth) + tab6Label.grid(row = 0) + + # Separator1 + separator1 = TK.Label(infoTab) + separator1.config(bg = SCvar_gui.color.mainBG) + separator1.config(height = SCvar_gui.dimension.separator1Height) + separator1.grid(row = 1) + + # Ikona + programIcon = PLimg.open(SCvar_gui.image.programIconOther) + programIcon = programIcon.resize((SCvar_gui.dimension.programIconInInfo, SCvar_gui.dimension.programIconInInfo), PLimg.ANTIALIAS) + programIcon = PLitk.PhotoImage(programIcon) + programIconPlace = TK.Label(infoTab) + programIconPlace.config(image = programIcon) + programIconPlace.config(background = SCvar_gui.color.mainBG) + programIconPlace.config(height = SCvar_gui.dimension.programIconInInfoPlace) + programIconPlace.grid(row = 2) + + # Nazwa programu + programName = TK.Label(infoTab) + programName.config(text = SCvar_inf.name) + programName.config(font = (SCvar_gui.fonts.info1[0], SCvar_gui.fonts.info1[1])) + programName.config(background = SCvar_gui.color.mainBG) + programName.config(foreground = SCvar_gui.color.headerText) + programName.grid(row = 3) + + # Wersja programu + programVersion = TK.Label(infoTab) + programVersion.config(text = 'Wersja ' + SCvar_inf.version) + programVersion.config(font = (SCvar_gui.fonts.info1[0], SCvar_gui.fonts.info1[2])) + programVersion.config(background = SCvar_gui.color.mainBG) + programVersion.config(foreground = SCvar_gui.color.headerText) + programVersion.grid(row = 4) + + # Separator2 + separator2 = TK.Label(infoTab) + separator2.config(bg = SCvar_gui.color.mainBG) + separator2.config(height = SCvar_gui.dimension.separator2Height) + separator2.grid(row = 5) + + # Copyright + copyrightInfo = TK.Label(infoTab) + copyrightInfo.config(text = '© ' + SCvar_inf.years) + copyrightInfo.config(font = (SCvar_gui.fonts.info1[0], SCvar_gui.fonts.info1[3])) + copyrightInfo.config(background = SCvar_gui.color.mainBG) + copyrightInfo.config(foreground = SCvar_gui.color.headerText) + copyrightInfo.grid(row = 6) + + # Autorzy + authors = '' + for x in SCvar_inf.authors: + authors += (x + '\n') + authors += ('dla ' + SCvar_inf.school) + authorsInfo = TK.Label(infoTab) + authorsInfo.config(text = authors) + authorsInfo.config(font = (SCvar_gui.fonts.info1[0], SCvar_gui.fonts.info1[4])) + authorsInfo.config(background = SCvar_gui.color.mainBG) + authorsInfo.config(foreground = SCvar_gui.color.headerText) + authorsInfo.grid(row = 7) + + # Separator3 + separator3 = TK.Label(infoTab) + separator3.config(bg = SCvar_gui.color.mainBG) + separator3.config(height = SCvar_gui.dimension.separator3Height) + separator3.grid(row = 8) + + + + + # Mainloop + root.mainloop() + + +# Inicjacja okna +gui() \ No newline at end of file diff --git a/modules/__init__.py b/modules/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/modules/__pycache__/__init__.cpython-38.pyc b/modules/__pycache__/__init__.cpython-38.pyc deleted file mode 100644 index 624116c0380c4bfb2728eb58cd17626ae5135615..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 164 zcmWIL<>g`kf=OO~V?p#|5P=LBfgA@QE@lA|DGb33nv8xc8Hzx{2;!?7kn3s{&ryk0@&Ee;!qs2#|P&p^xo0B36{DgXcg diff --git a/modules/__pycache__/dialog.cpython-38.pyc b/modules/__pycache__/dialog.cpython-38.pyc deleted file mode 100644 index dea199b5a4766aae7e48700fe86c01fcb2a6d5cd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4266 zcmcgv&2QX96u0*y**Hll{h$O2ol-zGg4OP}6oC+>v?&UZG-3;tR;j|oo@^X@J*%;Y zjaTIoHR2!OODagI#D#OO+?xF-_R6V84jhsAjlGH1?JnAt(%P~;@6F76KfjNeH($-p z8XB(MzyH1c%`r{;OA-B74#dZJg5Pybv$dL5*J?V`cQdwbXX=^zx~|1kHbv!9R6a#b z*pq$p3aP%SRG*Qerc=~RikeMPM^e;tDe7p7dOk%ROHs#D)QJ?%lPT(j6m=>^y_llr z_GQ9~S(b$rU+UxJSPq<*W1FhhY1Oh{v0wG_wF!LBc$1AnZ3;YMpS`Qq4Er_v9KO@` z>-HP?&e*S3HST;{iTrfQuMx;_IzfayFbs_Dx!#a0k20Cqzl3I0{RQVeBSj#ZZfw{fIDEF>vDdWxOFZXG?e6g(kQMs!Y5s;JX=woEt&F%#~nLZ zf(odfLk}z*kF?Mst+wwxe9$Ty3q4mO_7u+rleiuYl+&LWPJGPWWI;#}bt+KGJz(V$ zET(cS6>*0SjN8aLicA_4+yztq{M5nuwB2$7myU_;qA7oR>e!ry!+d94Xz!Zx$EOYr z%b??r>(EPPyl9RPZObyiqMa-)13i;uRvBw%QGPkv-wu=MQ{+{I{PLXryg=?3iUKO$?r z0*KpIn+7D=xT#tRM=7ul>M88HpN%7S(8g!(yEop%zZgf{u!=+B>lGMs1p=3OBkJ7q z)F$1gO(&o}KWkh=T?&pHK71e|YlE~K4)sZccm8Cka#fKRHE3N`U`-UBEqtYr)&`Gv z3@`<+3)+zKZ78^kS`fQ_leJKyS{oKac`SIli2`|V2cqh#yyh(!m|d17XP}BIB$flsY+qSF)Kr zQnZ=x>hsoCp0rPV_vZqe4B06CKnUHl2A zYyN|k8$P=xoNw96g734HWx+S$hG^fUsGwF3&Lac|l9dKd3mywrlEXo<8FjPJdlSL} zC05gq>NB{7I-aJ?q%i04#AYg@5o)_SOqJO;RcxMw%ECNvJ!YQVQq5TKlX7p9#wHP2 zh%xg*iLDis2^I*{IN=&L=y*8z0#Wsk4Jb6u_ubaj2+h_!8xTc>_xM$EBj{7uv z`*GjT2%Iphnw`a?oCuVY%TcJJ>*jScn?ReUfy-Ts`WExL`W0X*TnXI4kT8@%Ne|Ld zJ(m$jK%2AO$<;3LhrE{YZH#P~nj~nbVJqbLTJ~kD(jWh5XD+VX9F04~0BJPyhe` diff --git a/modules/__pycache__/load_config.cpython-38.pyc b/modules/__pycache__/load_config.cpython-38.pyc deleted file mode 100644 index 9d50b02de85fa98c1f744470895c81d4111165d9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2665 zcmb_e&u<$=6rR~#+Z)G8oQ5W8DPpQ3s1XfLMJ0$(g_NYIR1IxiNH8wZW@l>FUhlfI zyLG&BE={W*L5KsW5=zw*XE<^r`3E@ewOsrMAR#0q-WzWcD@|{BwQqjBdGlu9``$PH zY-}t~;CJ@j(sdV zA+6Ativr5yqW6^|3HwwG#VtM`p zc7fGp#A8S7Jya8*~-13-UHb2 zY_x_3j$pB8xgvIa&u0z6JyG{r%v#F*@4s|dTl#frwIX(Yu<=~GTbg5N*z)&&^DH>x z-UEyK9c%aT!Q$v7Y<|t>%Gr-RT42lN@@Ba_KOen{ZY|r{d*V3_w!CtC`4+PvXq|3j z@5%1ts5Lkioa*4LtnG6 z@HS}T*^u-AgPb;XIUPbZY|||Y_@5r&KGb$}uBW&L^u^_n_6Rplfz6i2jhggpv2u0fyfK0%v=ZMvA zBd{I6BcuUa{!HX6(EN23#PUMzQ%@{O=f0?2^*m9#A^nDELK&w80ku&(AO!}jP{W#W zMNo5ni?7?NLZMia(M5E=sK%FI=U@Q@(KK3sCrgVu_GZ(5mJZJsQ~hu&r@`9BE%tvH z9OPkz!JnWL7ee4+z!UQBMT3MCxD&vMkHVjpW}-bbw~xu%8bNDdXYHF$wrG#;7*EMg zh6C2Nv^v?+d)gAYGrMK<^qp+a08REO<$xgE^WH|7>*>h6J$;pEz_mBYE%FSqjV*93 z=G|QRr!ZGb17zQ=4-$`&PpC|2KGqhP#E&YOiQ%^)$CFnaSFHHq6+iO$GNx2cfL<2S z#*o6|NhSbp43n(Y1_Q2wRLV#MN}_|0Bs=gY5l$-ED%AslWF=n%VZj@m20>IB#_2dF zKr29NP?Ju>tJb|h0V80d!aoNf9uNRrQw1nMOaqobra^-=Tuei*?-+bP4Sx^K?Wf_- zH3GrbdKv`S2(wVu8Wzk@SFJw0MD5eDn$jAT+cx5xAfjPUcp0fm|BrD5I%(hISajbY7y=@VE>jM zc01?G@6MM15SW(uqe#N>kBtu&~#S#1^hTu*Zf+BbW1Occa6YN9Kpr?nPY0v-^--30e z$t1VF&V74*9nR1V60K56aw!!_WK(t0WD5UK94VqC)0T=o9j_gQiP5p3f()?<{Fb JQS%*h>OU3fdmR7( diff --git a/modules/__pycache__/load_format.cpython-38.pyc b/modules/__pycache__/load_format.cpython-38.pyc deleted file mode 100644 index df0cdcc0b34098f88642af91f77bfa117e5c9379..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3541 zcmb_eO>7&-6`t8$E>{#qQ??UDikxohG&R#ir4&1k4MTNeQMTh)aYZGPSp~w1Gf`F~ zcd6kr6cGb zYg#Em$trPvsS&PMQldl&zC6jaJsOsYxYWbaV97mN8sSPe#ppvAahEvjFn1K@enm+s zO^H80Fx!Y{kMJ>`-lG#FZm0e`+A6s~m{LmrEWL)v${Jy#Ed4PlW!Mkt5AK)SX1!`xY+f@za7E4XnlQ2l>XD@!l{&Mns=L*khW2W^;T_zs+W=4z zZLeMSowm7ocn^@CZ?544o14C4Rk?4wj%#jn=I|}o^vznh?C*cuGV8+K5>~Bgo{NBI z>h0W&i4$w?;qM#^R6D$9F}GzMe9|A>d2v(VAul;oq+;VE5}CD8i=B0luAZi1=Ua#Bq1D0j)ewiA1=KNV{uKqKf??SR*mkS5JVIin0DYfHgOu*Jy;bPla+U+H|N{IzofdFAu>R>*Fmy0bZt$ z7YxBW(Z~DE6X0e0c#nqQjrZ~XaU33So&;`4LJ{^L0s*m^O6W|@$R}sVbKON(#|C4{z@5sLDQ2w9l;~mRC zdzwwKXV@g0V$ZT^c7{F2zQ;`VJo`R7%U)nVU@x*CvU4oQUSdCDFSA$J4Er(5vspH` zb*5wZF9rsj#cALLnb9UlMc-G&=SMc%S9d;#^Ec?{ulDu&`*C)I6RGYP0i4N3Du9^5 z2*i!^ODmEH3b%u#yS-5;7bU&b!;YRF_P*0ghUHSv2+Ny2yi+87yN5Bgmqsy$B7@=t z2uWupos;xcNzY4qLDJVGy(sDHl3tQDFX^hJ1xc4BU6J&zr0+_4N76SWElRo|DXf28 z(i@V#C22|0Ym&Yv>6?r z`YpHWI=tjq75fV!=3&A=Z-OXXUVq2o3&Q@0uitbWzJ5oz+q?oXG>%FTpw{~l*@Te1 zj)AMn8|ziqVjGcu5V7RwHB@Xd441C~a^o)`2-V=#6^*88N>%7dD0P~GzBKkhPiAP3 z-XD{V$9#t#4Oc|`)8BnA%=*@f+B{XL0lH>G?PEQlu2XRpc3H-)9z93~I#w94ehn2r z?Lp9ju!G6joJKqf3D!#k*F1!$F!^!@`obUtX;W#9;A{w6$}etoXh6H#LjpkxLRN=v zk&Y5jIBcgO94cKsP~ngMFihrlHoYWE2FjiSp-ovO3Z!E{CClV9I5b#7I)=x`So$VC zvmVn3{?bc;#yw0fBo*I`rLHu1-3rsO`IMxom7F0px6U0ozGzqZlItykFS7!=p11(B z1adDmf!>>FKo;dm-KxU`7FsH&iOV=ZMYp|#c+!s^Jm`41L)-rmDqtZRU}`Xpmg<5fx)hUL21&tvWs;!fcMMNq zYC!iC@dw~a4O0X)=1O~#-EDo9*a<-Zg?S8NuW^W@)rY9F3{*b(dZei?FZWzu{RF zZ$MSNi2`>V-h!flwdlrct>i|;Eo{Gq;wp;kC~lw_pljQ;9hqne+vB-p$V(}?8#zTp z5Rz6Ji%$27TeLpnYcf696mKIW-YbuJgv*TC-d~}w@d60E3=BF2#0?S}k%`CjG+Y#7 z8OG(tWpZPKx#f)wsW#dTaS=LYGQN0(0Jdd8%I0r&|+DPCfk%9e0FJ28; Oi{y0L_&GUaoca#}@J check > 1: - error = int('x') - except: - MDdlg.err(2) - # Linia 2 (utf-8) - - DostepneKodowanieWyjsciowe = ['utf-8'] - try: - if settings[1] not in DostepneKodowanieWyjsciowe: - error = int('x') - except: - MDdlg.err(3) - - # Linia 4 (int) - try: - x = int(settings[3]) - except: - MDdlg.err(17) - - # Linia 6 (int) - try: - x = int(settings[5]) - except: - MDdlg.err(18) - - # Linia 7 (int) - try: - x = int(settings[6]) - except: - MDdlg.err(19) - - -# Odczytywanie ustawień z pliku konfiguracyjnego -def read(): - try: - check = open('.\config.cfg') - except FileNotFoundError: - MDdlg.err(0) - except: - MDdlg.err(20) - else: - with open('.\config.cfg', 'r') as cfg: - config = cfg.read().split('\n') - settings = [] - for x in config: - settings.append(x.split(': ')[1]) - CheckConfig(settings) - return settings - - - -# Zapis ustawień do pliku konfiguracyjnego -def edit(settings): - CheckConfig(settings) - try: - check = open('.\config.cfg') - except FileNotFoundError: - MDdlg.err(0) - except: - MDdlg.err(20) - else: - SettingsToSave = [] - SettingsToSave.append('Ciemny motyw(0/1): ' + str(settings[0]) + '\n') - SettingsToSave.append('Kodowanie wyjsciowe: ' + str(settings[1]) + '\n') - SettingsToSave.append('Domena: ' + str(settings[2]) + '\n') - SettingsToSave.append('Quota: ' + str(settings[3]) + '\n') - SettingsToSave.append('Kraj: ' + str(settings[4]) + '\n') - SettingsToSave.append('Dlugosc liceum: ' + str(settings[5]) + '\n') - SettingsToSave.append('Dlugosc branzowej: ' + str(settings[6])) - with open('.\config.cfg', 'w') as cfg: - for x in SettingsToSave: - cfg.write(x) \ No newline at end of file diff --git a/modules/load_format.py b/modules/load_format.py deleted file mode 100644 index cc65371..0000000 --- a/modules/load_format.py +++ /dev/null @@ -1,249 +0,0 @@ -""" -# GeneratorCSV -# Wersja 4.0 Experimental -# by Mateusz Skoczek -# luty 2019 - grudzień 2019 -# dla ZSP Sobolew - -# -# Moduł zarządzający plikiem formatu -# -""" - - - - - - - - -# ----------------------------------- # Import bibliotek zewnętrznych i modułów # ------------------------------------ # - -# Biblioteki zewnętrzne -import sys as SS - - - -# Moduły składowe programu -try: - from modules import dialog as MDdlg -except ModuleNotFoundError: - print('Wystąpił krytyczny błąd!') - print('Nie znaleziono jednego z modułów programu (dialog.py). Nie można załadować programu') - print('Kod błędu: E00x0011') - wait = input('Naciśnij ENTER aby wyjść') - SS.exit(0) -except Exception as exc: - print('Wystąpił krytyczny błąd!') - print('Nieznany błąd podczas ładowania jednego z modułów programu (dialog.py). Nie można załadować programu.') - print('Treść błędu: ' + str(exc)) - print('Kod błędu: E00x0010') - wait = input('Naciśnij ENTER aby wyjść') - SS.exit(0) - - - - - - - - -# --------------------------------------------------- # Funkcje # ---------------------------------------------------- # - -# Wewnętrzna funkcja sprawdzająca błędy pliku formatu -def CheckFormat(Read, format): - poprawne = True - check = True - while check: - # Uczniowie - uczniowiefmt = '' - for x in format[0]: - uczniowiefmt += x - - # Sprawdzanie pustych linii - try: - if format[0].count('') > 0: - error = int('x') - except: - MDdlg.err(11) - if Read: - SS.exit(0) - else: - poprawne = False - break - - # Sprawdzanie ilości liter K - try: - if uczniowiefmt.count('K') != 1: - error = int('x') - except: - MDdlg.err(6) - if Read: - SS.exit(0) - else: - poprawne = False - break - - # Sprawdzanie ilości liter O - try: - if uczniowiefmt.count('O') != 1: - error = int('x') - except: - MDdlg.err(7) - if Read: - SS.exit(0) - else: - poprawne = False - break - - # Sprawdzanie ilości liter N - try: - if uczniowiefmt.count('N') != 1: - error = int('x') - except: - MDdlg.err(8) - if Read: - SS.exit(0) - else: - poprawne = False - break - - # Sprawdzanie ilości liter I - try: - if uczniowiefmt.count('I') != 1: - error = int('x') - except: - MDdlg.err(9) - if Read: - SS.exit(0) - else: - poprawne = False - break - - # Sprawdzanie ilości liter L - try: - if uczniowiefmt.count('L') != 1: - error = int('x') - except: - MDdlg.err(10) - if Read: - SS.exit(0) - else: - poprawne = False - break - - - # Nauczyciele - nauczycielefmt = '' - for x in format[1]: - nauczycielefmt += x - - # Sprawdzanie pustych linii - try: - if format[1].count('') > 0: - error = int('x') - except: - MDdlg.err(12) - if Read: - SS.exit(0) - else: - poprawne = False - break - - # Sprawdzanie ilości liter N - try: - if nauczycielefmt.count('N') != 1: - error = int('x') - except: - MDdlg.err(13) - if Read: - SS.exit(0) - else: - poprawne = False - break - - # Sprawdzanie ilości liter I - try: - if nauczycielefmt.count('I') != 1: - error = int('x') - except: - MDdlg.err(14) - if Read: - SS.exit(0) - else: - poprawne = False - break - - # Sprawdzanie ilości liter L - try: - if nauczycielefmt.count('L') != 1: - error = int('x') - except: - MDdlg.err(15) - if Read: - SS.exit(0) - else: - poprawne = False - break - - - # Sprawdzanie poprawności znaków - NiedozwoloneZnaki = ['1','2','3','4','5','6','7','8','9','0','W','E','R','T','Y','U','P','A','S','D','F','G','H','J','Z','C','V','B','M'] - try: - for x in NiedozwoloneZnaki: - if x in nauczycielefmt+uczniowiefmt: - error = int('x') - except: - MDdlg.err(16) - if Read: - SS.exit(0) - else: - poprawne = False - break - check = False - if not Read: - return poprawne - - - -# Odczytywanie ustawień z pliku formatu -def read(): - try: - check = open(r'.\format.fmt') - except FileNotFoundError: - MDdlg.err(5) - except: - MDdlg.err(21) - else: - with open(r'.\format.fmt', 'r') as fmt: - fmt = fmt.read().split('\n\n') - format = [] - for x in fmt: - format.append(x.split('\n')) - CheckFormat(True, format) - return format - - - -# Zapis ustawień do pliku formatu -def edit(format): - xformat = [] - for x in format: - xformat.append(x.split('\n')[:-1]) - if CheckFormat(False, xformat): - try: - check = open(r'.\format.fmt') - except FileNotFoundError: - MDdlg.err(5) - except: - MDdlg.err(21) - else: - FormatToSaveX = [] - for x in xformat: - FormatToSaveX.append('\n'.join(x)) - FormatToSave = FormatToSaveX[0] + '\n\n' + FormatToSaveX[1] - with open(r'.\format.fmt', 'w') as fmt: - fmt.write(FormatToSave) - return True - else: - return False diff --git a/readme.txt b/readme.txt deleted file mode 100644 index ae55ab1..0000000 --- a/readme.txt +++ /dev/null @@ -1,107 +0,0 @@ -Program tworzy pliki .csv potrzebne do stworzenia kont uczniów i nauczycieli na szkolnej poczcie i Office 365. -Obecnie program obsługuje tylko 4 pliki z danymi. Program tworzy pliki 'email.csv' do eksportu dla szkolnej poczty oraz 'office.csv' do eksportu dla kont office. -Obecna wersja: 3.0 -Autorzy: Mateusz Skoczek -dla ZSP Sobolew -luty 2019 - grudzień 2019 - - - - - -Format domyślny plików z danymi: - -Legenda: -X - Dane nieznaczące -Q - Pusta linia - -Uczniowie: -# , -# - -# Przykład: -# 1a BS Nowak, Adam 1234567u -# - -Nauczyciele: -# , -# - -# Przykład: -# Nowak, Adam 1234567 -# - -Format można edytować w pliku 'format.py'. Więcej info na dole. - - - - - -Format domyślny pliku 'office.csv': -Uczniowie: -# ,,,,uczeń,,,,,,,,,,Rzeczpospolita Polska - -# Przykład: -# adam.nowak@losobolew.pl,Adam,Nowak,Adam Nowak,uczeń,1a BS,,,,,,,,,Rzeczpospolita Polska - -Nauczyciele: -# ,,,,nauczyciel,,,,,,,,,,Rzeczpospolita Polska - -# Przykład: -# adam.nowak@losobolew.pl,Adam,Nowak,Adam Nowak,nauczyciel,,,,,,,,,,Rzeczpospolita Polska - - - - - -Format domyślny pliku 'email.csv': -Uczniowie: -# ,,500 -| -v -# .@losobolew.pl,:,500 - -# Przykład: -# adam.nowak2021bs@losobolew.pl,1234567u,500 - -Nauczyciele: -# ,,500 -| -v -# .@losobolew.pl,:,500 - -# Przykład: -# adam.nowak@losobolew.pl,1234567,500 - - - - - -Dalsze pojęcia: -błąd programu - błąd programu objawiający się komunikatem -krytyczny błąd programu - nieoczekiwany błąd programu nieobjawiający się komunikatem - - - - - -Pliki: - -changelog.txt -Informacje o zmianach w poszczególnych wersjach programu. - -generator.py -Główny plik programu. Jakiekolwiek naruszenie jego zawartości może spowodować krytyczny błąd programu. - -instrukcja.txt -Plik z instrukcją użytkowania. Usunięcie tego pliku spowoduje błąd programu. - -config.cfg -Plik zawiera ukryte ustawienia programu. Można go edytować, ale należy robić to z rozwagą. Usunięcie go spowoduje błąd programu. -1: Obsługiwane kodowania: 'utf-8', 'cp1252', 'iso-8859-1' - -moduly.py -Plik zawierający moduły niezbędne do działania programu. Usunięcie pliku spowoduje błąd programu. Naruszenie jego zawartości może spowodować krytyczny błąd programu. - -format.py -Plik ten jest skryptem przetwarzającym dane. W razie zmiany formatu pliku z danymi należy go edytować, lecz nie powinna tego robić osoba początkująca, gdyż błędny kod może spowodować krytyczny błąd programu lub niepożądane wyniki. Usunięcie pliku spowoduje błąd programu. \ No newline at end of file diff --git a/src/__pycache__/vars.cpython-38.pyc b/src/__pycache__/vars.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..38f86696ff4db832fb4e28b470cfff69f1a5ad25 GIT binary patch literal 2402 zcmaJ?+iv4T7`7e9cAO?@mudwFgrP_%5_H?Npe{nIsx5STK{wj$L9!x@o0&SMiJcug z?bf&KGjI);T=NLPOUx}-c>wPDW}IV_CD#1;599ey-~4`Fsn`mBf4y>k_^7NX{|I6J zSAcMcm3#_96jwP_h)T3K3ekSnToqD*=#X?s8Y#Avx-q=QR(s1ir4eO*8Z+m(^#bz# z_Kx%I>j7n9pGK+QgX-ee`QA_IFv*YA58#}O( zp6|G=rqhZq;vT)R?JX$Xen_K;g73id!cT>Ch?RT-LKRm<3K~(}0?}NZ6x<@wU4s+@ z)isHM;7x80Sa23y##v<{{;WLbHe0`&OI98SE8@&*cal10Xs ze$De<4gKEOqKkiSB%N*?_qcgYSrWz(FWyq0CEWCfX*Xuc?+Oz=ljPq=;4Z&zKZ)oG z3$JPW425VnS^N{dLe&N=4w&En^N*YMLN@J$b=ucBbbD~iM2+6TO2ny_s*fM3Un=Mn z4^OdqQqToV6c#X{Ln;yj2r+<=A|#VokSs_Bq!O_q*^o?9Mg!Kk84SZ02yMyrw3i2S zt`~ZVBhgb6J+(;DEfK@DiRqS!<*t#ETOl?al(UVogKZ*!C@MVK#EBy;Wn>A`6od%! ziy)dH!uv=EIj>il&@fR7CN$g(J8|^Pzu={dm=VeZTNS#dPe>RALf%aMiCsG%m9U#rj-%bCbNoGDT zvdW|(owygX%-m}1Huf7QVD|R*4)z;DbI>^6+Xr*JBOY9+yFD=aei$8{^4c&;XpeSM zN>FwvDvP4kmF0%P&bepwb-J<&MH$Xl$RWQOn#>!yv(NrF>(B3Iy)bITpaDEhz|#Ue zOMs+3t3cTI1De(RB%x{YKtO04B>P~jh|?}*p4>FH4x%7?Z)^p0Jn_n$>BA*ckWXd0 zz52~w7+p!z`%7>3DGTz~mQO{vDS(c7vN|5%R+!G~<-2_=&!L&G&k0XNu1sK$mnT7^ zqudlB3dWKF39dYGFYO_mfmz*CS-TU_({&Ju>M5Gh*#}TA;aObtL#*ToWQJ#=1sXmi zDn1@M)qe%5e^XUOa{81jE^_%tX4db^I7*YuYSAF3&hxX;8a%KH$ViU(8o2Yiakplr zbTTz~QDnQz4Sz785m}wHbkf36i8$WUtb(E1@?l>>v6Sz0(7p@nEMJl9=fZty+=#^Ll}so=4)2=gBXk)UG;)Ti@iL^+%$9 MiTE(+_o|iu0DwD8ssI20 literal 0 HcmV?d00001 diff --git a/src/vars.py b/src/vars.py new file mode 100644 index 0000000..7fdd26d --- /dev/null +++ b/src/vars.py @@ -0,0 +1,102 @@ +""" +# Generator CSV +# 4.0 Experimental +# by Mateusz Skoczek +# styczeń 2019 - luty 2020 +# dla ZSP Sobolew + +# +# Zmienne +# +""" + + + + + +# ----------------------- # Informacje o programie # ------------------------ # + +class prgInfo: + name = 'Generator CSV' # Nazwa programu + school = 'ZSP Sobolew' # Nazwa szkoły + version = '4.0 Experimental' # Wersja programu + years = '2019 - 2020' # Lata pracy na programem + authors = ['Mateusz Skoczek'] # Autorzy + + + + + +# ------------------- # Zmienne środowiska graficznego # -------------------- # + +class guiVars: + # Wymiary + class dimension: + # Karty + iconTab = 20 # Wielkość ikon w kartach + borderTab = 0 # Szerokość ramki kart + iconPaddingTab = 8 # Margines kart + tabWindowBorderWidth = 0 # Szerokość ramki okna kart + + # Nagłówki kart + tabHeaderHeight = 8 # Wysokość nagłówka + tabHeaderWidth = 80 # Szerokość nagłówka + + # Informacje + programIconInInfo = 100 # Szerokość/wysokość ikony + programIconInInfoPlace = 150 # Wysokość kontrolki zawierającej ikonę + separator1Height = 2 # Wysokość separator1 + separator2Height = 1 # Wysokość separator2 + separator3Height = 4 # Wysokość separator3 + + + # Kolory + class color: + # Głowne + mainBG = '#21242D' # Głowne tło + + # Karty + unselectedTabBG = '#21242D' # Niewybrana karta + selectedTabBG = '#333842' # Wybrana karta + + # Nagłowki kart + headerBG = '#282C34' # Tło + headerText = '#C0C0C0' # Tekst + + + # Grafika + class image: + # Ikona programu + programIcon = 'assets/icon.ico' + programIconOther = 'assets/other_images/icon.png' + + # Ikony kart + iconTab = 'assets/tab_icons/icon.png' + generateTab = 'assets/tab_icons/generate.png' + linkTab = 'assets/tab_icons/link.png' + mergeTab = 'assets/tab_icons/merge.png' + settingsTab = 'assets/tab_icons/settings.png' + infoTab = 'assets/tab_icons/info.png' + + + # Czcionki + class fonts: + # Główne + tabHeader = ['Segoe UI', 12] # Nagłowki + + # Informacje + info1 = ['Segoe UI'] # Czcionka + info1.append(20) # Wielkość tekstu - Nazwa programu + info1.append(10) # Wielkość tekstu - Wersja programu + info1.append(8) # Wielkość tekstu - Copyright + info1.append(8) # Wielkość tekstu - Autorzy + + + # Inne + class other: + # Ustawienia okna + windowHeightResize = False # Rozszerzanie okna w pionie + windowWidthResize = False # Rozszerzanie okna w poziomie + + # Ustawienia kart + tabPosition = 'wn' # Pozycja kart \ No newline at end of file