From f22f5522cf7fc2ae110fdc9e4d01078c52090ca9 Mon Sep 17 00:00:00 2001 From: Mateusz Skoczek Date: Thu, 6 Aug 2020 18:38:31 +0200 Subject: [PATCH] 4.0 Alpha (Build 20181) --- assets/icon.ico | Bin 112027 -> 143535 bytes assets/other_images/icon.png | Bin 4157 -> 0 bytes .../info.png => tab-icons/about.png} | Bin assets/{tab_icons => tab-icons}/format.png | Bin assets/{tab_icons => tab-icons}/generate.png | Bin assets/{tab_icons => tab-icons}/settings.png | Bin assets/tab_icons/icon.png | Bin 4157 -> 0 bytes assets/tab_icons/link.png | Bin 631 -> 0 bytes assets/tab_icons/merge.png | Bin 882 -> 0 bytes changelog-UC.txt | 13 +- config/format.cfg | 9 - default-configs/config.cfg | 1 + default-configs/style.cfg | 72 + format_readme.txt | 0 generator.py | 442 ----- generator.pyw | 1572 +++++++++++++++++ src/load_cfg.py | 0 src/vars.py | 132 -- 18 files changed, 1657 insertions(+), 584 deletions(-) delete mode 100644 assets/other_images/icon.png rename assets/{tab_icons/info.png => tab-icons/about.png} (100%) rename assets/{tab_icons => tab-icons}/format.png (100%) rename assets/{tab_icons => tab-icons}/generate.png (100%) rename assets/{tab_icons => tab-icons}/settings.png (100%) delete mode 100644 assets/tab_icons/icon.png delete mode 100644 assets/tab_icons/link.png delete mode 100644 assets/tab_icons/merge.png delete mode 100644 config/format.cfg create mode 100644 default-configs/config.cfg create mode 100644 default-configs/style.cfg delete mode 100644 format_readme.txt delete mode 100644 generator.py create mode 100644 generator.pyw delete mode 100644 src/load_cfg.py delete mode 100644 src/vars.py diff --git a/assets/icon.ico b/assets/icon.ico index 11e00aac42bb02dc40b1b21338d40411f1f97227..49f2657d956b72b61846b88ec66f59098ecfd126 100644 GIT binary patch literal 143535 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

x$L06^o(PZ#skbr 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 H$W{Lj$*EGf diff --git a/assets/other_images/icon.png b/assets/other_images/icon.png deleted file mode 100644 index 91780fd565e3f45a7ba99abab73ee0c77e6b2a63..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4157 zcmbVP2{@E(+aCK88IxUQ3_@XMEMtt_kR|&Pkuqi;W?~jIBWw1M7E405Y*~7xr107X z6_O=2qIWMCXh!{Gw}Ce#=3Cs7Px%grnplteIux$D>=>}XhkNU{p211{nAuK4f( zydD8&Yy>q3#jpv;022odB?nR%m{3F5H(m^TzOxL6LBBzm0fsQs9fMF0J4Yy%N(Z1i z8Yp!9IL9;hLK2Y=k-^jKai)s#6#WKN-vc2A)o$F-cSk zbcYe=OATfk!q}dE4}nbkMN47)kcllAJQPQRBQ+2^A$8@02;Lk)k{&X3t$&MPT;!dIvs38p1zZ?L}aZJDv zrisu*u=Ayk)O6KEU^I0wT8KkC=|g;n+EEE4zp%fBqA>{Fe}l41hJa(@{v()x$M{j{ zWE?wS5*gkiI# z9=_AC-{XM)&k(=u{iV5o!r3>*&h*z+#eVs9*#Q*x4M%5RWf!%RpdgT7zqPrkYiRyx zegw^RbYHje1_kx3e|Dd3NsK8MzpI_|%}Xh6UZRec=PqC>wRpX%FWIPH{fJB{s&~yV zajQ)!v3gu&AJpF8{b6kr!LJ`q-S^g%zO1{iO$nxVf4!C4s8S}96oY(9 z*?bIMZvZq8INYv=M20=5`TIW|ztGOl=Oa{ZoxeT1$BEzZG&rrK!=${uY)@h~5j3Br zR&Zf2poMbryjXFnDE>Xn-mHf^#v^0SWqP=M6=OJiFxQ!)uf#=m9gp9x<_EmK38o9Xm3IIi>ZcZNx6}V)GF$TT-|&xszxC$DdX=)cFt$SW=T!UVczczmxF3AIB=b?Pq^cml~Oex_@0CskshNDnZ+BuF_)>U{(cXV7W8P(qw>d2pBi=aG$(An z{%RW!3QAD9A}$IA35ES$>FkHgANMuxRCY$0YG6yh45_d1f`cF{`z z9HL%|z?c2JgF}l2n5ckcoqd~94`{%4?=p3aD+GSRYr8ZBLXEmZZu_bFc+Z zOtim?Yi`Gz(z%Dmf{!aW30y8w!cxG+2m6!G5`GVosHpbR=vxh0^SK%D1WU0_xFnp}W4SK(mW7;q?LNy%z9zmho~ z(QIaaNf0cpDv9XTbiO`eqc=BLR1zfaTAGRT;bN!uhGU zv}rp{{b%WU31m7i#h$ z6r3=%cysX1fy`a2sjq7DJM5xIMu}E>_eKy$?UHRoQd4MvOwXx-97)N<;=5^|y8IEl zy%rOg+ih3SW90KMp3)xXIu}I0lCHBifVSp^@Gs1BXr?dfDRidUKFicK!VYXy2&|Gt z3{%hC3!O++9twRuu_kV_aZYsMA!kXi<}hStSJMLq&%hv*qNM>wh~N z_UiHY)YgYC^F9)Ucqe5{u7MyEo7|KL|lEha0Ck9L=(n{B35`!#q;Ks%` zs+Zgt)V-0xo*~ zL-NLrn{sR$k?Ki@t0hIOM82wXQ*=LL7sypta)1CVQvGQcFHP zM%6&69r?-H|9nl^?Vd6&2z$Fd6*2QlQ}XRQJBzG*YEeqO6P=c^C@2v5YU2Sw&- zy-nEamgINn$v75QQL>^@8jH%CT>vRh#oumyq~>YgICP>fSu)NGojZ7K1!AyIkmF-X zaPaG3uJ~eo8BuJM{=nO)y8}%9qP>O^S7t-c9LgQfUMgokI``?JP}`rPQ=Bbs+D;ZO ziWe4$hPeA1CQY&%O97?+9rua*;khr)FWetI99+$xo#Honcv+Cs`~GgBSKE6ECZyI~ zzSKw`Yw6uGc2{1K)Tr1BE7IMBoWu*-Y>9pD9HLXS-PoW6UP)JjS# z_Kn{wotmt)wy2|atgoE@(*bmb+dqx=5c6`VrsVCH_(tcZ2ISGQl4l!;m6cNFk}|>` zEwEjQFjFXCs@4(10zf*y`*YyU<-rZZ^#vy5x3#Jx62z9D4tn)Zyx6CbH~e9SI1gPK zH3f5VHzlo1px=E~%4kT8hA(#I)i=+S%8U0;BnCVT^c)if;S_GmpI2?wwO49yxl*-j zpz99G!dR;Y=Z%%*w_4SsYIF zLlF;>{_GM`dt=w51*yJ#*ZwJNJi2gapEugy3eO)+4pl9+y=0e5gW`yKcr}k5E8;iPTN3ZqQ$61B==7y2U zBT&Ib?h;rrk>9;3iUkdVqyXYq=Df|nUbK+X=rb)Wyu@oz*>4yc64*7i$vI}vxxk~0 z;189;eJOIkx`|ARZFlQD-Yz6HN%-{A##VAheh>jmO&u>Vn`{%FT#|ShQSTElVIOTA mE3&9W+x>cahE-*C{wrT>5+2qIWMCXh!{Gw}Ce#=3Cs7Px%grnplteIux$D>=>}XhkNU{p211{nAuK4f( zydD8&Yy>q3#jpv;022odB?nR%m{3F5H(m^TzOxL6LBBzm0fsQs9fMF0J4Yy%N(Z1i z8Yp!9IL9;hLK2Y=k-^jKai)s#6#WKN-vc2A)o$F-cSk zbcYe=OATfk!q}dE4}nbkMN47)kcllAJQPQRBQ+2^A$8@02;Lk)k{&X3t$&MPT;!dIvs38p1zZ?L}aZJDv zrisu*u=Ayk)O6KEU^I0wT8KkC=|g;n+EEE4zp%fBqA>{Fe}l41hJa(@{v()x$M{j{ zWE?wS5*gkiI# z9=_AC-{XM)&k(=u{iV5o!r3>*&h*z+#eVs9*#Q*x4M%5RWf!%RpdgT7zqPrkYiRyx zegw^RbYHje1_kx3e|Dd3NsK8MzpI_|%}Xh6UZRec=PqC>wRpX%FWIPH{fJB{s&~yV zajQ)!v3gu&AJpF8{b6kr!LJ`q-S^g%zO1{iO$nxVf4!C4s8S}96oY(9 z*?bIMZvZq8INYv=M20=5`TIW|ztGOl=Oa{ZoxeT1$BEzZG&rrK!=${uY)@h~5j3Br zR&Zf2poMbryjXFnDE>Xn-mHf^#v^0SWqP=M6=OJiFxQ!)uf#=m9gp9x<_EmK38o9Xm3IIi>ZcZNx6}V)GF$TT-|&xszxC$DdX=)cFt$SW=T!UVczczmxF3AIB=b?Pq^cml~Oex_@0CskshNDnZ+BuF_)>U{(cXV7W8P(qw>d2pBi=aG$(An z{%RW!3QAD9A}$IA35ES$>FkHgANMuxRCY$0YG6yh45_d1f`cF{`z z9HL%|z?c2JgF}l2n5ckcoqd~94`{%4?=p3aD+GSRYr8ZBLXEmZZu_bFc+Z zOtim?Yi`Gz(z%Dmf{!aW30y8w!cxG+2m6!G5`GVosHpbR=vxh0^SK%D1WU0_xFnp}W4SK(mW7;q?LNy%z9zmho~ z(QIaaNf0cpDv9XTbiO`eqc=BLR1zfaTAGRT;bN!uhGU zv}rp{{b%WU31m7i#h$ z6r3=%cysX1fy`a2sjq7DJM5xIMu}E>_eKy$?UHRoQd4MvOwXx-97)N<;=5^|y8IEl zy%rOg+ih3SW90KMp3)xXIu}I0lCHBifVSp^@Gs1BXr?dfDRidUKFicK!VYXy2&|Gt z3{%hC3!O++9twRuu_kV_aZYsMA!kXi<}hStSJMLq&%hv*qNM>wh~N z_UiHY)YgYC^F9)Ucqe5{u7MyEo7|KL|lEha0Ck9L=(n{B35`!#q;Ks%` zs+Zgt)V-0xo*~ zL-NLrn{sR$k?Ki@t0hIOM82wXQ*=LL7sypta)1CVQvGQcFHP zM%6&69r?-H|9nl^?Vd6&2z$Fd6*2QlQ}XRQJBzG*YEeqO6P=c^C@2v5YU2Sw&- zy-nEamgINn$v75QQL>^@8jH%CT>vRh#oumyq~>YgICP>fSu)NGojZ7K1!AyIkmF-X zaPaG3uJ~eo8BuJM{=nO)y8}%9qP>O^S7t-c9LgQfUMgokI``?JP}`rPQ=Bbs+D;ZO ziWe4$hPeA1CQY&%O97?+9rua*;khr)FWetI99+$xo#Honcv+Cs`~GgBSKE6ECZyI~ zzSKw`Yw6uGc2{1K)Tr1BE7IMBoWu*-Y>9pD9HLXS-PoW6UP)JjS# z_Kn{wotmt)wy2|atgoE@(*bmb+dqx=5c6`VrsVCH_(tcZ2ISGQl4l!;m6cNFk}|>` zEwEjQFjFXCs@4(10zf*y`*YyU<-rZZ^#vy5x3#Jx62z9D4tn)Zyx6CbH~e9SI1gPK zH3f5VHzlo1px=E~%4kT8hA(#I)i=+S%8U0;BnCVT^c)if;S_GmpI2?wwO49yxl*-j zpz99G!dR;Y=Z%%*w_4SsYIF zLlF;>{_GM`dt=w51*yJ#*ZwJNJi2gapEugy3eO)+4pl9+y=0e5gW`yKcr}k5E8;iPTN3ZqQ$61B==7y2U zBT&Ib?h;rrk>9;3iUkdVqyXYq=Df|nUbK+X=rb)Wyu@oz*>4yc64*7i$vI}vxxk~0 z;189;eJOIkx`|ARZFlQD-Yz6HN%-{A##VAheh>jmO&u>Vn`{%FT#|ShQSTElVIOTA 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#)-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$ diff --git a/assets/tab_icons/merge.png b/assets/tab_icons/merge.png deleted file mode 100644 index 19d4ac50d9049d7633b54eea26f3e8dcc19e5ca1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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 diff --git a/changelog-UC.txt b/changelog-UC.txt index 05acea9..d1e8a5c 100644 --- a/changelog-UC.txt +++ b/changelog-UC.txt @@ -61,4 +61,15 @@ - Użycie skryptu instalującego automatycznie bibliotekę PIL 4.0 Alpha (Build 20017) -- Ukończenie wizualnej części karty 'format' \ No newline at end of file +- Ukończenie wizualnej części karty 'format' + +4.0 Alpha (Build 20181) +- Zmiana ikony +- Zmniejszenie liczby kart +- Wstępne ukończenie karty "FORMAT DANYCH" +- Zintegrowanie wszystkich plików składowych do głównego pliku programu +- Przeprojektowanie sposobu ładowania plików konfiguracyjnych +- Zastosowanie systemu styli do interfejsu +- Zastosowanie systemu zapisywania plików konfiguracyjnych i formatu w folderze %appdata% +- Usunięcie konsoli w tle +- Wiele mniejszych zmian \ No newline at end of file diff --git a/config/format.cfg b/config/format.cfg deleted file mode 100644 index ec3a521..0000000 --- a/config/format.cfg +++ /dev/null @@ -1,9 +0,0 @@ -K O N, I X L X -Q - -N, I X L X -Q - -Q - -Q \ No newline at end of file diff --git a/default-configs/config.cfg b/default-configs/config.cfg new file mode 100644 index 0000000..830a432 --- /dev/null +++ b/default-configs/config.cfg @@ -0,0 +1 @@ +secret = entersecretstringhere \ No newline at end of file diff --git a/default-configs/style.cfg b/default-configs/style.cfg new file mode 100644 index 0000000..f1ff54e --- /dev/null +++ b/default-configs/style.cfg @@ -0,0 +1,72 @@ +windowWidth = 1000 +windowHeight = 600 +windowWidthResizable = 0 +windowHeightResizable = 0 +windowMainBG = #21242D +mainIcon = assets/icon.ico +mainMenuBG = #21242D +mainMenuPosition = wn +tabIconsSize = 30 +generateTabIcon = assets/tab-icons/generate.png +tabFramesBorderWidth = 0 +unselectedTabBG = #21242D +menuTabsBorderWidth = 0 +menuTabsPadding = 10 +selectedTabBG = #333842 +disabledTabBG = #333842 +headerFont = Segoe UI;15 +headerBG = #333842 +headerTextColor = #C0C0C0 +headerPadding = 10 +headerWidth = 84 +tabFrameBG = #21242D +formatTabIcon = assets/tab-icons/format.png +settingsTabIcon = assets/tab-icons/settings.png +aboutTabIcon = assets/tab-icons/about.png +tabFramePadding = 10 +label1BG = #21242D +label1TextColor = #C0C0C0 +headerTextAnchor = center +combobox1ArrowColor = #C0C0C0 +combobox1ButtonColor = #333842 +combobox1BorderColor = #21242D +combobox1FieldBackground = #333842 +combobox1TextColor = #C0C0C0 +combobox1Relief = flat +combobox1BorderWidth = 0 +combobox1Padding = 3 +combobox1ListBoxBackground = #333842 +combobox1ListBoxForeground = #C0C0C0 +combobox1ListBoxSelectBackground = #737373 +combobox1ListBoxSelectForeground = #FFFFFF +button1TextAnchor = center +button1Background = #333842 +button1Foreground = #C0C0C0 +button1Padding = 1 +editingPresetSaveButtonWidth = 25 +editingPresetCancelButtonWidth = 25 +loadingButtonWidth = 15 +loadingListWidth = 85 +label2Width = 15 +label2Anchor = center +spinbox1ArrowColor = #C0C0C0 +spinbox1FieldBackground = #333842 +spinbox1Relief = flat +spinbox1BorderWidth = 0 +spinbox1TextColor = #C0C0C0 +spinbox1ButtonColor = #333842 +radiobutton1Background = #21242D +radiobutton1TextColor = #C0C0C0 +entry1FieldBackground = #333842 +entry1Relief = flat +entry1BorderWidth = 0 +entry1Padding = 3 +text1Background = #333842 +text1TextColor = #C0C0C0 +text1Relief = flat +entry1TextColor = #C0C0C0 +label2BG = #21242D +label2TextColor = #C0C0C0 +label3BG = #21242D +label3TextColor = #C0C0C0 +label3Anchor = w \ No newline at end of file diff --git a/format_readme.txt b/format_readme.txt deleted file mode 100644 index e69de29..0000000 diff --git a/generator.py b/generator.py deleted file mode 100644 index 3cc2356..0000000 --- a/generator.py +++ /dev/null @@ -1,442 +0,0 @@ -""" -# Generator CSV -# 4.0 Experimental -# by Mateusz Skoczek -# styczeń 2019 - luty 2020 -# dla ZSP Sobolew - -# -# Główny plik programu -# -""" - - - - - -# -------------------- # Import bibliotek zewnętrznych # -------------------- # - -# Biblioteki główne -import os as OS -import sys as SS -import time as TM - - - -# Framework i inne biblioteki interfejsu graficznego -import tkinter as TK -from tkinter import ttk as TKttk -from tkinter import filedialog as TKfld - -try: - from PIL import ImageTk as PLitk - from PIL import Image as PLimg -except ModuleNotFoundError: - OS.system("python -m pip install pip") - OS.system("python -m pip install Pillow") - OS.system("cls") - from PIL import ImageTk as PLitk - from PIL import Image as PLimg - - - - - -# ------------------ # Import plików składowych programu # ------------------ # - -# Funkcja tworząca plik zawierający logi błędu -def excpt(filename, importingFilename, errorcode, exceptInfo): - filepath = './crashlogs/crash_' + str(TM.localtime()[2]) + str(TM.localtime()[1]) + str(TM.localtime()[0]) + str(TM.localtime()[3]) + str(TM.localtime()[4]) + str(TM.localtime()[5]) + '.txt' - try: - OS.mkdir('./crashlogs') - except: - pass - crashfile = open(filepath, 'w') - crashfile.write('CRASH!\n') - crashfile.write('An error occurred while loading the component file: %s\n' % importingFilename) - crashfile.write('In file: %s\n' % filename) - crashfile.write('%s\n' % exceptInfo) - crashfile.write('Errorcode: %s' % errorcode) - crashfile.close() - SS.exit(0) - - - -# vars.py -try: - from src.vars import prgInfo as SCvar_inf - from src.vars import guiVars as SCvar_gui -except Exception as exceptInfo: - excpt('generator.py', 'variables.py', 'E000000', exceptInfo) #TODO Kod - - - - - -# -------------------------------- # Okno # --------------------------------- # - -# Budowa okna -def gui(): - # Ustawienia okna - root = TK.Tk() - root.title(SCvar_inf.name + " " + SCvar_inf.version) - root.resizable(width = SCvar_gui.other.windowWidthResize, height = SCvar_gui.other.windowHeightResize) - root.configure(bg = SCvar_gui.color.mainBG) - root.iconbitmap(SCvar_gui.image.programIcon) - - - - - # Motyw - TKttk.Style().theme_create("main", parent = "alt", settings = { - "mainMenu.TNotebook":{ - "configure": { - "background": SCvar_gui.color.mainBG, - "tabposition": SCvar_gui.other.tabPosition, - "borderwidth": SCvar_gui.dimension.tabWindowBorderWidth, - } - }, - "mainMenu.TNotebook.Tab":{ - "configure": { - "background": SCvar_gui.color.unselectedTabBG, - "borderwidth": SCvar_gui.dimension.borderTab, - "padding": SCvar_gui.dimension.iconPaddingTab, - }, - "map": { - "background": [("selected", SCvar_gui.color.selectedTabBG), ("disabled", SCvar_gui.color.headerBG)], - } - } - }) - TKttk.Style().theme_use("main") - - - - - # Menu główne - mainMenu = TKttk.Notebook(root) - mainMenu.config(style = "mainMenu.TNotebook") - mainMenu.grid(row = 1) - - # TAB1 - Ikona - iconTab = TK.Frame(mainMenu) - iconTab.config(background = SCvar_gui.color.mainBG) - iconTabImg = PLimg.open(SCvar_gui.image.iconTab) - iconTabImg = iconTabImg.resize((SCvar_gui.dimension.iconTab, SCvar_gui.dimension.iconTab), PLimg.ANTIALIAS) - iconTabImg = PLitk.PhotoImage(iconTabImg) - mainMenu.add(iconTab, image = iconTabImg, state = TK.DISABLED) - - # Generowanie plików - generateTab = TK.Frame(mainMenu) - generateTab.config(background = SCvar_gui.color.mainBG) - generateTabImg = PLimg.open(SCvar_gui.image.generateTab) - generateTabImg = generateTabImg.resize((SCvar_gui.dimension.iconTab, SCvar_gui.dimension.iconTab), PLimg.ANTIALIAS) - generateTabImg = PLitk.PhotoImage(generateTabImg) - mainMenu.add(generateTab, image = generateTabImg) - - # Dołączanie do pliku - linkTab = TK.Frame(mainMenu) - linkTab.config(background = SCvar_gui.color.mainBG) - linkTabImg = PLimg.open(SCvar_gui.image.linkTab) - linkTabImg = linkTabImg.resize((SCvar_gui.dimension.iconTab, SCvar_gui.dimension.iconTab), PLimg.ANTIALIAS) - linkTabImg = PLitk.PhotoImage(linkTabImg) - mainMenu.add(linkTab, image = linkTabImg) - - # Łączenie plików - mergeTab = TK.Frame(mainMenu) - mergeTab.config(background = SCvar_gui.color.mainBG) - mergeTabImg = PLimg.open(SCvar_gui.image.mergeTab) - mergeTabImg = mergeTabImg.resize((SCvar_gui.dimension.iconTab, SCvar_gui.dimension.iconTab), PLimg.ANTIALIAS) - mergeTabImg = PLitk.PhotoImage(mergeTabImg) - mainMenu.add(mergeTab, image = mergeTabImg) - - # Ustawienia - settingsTab = TK.Frame(mainMenu) - settingsTab.config(background = SCvar_gui.color.mainBG) - settingsTabImg = PLimg.open(SCvar_gui.image.settingsTab) - settingsTabImg = settingsTabImg.resize((SCvar_gui.dimension.iconTab, SCvar_gui.dimension.iconTab), PLimg.ANTIALIAS) - settingsTabImg = PLitk.PhotoImage(settingsTabImg) - mainMenu.add(settingsTab, image = settingsTabImg) - - # Format danych - formatTab = TK.Frame(mainMenu) - formatTab.config(background = SCvar_gui.color.mainBG) - formatTabImg = PLimg.open(SCvar_gui.image.formatTab) - formatTabImg = formatTabImg.resize((SCvar_gui.dimension.iconTab, SCvar_gui.dimension.iconTab), PLimg.ANTIALIAS) - formatTabImg = PLitk.PhotoImage(formatTabImg) - mainMenu.add(formatTab, image = formatTabImg) - - # Informacje - infoTab = TK.Frame(mainMenu) - infoTab.config(background = SCvar_gui.color.mainBG) - infoTabImg = PLimg.open(SCvar_gui.image.infoTab) - infoTabImg = infoTabImg.resize((SCvar_gui.dimension.iconTab, SCvar_gui.dimension.iconTab), PLimg.ANTIALIAS) - infoTabImg = PLitk.PhotoImage(infoTabImg) - mainMenu.add(infoTab, image = infoTabImg) - - - - - # TAB2 - tab2Label = TK.Label(generateTab) - tab2Label.config(text = 'GENEROWANIE PLIKÓW CSV') - tab2Label.config(font = (SCvar_gui.fonts.tabHeader[0], SCvar_gui.fonts.tabHeader[1])) - tab2Label.config(bg = SCvar_gui.color.headerBG) - tab2Label.config(fg = SCvar_gui.color.headerText) - tab2Label.config(bd = SCvar_gui.dimension.tabHeaderHeight) - tab2Label.config(width = SCvar_gui.dimension.tabHeaderWidth) - tab2Label.grid(row = 0) - - - - - # TAB3 - tab3Label = TK.Label(linkTab) - tab3Label.config(text = 'DOŁĄCZANIE DO PLIKU CSV') - tab3Label.config(font = (SCvar_gui.fonts.tabHeader[0], SCvar_gui.fonts.tabHeader[1])) - tab3Label.config(bg = SCvar_gui.color.headerBG) - tab3Label.config(fg = SCvar_gui.color.headerText) - tab3Label.config(bd = SCvar_gui.dimension.tabHeaderHeight) - tab3Label.config(width = SCvar_gui.dimension.tabHeaderWidth) - tab3Label.grid(row = 0) - - - - - # TAB4 - tab4Label = TK.Label(mergeTab) - tab4Label.config(text = 'ŁĄCZENIE PLIKÓW CSV') - tab4Label.config(font = (SCvar_gui.fonts.tabHeader[0], SCvar_gui.fonts.tabHeader[1])) - tab4Label.config(bg = SCvar_gui.color.headerBG) - tab4Label.config(fg = SCvar_gui.color.headerText) - tab4Label.config(bd = SCvar_gui.dimension.tabHeaderHeight) - tab4Label.config(width = SCvar_gui.dimension.tabHeaderWidth) - tab4Label.grid(row = 0) - - - - - # SETTINGSTAB - settingsTabLabel = TK.Label(settingsTab) - settingsTabLabel.config(text = 'USTAWIENIA') - settingsTabLabel.config(font = (SCvar_gui.fonts.tabHeader[0], SCvar_gui.fonts.tabHeader[1])) - settingsTabLabel.config(bg = SCvar_gui.color.headerBG) - settingsTabLabel.config(fg = SCvar_gui.color.headerText) - settingsTabLabel.config(bd = SCvar_gui.dimension.tabHeaderHeight) - settingsTabLabel.config(width = SCvar_gui.dimension.tabHeaderWidth) - settingsTabLabel.grid(row = 0) - - - - - # FORMATTAB - formatTabLabel = TK.Label(formatTab) - formatTabLabel.config(text = 'FORMAT DANYCH') - formatTabLabel.config(font = (SCvar_gui.fonts.tabHeader[0], SCvar_gui.fonts.tabHeader[1])) - formatTabLabel.config(bg = SCvar_gui.color.headerBG) - formatTabLabel.config(fg = SCvar_gui.color.headerText) - formatTabLabel.config(bd = SCvar_gui.dimension.tabHeaderHeight) - formatTabLabel.config(width = SCvar_gui.dimension.tabHeaderWidth) - formatTabLabel.grid(row = 0) - - - # Labelframe - Pliki wejściowe - inFilesLabelFrame = TK.LabelFrame(formatTab) - inFilesLabelFrame.config(text = ' Pliki wejściowe ') - inFilesLabelFrame.config(bg = SCvar_gui.color.mainBG) - inFilesLabelFrame.config(fg = SCvar_gui.color.lfText) - inFilesLabelFrame.config(bd = SCvar_gui.dimension.lfBorderwidth) - inFilesLabelFrame.grid(row = 1, pady = SCvar_gui.dimension.framePadY) - - # UczniowieLABEL - inStudentsLABEL = TK.Label(inFilesLabelFrame) - inStudentsLABEL.config(text = 'Uczniowie') - inStudentsLABEL.config(bg = SCvar_gui.color.mainBG) - inStudentsLABEL.config(fg = SCvar_gui.color.label1) - inStudentsLABEL.grid(row = 0, column = 0) - - # Uczniowie inFormatInput - inStudentsFormatInput = TK.Text(inFilesLabelFrame) - inStudentsFormatInput.config(bg = SCvar_gui.color.textboxBG) - inStudentsFormatInput.config(fg = SCvar_gui.color.textboxText) - inStudentsFormatInput.config(bd = SCvar_gui.dimension.tbBorderwidth) - inStudentsFormatInput.config(width = SCvar_gui.dimension.tbWidth) - inStudentsFormatInput.config(height = SCvar_gui.dimension.tbHeight) - inStudentsFormatInput.grid(row = 1, column = 0, padx = SCvar_gui.dimension.tbPad, pady = SCvar_gui.dimension.tbPad) - - # NauczycieleLABEL - inTeachersLABEL = TK.Label(inFilesLabelFrame) - inTeachersLABEL.config(text = 'Nauczyciele') - inTeachersLABEL.config(bg = SCvar_gui.color.mainBG) - inTeachersLABEL.config(fg = SCvar_gui.color.label1) - inTeachersLABEL.grid(row = 0, column = 1) - - # Nauczyciele inFormatInput - inTeachersFormatInput = TK.Text(inFilesLabelFrame) - inTeachersFormatInput.config(bg = SCvar_gui.color.textboxBG) - inTeachersFormatInput.config(fg = SCvar_gui.color.textboxText) - inTeachersFormatInput.config(bd = SCvar_gui.dimension.tbBorderwidth) - inTeachersFormatInput.config(width = SCvar_gui.dimension.tbWidth) - inTeachersFormatInput.config(height = SCvar_gui.dimension.tbHeight) - inTeachersFormatInput.grid(row = 1, column = 1, padx = SCvar_gui.dimension.tbPad, pady = SCvar_gui.dimension.tbPad) - - - # Labelframe - Pliki wejściowe - outFilesLabelFrame = TK.LabelFrame(formatTab) - outFilesLabelFrame.config(text = ' Pliki wyjściowe ') - outFilesLabelFrame.config(bg = SCvar_gui.color.mainBG) - outFilesLabelFrame.config(fg = SCvar_gui.color.lfText) - outFilesLabelFrame.config(bd = SCvar_gui.dimension.lfBorderwidth) - outFilesLabelFrame.grid(row = 2, pady = SCvar_gui.dimension.framePadY) - - # UczniowieLABEL - outStudentsLABEL = TK.Label(outFilesLabelFrame) - outStudentsLABEL.config(text = 'Uczniowie') - outStudentsLABEL.config(bg = SCvar_gui.color.mainBG) - outStudentsLABEL.config(fg = SCvar_gui.color.label1) - outStudentsLABEL.grid(row = 0, column = 0) - - # Uczniowie outFormatInput - outStudentsFormatInput = TK.Entry(outFilesLabelFrame) - outStudentsFormatInput.config(bg = SCvar_gui.color.textboxBG) - outStudentsFormatInput.config(fg = SCvar_gui.color.textboxText) - outStudentsFormatInput.config(bd = SCvar_gui.dimension.tbBorderwidth) - outStudentsFormatInput.config(width = SCvar_gui.dimension.tbWidth2) - outStudentsFormatInput.grid(row = 1, column = 0, padx = SCvar_gui.dimension.tbPad, pady = SCvar_gui.dimension.tbPad) - - # NauczycieleLABEL - outTeachersLABEL = TK.Label(outFilesLabelFrame) - outTeachersLABEL.config(text = 'Nauczyciele') - outTeachersLABEL.config(bg = SCvar_gui.color.mainBG) - outTeachersLABEL.config(fg = SCvar_gui.color.label1) - outTeachersLABEL.grid(row = 0, column = 1) - - # Nauczyciele outFormatInput - outTeachersFormatInput = TK.Entry(outFilesLabelFrame) - outTeachersFormatInput.config(bg = SCvar_gui.color.textboxBG) - outTeachersFormatInput.config(fg = SCvar_gui.color.textboxText) - outTeachersFormatInput.config(bd = SCvar_gui.dimension.tbBorderwidth) - outTeachersFormatInput.config(width = SCvar_gui.dimension.tbWidth2) - outTeachersFormatInput.grid(row = 1, column = 1, padx = SCvar_gui.dimension.tbPad, pady = SCvar_gui.dimension.tbPad) - - - # Frame - Przyciski - formatButtonsFrame = TK.Frame(formatTab) - formatButtonsFrame.config(bg = SCvar_gui.color.mainBG) - formatButtonsFrame.grid(row = 3, pady = SCvar_gui.dimension.framePadY) - - # Zapisz - saveFormatButton = TK.Button(formatButtonsFrame) - saveFormatButton.config(text = 'ZAPISZ') - saveFormatButton.config(bg = SCvar_gui.color.buttonBG) - saveFormatButton.config(fg = SCvar_gui.color.buttonText) - saveFormatButton.config(relief = TK.FLAT) - saveFormatButton.config(activebackground = SCvar_gui.color.buttonBG) - saveFormatButton.config(activeforeground = SCvar_gui.color.buttonText) - saveFormatButton.config(height = SCvar_gui.dimension.bnHeight) - saveFormatButton.config(width = SCvar_gui.dimension.bnWidth) - saveFormatButton.grid(row = 0, column = 0, padx = 5) - - # Pomoc - def saveFormatButtonCommand(): - try: - x = open('format_readme.txt') - except FileNotFoundError: - print('x') - except: - print('x') - else: - OS.system("notepad format_readme.txt") - instructionFormatButton = TK.Button(formatButtonsFrame) - instructionFormatButton.config(text = 'POMOC') - instructionFormatButton.config(bg = SCvar_gui.color.buttonBG) - instructionFormatButton.config(fg = SCvar_gui.color.buttonText) - instructionFormatButton.config(relief = TK.FLAT) - instructionFormatButton.config(activebackground = SCvar_gui.color.buttonBG) - instructionFormatButton.config(activeforeground = SCvar_gui.color.buttonText) - instructionFormatButton.config(height = SCvar_gui.dimension.bnHeight) - instructionFormatButton.config(width = SCvar_gui.dimension.bnWidth2) - instructionFormatButton.config(command = saveFormatButtonCommand) - instructionFormatButton.grid(row = 0, column = 1, padx = 5) - - - - - # INFOTAB - infoTabLabel = TK.Label(infoTab) - infoTabLabel.config(text = 'INFORMACJE') - infoTabLabel.config(font = (SCvar_gui.fonts.tabHeader[0], SCvar_gui.fonts.tabHeader[1])) - infoTabLabel.config(bg = SCvar_gui.color.headerBG) - infoTabLabel.config(fg = SCvar_gui.color.headerText) - infoTabLabel.config(bd = SCvar_gui.dimension.tabHeaderHeight) - infoTabLabel.config(width = SCvar_gui.dimension.tabHeaderWidth) - infoTabLabel.grid(row = 0) - - # Separator1 - separator1 = TK.Label(infoTab) - separator1.config(bg = SCvar_gui.color.mainBG) - separator1.config(height = SCvar_gui.dimension.separator1Height) - separator1.grid(row = 1) - - # Ikona - programIcon = PLimg.open(SCvar_gui.image.programIconOther) - programIcon = programIcon.resize((SCvar_gui.dimension.programIconInInfo, SCvar_gui.dimension.programIconInInfo), PLimg.ANTIALIAS) - programIcon = PLitk.PhotoImage(programIcon) - programIconPlace = TK.Label(infoTab) - programIconPlace.config(image = programIcon) - programIconPlace.config(background = SCvar_gui.color.mainBG) - programIconPlace.config(height = SCvar_gui.dimension.programIconInInfoPlace) - programIconPlace.grid(row = 2) - - # Nazwa programu - programName = TK.Label(infoTab) - programName.config(text = SCvar_inf.name) - programName.config(font = (SCvar_gui.fonts.info1[0], SCvar_gui.fonts.info1[1])) - programName.config(background = SCvar_gui.color.mainBG) - programName.config(foreground = SCvar_gui.color.headerText) - programName.grid(row = 3) - - # Wersja programu - programVersion = TK.Label(infoTab) - programVersion.config(text = 'Wersja ' + SCvar_inf.version) - programVersion.config(font = (SCvar_gui.fonts.info1[0], SCvar_gui.fonts.info1[2])) - programVersion.config(background = SCvar_gui.color.mainBG) - programVersion.config(foreground = SCvar_gui.color.headerText) - programVersion.grid(row = 4) - - # Separator2 - separator2 = TK.Label(infoTab) - separator2.config(bg = SCvar_gui.color.mainBG) - separator2.config(height = SCvar_gui.dimension.separator2Height) - separator2.grid(row = 5) - - # Copyright - copyrightInfo = TK.Label(infoTab) - copyrightInfo.config(text = '© ' + SCvar_inf.years) - copyrightInfo.config(font = (SCvar_gui.fonts.info1[0], SCvar_gui.fonts.info1[3])) - copyrightInfo.config(background = SCvar_gui.color.mainBG) - copyrightInfo.config(foreground = SCvar_gui.color.headerText) - copyrightInfo.grid(row = 6) - - # Autorzy - authorsInfo = TK.Label(infoTab) - authorsInfo.config(text = SCvar_inf.authors + '\ndla ' + SCvar_inf.school) - authorsInfo.config(font = (SCvar_gui.fonts.info1[0], SCvar_gui.fonts.info1[4])) - authorsInfo.config(background = SCvar_gui.color.mainBG) - authorsInfo.config(foreground = SCvar_gui.color.headerText) - authorsInfo.grid(row = 7) - - # Separator3 - separator3 = TK.Label(infoTab) - separator3.config(bg = SCvar_gui.color.mainBG) - separator3.config(height = SCvar_gui.dimension.separator3Height) - separator3.grid(row = 8) - - - - - # Mainloop - root.mainloop() - - -# Inicjacja okna -gui() \ No newline at end of file diff --git a/generator.pyw b/generator.pyw new file mode 100644 index 0000000..37f2a77 --- /dev/null +++ b/generator.pyw @@ -0,0 +1,1572 @@ +""" +# Generator CSV +# Wersja 4.0 +# Autorzy: Mateusz Skoczek +# Styczeń 2019 - Czerwiec 2020 +# dla ZSP Sobolew +""" + + + + + +# ----------------------------------------- # Zmienne # ----------------------------------------- # + +class VARS: + programName = 'Generator CSV' + programVersion = '4.0' + programCustomer = 'ZSP Sobolew' + programAuthors = ['Mateusz Skoczek'] + programToW = ['styczeń', 2019, 'wrzesień', 2020] + + + + + +# --------------------------- # Import wbudowanych bibliotek Pythona # -------------------------- # + + +# Główne +import sys as SS +import os as OS +import time as TM +import codecs as CD +import pathlib as PT +import shutil as SU + + +# GUI +import tkinter as TK +from tkinter import ttk as TKttk +from tkinter import messagebox as TKmsb + +from PIL import ImageTk as PLitk +from PIL import Image as PLimg + + + + + +# ---------------------------------------- # Komunikaty # --------------------------------------- # + + +MSGlist = { + 'E0000' : 'none', + 'E0001' : 'Wystąpił błąd podczas inicjalizacji katalogu z plikami konfiguracyjnymi programu w katalogu %APPDATA%', + 'E0002' : 'Wystąpił błąd podczas ładowania pliku konfiguracyjnego (config.cfg)', + 'E0003' : 'Niepoprawne dane w pliku konfiguracyjnym (config.cfg)', + 'E0004' : 'Wystąpił błąd podczas ładowania pliku stylu (style.cfg)', + 'E0005' : 'Niepoprawne dane w pliku stylu (style.cfg)', + 'E0006' : 'Niepoprawne dane w pliku formatu', + 'A0001' : 'Czy chcesz zapisać? Zostanie utworzony nowy plik', + 'A0002' : 'Czy chcesz zapisać? Plik zostanie nadpisany', +} + +def MSG(code, terminate, *optionalInfo): + try: + optionalInfo[0] + except: + optionalInfo = ('', '') + + # Błędy + if code[0] == 'E': + TKmsb.showerror('Wystąpił błąd!', '%s\n%s' % (MSGlist[code], optionalInfo[0])) + if terminate: + SS.exit(0) + + # Informacja + elif code[0] == 'I': + TKmsb.showerror('Informacja', '%s\n%s' % (MSGlist[code], optionalInfo[0])) + if terminate: + SS.exit(0) + + # Ostrzeżenie + elif code[0] == 'W': + TKmsb.showwarning('Ostrzeżenie', '%s\n%s' % (MSGlist[code], optionalInfo[0])) + if terminate: + SS.exit(0) + + # Zapytania + elif code[0] == 'A': + if TKmsb.askokcancel('Pytanie', '%s\n%s' % (MSGlist[code], optionalInfo[0])): + return True + else: + return False + + + + + +# ------------------------- # Sprawdzanie katalogu programu w APPDATA # ------------------------- # + +appdata = PT.Path.home() / 'Appdata/Roaming' +""" +#TODO +SU.rmtree(str(appdata) + '/Generator CSV') +#TODO +""" +if 'Generator CSV' not in [x for x in OS.listdir(appdata)]: + try: + OS.mkdir(str(appdata) + '/Generator CSV') + SU.copy('default-configs/config.cfg', str(appdata) + '\Generator CSV\config.cfg') + SU.copy('default-configs/style.cfg', str(appdata) + '\Generator CSV\style.cfg') + OS.mkdir(str(appdata) + '/Generator CSV/format-presets') + except Exception as exceptInfo: + MSG('E0001', True, exceptInfo) + + + + + +# ----------------------------- # Ładowanie pliku konfiguracyjnego # ---------------------------- # + +class CFG: + def __checkInstance(self, write): + if write: + try: + file = open((str(appdata) + '\Generator CSV\config.cfg'), 'a') + except Exception as exceptInfo: + MSG('E0002', False, exceptInfo) + return False + else: + if not file.writable(): + MSG('E0002', False, 'Plik tylko do odczytu') + return False + else: + return True + else: + try: + open(str(appdata) + '\Generator CSV\config.cfg') + except Exception as exceptInfo: + MSG('E0002', True, exceptInfo) + + def __checkContent(self, write, content): + if write: + return [True, content] + else: + class functions: + pass + return [True, content] + + def R(self): + self.__checkInstance(False) + content = {} + for x in CD.open((str(appdata) + '\Generator CSV\config.cfg'), 'r', 'utf-8').read().split('\n'): + x = x.split(' = ') + try: + content[x[0]] = (x[1]).strip('\r') + except: + continue + contentCheckingOutput = self.__checkContent(False, content) + if contentCheckingOutput[0]: + return contentCheckingOutput[1] + else: + MSG('E0003', True, contentCheckingOutput[1]) + + def W(self, changes): + content = self.R() + for x in changes: + content[x] = changes[x] + contentCheckingOutput = self.__checkContent(True, content) + if contentCheckingOutput[0]: + if self.__checkInstance(True): + with CD.open((str(appdata) + '\Generator CSV\config.cfg'), 'w', 'utf-8') as file: + contentToSave = contentCheckingOutput[1] + for x in contentToSave: + file.write('%s = %s\n' % (x, str(contentToSave[x]))) + else: + return False + else: + MSG('E0004', False, contentCheckingOutput[1]) +CFG = CFG() +checkInstance = CFG.R() + + + + + +# ---------------------------------- # Ładowanie pliku stylu # ---------------------------------- # + +class GUI: + def __checkInstance(self): + try: + open(str(appdata) + '\Generator CSV\style.cfg') + except Exception as exceptInfo: + MSG('E0004', True, exceptInfo) + + def __checkContent(self, content): + class functions: + def integer(self, var): + if var in list(content.keys()): + try: + check = int(content[var]) + except: + return [False, 'Niepoprawne dane - klucz: %s' % var] + else: + content[var] = int(content[var]) + return [True] + else: + return [False, 'Brak danych - klucz: %s' % var] + def bool(self, var): + if var in list(content.keys()): + if content[var] != '0' and content[var] != '1': + return [False, 'Niepoprawne dane - klucz: %s' % var] + else: + if content[var] == '0': + content[var] = False + return [True] + else: + content[var] = True + return [True] + else: + return [False, 'Brak danych - klucz: %s' % var] + def color(self, var): + if var in list(content.keys()): + if len(content[var]) != 7: + return [False, 'Niepoprawne dane - klucz: %s' % var] + else: + if content[var][0] != '#': + return [False, 'Niepoprawne dane - klucz: %s' % var] + else: + return [True] + else: + return [False, 'Brak danych - klucz: %s' % var] + def file(self, var): + if var in list(content.keys()): + try: + check = open(content[var]) + except: + return [False, 'Niepoprawne dane - klucz: %s' % var] + else: + return [True] + else: + return [False, 'Brak danych - klucz: %s' % var] + def fromArray(self, var, array): + if var in list(content.keys()): + if content[var] not in array: + return [False, 'Niepoprawne dane - klucz: %s' % var] + else: + return [True] + else: + return [False, 'Brak danych - klucz: %s' % var] + def font(self, var): + if var in list(content.keys()): + try: + check = int(content[var].split(';')[1]) + except: + return [False, 'Niepoprawne dane - klucz: %s' % var] + else: + content[var] = (content[var].split(';')[0], int(content[var].split(';')[1])) + return [True] + else: + return [False, 'Brak danych - klucz: %s' % var] + functions = functions() + check = functions.integer('windowWidth') + if not check[0]: + return check + check = functions.integer('windowHeight') + if not check[0]: + return check + check = functions.bool('windowWidthResizable') + if not check[0]: + return check + check = functions.bool('windowHeightResizable') + if not check[0]: + return check + check = functions.color('windowMainBG') + if not check[0]: + return check + check = functions.file('mainIcon') + if not check[0]: + return check + check = functions.color('mainMenuBG') + if not check[0]: + return check + check = functions.fromArray('mainMenuPosition', ['nw', 'ne', 'en', 'es', 'se', 'sw', 'ws', 'wn']) + if not check[0]: + return check + check = functions.integer('tabIconsSize') + if not check[0]: + return check + check = functions.file('generateTabIcon') + if not check[0]: + return check + check = functions.integer('tabFramesBorderWidth') + if not check[0]: + return check + check = functions.color('unselectedTabBG') + if not check[0]: + return check + check = functions.integer('menuTabsBorderWidth') + if not check[0]: + return check + check = functions.integer('menuTabsPadding') + if not check[0]: + return check + check = functions.color('selectedTabBG') + if not check[0]: + return check + check = functions.color('disabledTabBG') + if not check[0]: + return check + check = functions.font('headerFont') + if not check[0]: + return check + check = functions.color('headerBG') + if not check[0]: + return check + check = functions.color('headerTextColor') + if not check[0]: + return check + check = functions.integer('headerPadding') + if not check[0]: + return check + check = functions.integer('headerWidth') + if not check[0]: + return check + check = functions.color('tabFrameBG') + if not check[0]: + return check + check = functions.file('formatTabIcon') + if not check[0]: + return check + check = functions.integer('tabFramePadding') + if not check[0]: + return check + check = functions.color('label1BG') + if not check[0]: + return check + check = functions.color('label1TextColor') + if not check[0]: + return check + check = functions.fromArray('headerTextAnchor', ['center', 'nw', 'n', 'ne', 'w', 'e', 'sw', 's', 'se']) + if not check[0]: + return check + check = functions.color('combobox1ArrowColor') + if not check[0]: + return check + check = functions.color('combobox1ButtonColor') + if not check[0]: + return check + check = functions.color('combobox1BorderColor') + if not check[0]: + return check + check = functions.color('combobox1FieldBackground') + if not check[0]: + return check + check = functions.color('combobox1TextColor') + if not check[0]: + return check + check = functions.fromArray('combobox1Relief', ['flat', 'raised', 'sunken', 'groove', 'ridge']) + if not check[0]: + return check + check = functions.integer('combobox1BorderWidth') + if not check[0]: + return check + check = functions.integer('combobox1Padding') + if not check[0]: + return check + check = functions.color('combobox1ListBoxBackground') + if not check[0]: + return check + check = functions.color('combobox1ListBoxForeground') + if not check[0]: + return check + check = functions.color('combobox1ListBoxSelectBackground') + if not check[0]: + return check + check = functions.color('combobox1ListBoxSelectForeground') + if not check[0]: + return check + check = functions.fromArray('button1TextAnchor', ['center', 'nw', 'n', 'ne', 'w', 'e', 'sw', 's', 'se']) + if not check[0]: + return check + check = functions.color('button1Background') + if not check[0]: + return check + check = functions.color('button1Foreground') + if not check[0]: + return check + check = functions.integer('button1Padding') + if not check[0]: + return check + check = functions.integer('editingPresetSaveButtonWidth') + if not check[0]: + return check + check = functions.integer('editingPresetCancelButtonWidth') + if not check[0]: + return check + check = functions.integer('loadingButtonWidth') + if not check[0]: + return check + check = functions.integer('loadingListWidth') + if not check[0]: + return check + check = functions.integer('label2Width') + if not check[0]: + return check + check = functions.fromArray('label2Anchor', ['center', 'nw', 'n', 'ne', 'w', 'e', 'sw', 's', 'se']) + if not check[0]: + return check + check = functions.color('spinbox1ArrowColor') + if not check[0]: + return check + check = functions.color('spinbox1FieldBackground') + if not check[0]: + return check + check = functions.fromArray('spinbox1Relief', ['flat', 'raised', 'sunken', 'groove', 'ridge']) + if not check[0]: + return check + check = functions.integer('spinbox1BorderWidth') + if not check[0]: + return check + check = functions.color('spinbox1TextColor') + if not check[0]: + return check + check = functions.color('spinbox1ButtonColor') + if not check[0]: + return check + check = functions.color('radiobutton1Background') + if not check[0]: + return check + check = functions.color('radiobutton1TextColor') + if not check[0]: + return check + check = functions.color('entry1FieldBackground') + if not check[0]: + return check + check = functions.fromArray('entry1Relief', ['flat', 'raised', 'sunken', 'groove', 'ridge']) + if not check[0]: + return check + check = functions.integer('entry1BorderWidth') + if not check[0]: + return check + check = functions.integer('entry1Padding') + if not check[0]: + return check + check = functions.color('text1Background') + if not check[0]: + return check + check = functions.color('text1TextColor') + if not check[0]: + return check + check = functions.fromArray('text1Relief', ['flat', 'raised', 'sunken', 'groove', 'ridge']) + if not check[0]: + return check + check = functions.color('entry1TextColor') + if not check[0]: + return check + check = functions.color('label2BG') + if not check[0]: + return check + check = functions.color('label2TextColor') + if not check[0]: + return check + check = functions.color('label3BG') + if not check[0]: + return check + check = functions.color('label3TextColor') + if not check[0]: + return check + check = functions.fromArray('label3Anchor', ['center', 'nw', 'n', 'ne', 'w', 'e', 'sw', 's', 'se']) + if not check[0]: + return check + return [True, content] + + def R(self): + self.__checkInstance() + content = {} + for x in CD.open((str(appdata) + '\Generator CSV\style.cfg'), 'r', 'utf-8').read().split('\n'): + x = x.split(' = ') + try: + content[x[0]] = (x[1]).strip('\r') + except: + continue + contentCheckingOutput = self.__checkContent(content) + if contentCheckingOutput[0]: + return contentCheckingOutput[1] + else: + MSG('E0005', True, contentCheckingOutput[1]) +GUI = GUI() +checkInstance = GUI.R() + + + + + +# ------------------------------- # Zarządzanie plikami formatu # ------------------------------- # + +class FMT: + def __checkFolderInstance(self): + if 'Generator CSV' not in [x for x in OS.listdir(appdata)]: + OS.mkdir(str(appdata) + '/Generator CSV') + else: + if 'format-presets' not in [x for x in OS.listdir(str(appdata) + '\Generator CSV')]: + OS.mkdir(str(appdata) + '/Generator CSV/format-presets') + + def __checkContent(self, write, content): + if write: + class functions: + def bool(self, var): + if var in list(content.keys()): + if content[var] != True and content[var] != False: + return [False, 'Niepoprawne dane - klucz: %s' % var] + else: + if content[var] == False: + content[var] = '0' + return [True] + else: + content[var] = '1' + return [True] + else: + return [False, 'Brak danych - klucz: %s' % var] + def string(self, var): + if var in list(content.keys()): + return [True] + else: + return [False, 'Brak danych - klucz: %s' % var] + def array(self, var): + if var in list(content.keys()): + content[var] = 'I'.join(content[var]) + return [True] + else: + return [False, 'Brak danych - klucz: %s' % var] + def integer(self, var): + if var in list(content.keys()): + content[var] = str(content[var]) + return [True] + else: + return [False, 'Brak danych - klucz: %s' % var] + functions = functions() + check = functions.bool('student') + if not check[0]: + return check + check = functions.string('personSeparator') + if not check[0]: + return check + check = functions.string('rowSeparator') + if not check[0]: + return check + check = functions.array('dataSeparators') + if not check[0]: + return check + check = functions.integer('loginRow') + if not check[0]: + return check + check = functions.integer('loginPositionInRow') + if not check[0]: + return check + check = functions.integer('fnameRow') + if not check[0]: + return check + check = functions.integer('fnamePositionInRow') + if not check[0]: + return check + check = functions.integer('lnameRow') + if not check[0]: + return check + check = functions.integer('lnamePositionInRow') + if not check[0]: + return check + check = functions.integer('schoolRow') + if not check[0]: + return check + check = functions.integer('schoolPositionInRow') + if not check[0]: + return check + check = functions.integer('classRow') + if not check[0]: + return check + check = functions.integer('classPositionInRow') + if not check[0]: + return check + return [True, content] + else: + class functions: + def bool(self, var): + if var in list(content.keys()): + if content[var] != '0' and content[var] != '1': + return [False, 'Niepoprawne dane - klucz: %s' % var] + else: + if content[var] == '0': + content[var] = False + return [True] + else: + content[var] = True + return [True] + else: + return [False, 'Brak danych - klucz: %s' % var] + def string(self, var): + if var in list(content.keys()): + return [True] + else: + return [False, 'Brak danych - klucz: %s' % var] + def array(self, var): + if var in list(content.keys()): + content[var] = content[var].split('I') + return [True] + else: + return [False, 'Brak danych - klucz: %s' % var] + def integer(self, var): + if var in list(content.keys()): + try: + check = int(content[var]) + except: + return [False, 'Niepoprawne dane - klucz: %s' % var] + else: + content[var] = int(content[var]) + return [True] + else: + return [False, 'Brak danych - klucz: %s' % var] + functions = functions() + check = functions.bool('student') + if not check[0]: + return check + check = functions.string('personSeparator') + if not check[0]: + return check + check = functions.string('rowSeparator') + if not check[0]: + return check + check = functions.array('dataSeparators') + if not check[0]: + return check + check = functions.integer('loginRow') + if not check[0]: + return check + check = functions.integer('loginPositionInRow') + if not check[0]: + return check + check = functions.integer('fnameRow') + if not check[0]: + return check + check = functions.integer('fnamePositionInRow') + if not check[0]: + return check + check = functions.integer('lnameRow') + if not check[0]: + return check + check = functions.integer('lnamePositionInRow') + if not check[0]: + return check + check = functions.integer('schoolRow') + if not check[0]: + return check + check = functions.integer('schoolPositionInRow') + if not check[0]: + return check + check = functions.integer('classRow') + if not check[0]: + return check + check = functions.integer('classPositionInRow') + if not check[0]: + return check + return [True, content] + + def getList(self): + self.__checkFolderInstance() + filesList = OS.listdir(str(appdata) + '/Generator CSV/format-presets') + formatPresetsList = [] + for x in filesList: + if x[-4:] == '.fmt': + formatPresetsList.append(x[:-4]) + else: + continue + return formatPresetsList + + def R(self, preset): + if preset in self.getList(): + path = str(appdata) + '/Generator CSV/format-presets/%s.fmt' % preset + file = CD.open(path, 'r', 'utf-8').read().split('\n') + content = {} + for x in file: + x = x.split(' = ') + try: + content[x[0]] = (x[1]).strip('\r') + except: + continue + contentCheckingOutput = self.__checkContent(False, content) + if contentCheckingOutput[0]: + content = contentCheckingOutput[1] + else: + MSG('E0006', False, contentCheckingOutput[1]) + else: + content = { + "student" : True, + "personSeparator" : '', + "rowSeparator" : '', + "dataSeparators" : [], + "loginRow" : 0, + "loginPositionInRow" : 0, + "fnameRow" : 0, + "fnamePositionInRow" : 0, + "lnameRow" : 0, + "lnamePositionInRow" : 0, + "schoolRow" : 0, + "schoolPositionInRow" : 0, + "classRow" : 0, + "classPositionInRow" : 0, + } + return content + + def W(self, preset, content): + contentCheckingOutput = self.__checkContent(True, content) + if contentCheckingOutput[0]: + contentToSave = contentCheckingOutput[1] + with CD.open(str(appdata) + '/Generator CSV/format-presets/%s.fmt' % preset, 'w', 'utf-8') as file: + for x in contentToSave: + file.write(x + ' = ' + content[x] + '\n') + else: + MSG('E0006', False, contentCheckingOutput[1]) +FMT = FMT() + + + + + +# ------------------------------------------- # GUI # ------------------------------------------- # + +def window(): + # Ustawienia okna + window = TK.Tk() + window.title('%s %s' % (VARS.programName, VARS.programVersion)) + window.geometry('%sx%s' % (str(GUI.R()['windowWidth']), str(GUI.R()['windowHeight']))) + window.resizable(width = GUI.R()['windowWidthResizable'], height = GUI.R()['windowHeightResizable']) + window.configure(bg = GUI.R()['windowMainBG']) + window.iconbitmap(GUI.R()['mainIcon']) + + + + # Theme + TKttk.Style().theme_create("main", parent = "default", settings = { + "mainMenu.TNotebook": { + "configure": { + "background": GUI.R()['mainMenuBG'], + "tabposition": GUI.R()['mainMenuPosition'], + "borderwidth": GUI.R()['tabFramesBorderWidth'], + }, + }, + "mainMenu.TNotebook.Tab": { + "configure": { + "background": GUI.R()['unselectedTabBG'], + "borderwidth": GUI.R()['menuTabsBorderWidth'], + "padding": GUI.R()['menuTabsPadding'], + }, + "map": { + "background": [ + ("selected", GUI.R()['selectedTabBG']), + ("disabled", GUI.R()['disabledTabBG']), + ] + } + }, + "mainMenuTabFrame.TFrame": { + "configure": { + "background": GUI.R()['tabFrameBG'], + }, + }, + "tabHeader.TLabel": { + "configure": { + "font": GUI.R()['headerFont'], + "background": GUI.R()['headerBG'], + "foreground": GUI.R()['headerTextColor'], + "padding": GUI.R()['headerPadding'], + "anchor": GUI.R()['headerTextAnchor'], + }, + }, + "tabFrame.TFrame": { + "configure": { + "background": GUI.R()['tabFrameBG'], + }, + }, + "layoutFrame.TFrame": { + "configure": { + "background": GUI.R()['tabFrameBG'], + }, + }, + "label1.TLabel": { + "configure": { + "background": GUI.R()['label1BG'], + "foreground": GUI.R()['label1TextColor'] + }, + }, + "label2.TLabel": { + "configure": { + "background": GUI.R()['label2BG'], + "foreground": GUI.R()['label2TextColor'], + "anchor": GUI.R()['label2Anchor'], + "width": GUI.R()['label2Width'], + }, + }, + "combobox1.TCombobox": { + "configure": { + "arrowcolor": GUI.R()['combobox1ArrowColor'], + "background": GUI.R()['combobox1ButtonColor'], + "bordercolor": GUI.R()['combobox1BorderColor'], + "fieldbackground": GUI.R()['combobox1FieldBackground'], + "foreground": GUI.R()['combobox1TextColor'], + "relief": GUI.R()['combobox1Relief'], + "borderwidth": GUI.R()['combobox1BorderWidth'], + "padding": GUI.R()['combobox1Padding'], + }, + }, + "button1.TButton": { + "configure": { + "anchor": GUI.R()['button1TextAnchor'], + "background": GUI.R()['button1Background'], + "foreground": GUI.R()['button1Foreground'], + "padding": GUI.R()['button1Padding'], + }, + }, + "separator1.TSeparator": { + "configure": { + "background": GUI.R()['tabFrameBG'], + }, + }, + "spinbox1.TSpinbox": { + "configure": { + "arrowcolor": GUI.R()['spinbox1ArrowColor'], + "fieldbackground": GUI.R()['spinbox1FieldBackground'], + "relief": GUI.R()['spinbox1Relief'], + "borderwidth": GUI.R()['spinbox1BorderWidth'], + "foreground": GUI.R()['spinbox1TextColor'], + "background": GUI.R()['spinbox1ButtonColor'] + }, + }, + 'radiobutton1.TRadiobutton': { + "configure": { + "background": GUI.R()['radiobutton1Background'], + "foreground": GUI.R()['radiobutton1TextColor'], + }, + }, + "entry1.TEntry": { + "configure": { + "fieldbackground": GUI.R()['entry1FieldBackground'], + "relief": GUI.R()['entry1Relief'], + "borderwidth": GUI.R()['entry1BorderWidth'], + "padding": GUI.R()['entry1Padding'], + "foreground": GUI.R()['entry1TextColor'] + } + } + }) + TKttk.Style().theme_use("main") + + + + # Menu główne + mainMenu = TKttk.Notebook(window, width = window.winfo_width() - (2 * GUI.R()['menuTabsPadding'] + GUI.R()['tabIconsSize']), height = window.winfo_height()) + mainMenu.config(style = "mainMenu.TNotebook") + mainMenu.grid(row = 0) + + # Ikona + iconTab = TKttk.Frame(mainMenu) + iconTabImg = PLimg.open(GUI.R()['mainIcon']) + iconTabImg = iconTabImg.resize((GUI.R()['tabIconsSize'], GUI.R()['tabIconsSize']), PLimg.ANTIALIAS) + iconTabImg = PLitk.PhotoImage(iconTabImg) + mainMenu.add(iconTab, image = iconTabImg, state = TK.DISABLED) + + + + # TAB2 - Generator ################################################### + + generateTab = TKttk.Frame(mainMenu) + generateTab.config(style = "mainMenuTabFrame.TFrame") + generateTabImg = PLimg.open(GUI.R()['generateTabIcon']) + generateTabImg = generateTabImg.resize((GUI.R()['tabIconsSize'], GUI.R()['tabIconsSize']), PLimg.ANTIALIAS) + generateTabImg = PLitk.PhotoImage(generateTabImg) + mainMenu.add(generateTab, image = generateTabImg, state = TK.NORMAL) + + + # Nagłówek + generateHeader = TKttk.Label(generateTab) + generateHeader.config(style = 'tabHeader.TLabel') + generateHeader.config(text = 'GENERATOR CSV') + generateHeader.pack(fill = TK.X) + + + # Zawartość + generateFrame = TKttk.Frame(generateTab) + generateFrame.config(style = 'tabFrame.TFrame') + generateFrame.pack(fill = TK.BOTH, expand = 1, padx = GUI.R()['tabFramePadding'], pady = GUI.R()['tabFramePadding']) + + ###################################################################### + + + + # TAB3 - Format ###################################################### + + formatTab = TKttk.Frame(mainMenu) + formatTab.config(style = "mainMenuTabFrame.TFrame") + formatTabImg = PLimg.open(GUI.R()['formatTabIcon']) + formatTabImg = formatTabImg.resize((GUI.R()['tabIconsSize'], GUI.R()['tabIconsSize']), PLimg.ANTIALIAS) + formatTabImg = PLitk.PhotoImage(formatTabImg) + mainMenu.add(formatTab, image = formatTabImg, state = TK.NORMAL) + + + # Nagłówek + formatHeader = TKttk.Label(formatTab) + formatHeader.config(style = 'tabHeader.TLabel') + formatHeader.config(text = 'FORMAT DANYCH') + formatHeader.pack(fill = TK.X) + + + # Zawartość + formatFrame = TKttk.Frame(formatTab) + formatFrame.config(style = 'tabFrame.TFrame') + formatFrame.pack(fill = TK.BOTH, expand = 1, padx = GUI.R()['tabFramePadding'], pady = GUI.R()['tabFramePadding']) + + + # (1) Ładowanie presetu ##################### + + loadingPresetFrame = TKttk.Frame(formatFrame) + loadingPresetFrame.config(style = 'layoutFrame.TFrame') + loadingPresetFrame.pack(fill = TK.X) + + # "Wybierz preset do edycji lub wpisz nazwę nowego" + loadingListLabel = TKttk.Label(loadingPresetFrame) + loadingListLabel.config(style = 'label1.TLabel') + loadingListLabel.config(text = 'Wybierz preset do edycji lub wpisz nazwę nowego') + loadingListLabel.pack(side = 'left') + + # Rozwijana lista presetów + loadingListVar = TK.StringVar() + loadingList = TKttk.Combobox(loadingPresetFrame) + loadingList.config(textvariable = loadingListVar) + loadingList.config(style = 'combobox1.TCombobox') + loadingList.config(width = GUI.R()['loadingListWidth']) + loadingList.option_add("*TCombobox*Listbox.background", GUI.R()['combobox1ListBoxBackground']) + loadingList.option_add("*TCombobox*Listbox.foreground", GUI.R()['combobox1ListBoxForeground']) + loadingList.option_add("*TCombobox*Listbox.selectBackground", GUI.R()['combobox1ListBoxSelectBackground']) + loadingList.option_add("*TCombobox*Listbox.selectForeground", GUI.R()['combobox1ListBoxSelectForeground']) + loadingList.pack(side = 'left', padx = 5) + loadingList['values'] = tuple(FMT.getList()) + + # Przycisk "WCZYTAJ" + formatFileContent = { + "student" : True, + "personSeparator" : '', + "rowSeparator" : '', + "dataSeparators" : [], + "loginRow" : 0, + "loginPositionInRow" : 0, + "fnameRow" : 0, + "fnamePositionInRow" : 0, + "lnameRow" : 0, + "lnamePositionInRow" : 0, + "schoolRow" : 0, + "schoolPositionInRow" : 0, + "classRow" : 0, + "classPositionInRow" : 0, + } + def loadingButtonAction(): + formatFileContent = FMT.R(loadingList.get()) + loadingList['state'] = TK.DISABLED + loadingButton['state'] = TK.DISABLED + EPOSTypeStudentRadiobutton['state'] = TK.NORMAL + EPOSTypeTeacherRadiobutton['state'] = TK.NORMAL + if formatFileContent['student']: + EPOSTypeVar.set('s') + else: + EPOSTypeVar.set('t') + EPOSPersonSeparatorEntry['state'] = TK.NORMAL + EPOSPersonSeparatorVar.set(formatFileContent['personSeparator']) + EPOSRowSeparatorEntry['state'] = TK.NORMAL + EPOSRowSeparatorVar.set(formatFileContent['rowSeparator']) + EPOSDataSeparatorText['state'] = TK.NORMAL + EPOSDataSeparatorText.insert(TK.END, '\n'.join(formatFileContent['dataSeparators'])) + EPDataLocalizationLoginRowSpinbox['state'] = TK.NORMAL + EPDataLocalizationLoginRowVar.set(formatFileContent['loginRow']) + EPDataLocalizationLoginPosInRowSpinbox['state'] = TK.NORMAL + EPDataLocalizationLoginPosInRowVar.set(formatFileContent['loginPositionInRow']) + EPDataLocalizationFnameRowSpinbox['state'] = TK.NORMAL + EPDataLocalizationFnameRowVar.set(formatFileContent['fnameRow']) + EPDataLocalizationFnamePosInRowSpinbox['state'] = TK.NORMAL + EPDataLocalizationFnamePosInRowVar.set(formatFileContent['fnamePositionInRow']) + EPDataLocalizationLnameRowSpinbox['state'] = TK.NORMAL + EPDataLocalizationLnameRowVar.set(formatFileContent['lnameRow']) + EPDataLocalizationLnamePosInRowSpinbox['state'] = TK.NORMAL + EPDataLocalizationLnamePosInRowVar.set(formatFileContent['lnamePositionInRow']) + EPDataLocalizationSchoolRowSpinbox['state'] = TK.NORMAL + EPDataLocalizationSchoolRowVar.set(formatFileContent['schoolRow']) + EPDataLocalizationSchoolPosInRowSpinbox['state'] = TK.NORMAL + EPDataLocalizationSchoolPosInRowVar.set(formatFileContent['schoolPositionInRow']) + EPDataLocalizationClassRowSpinbox['state'] = TK.NORMAL + EPDataLocalizationClassRowVar.set(formatFileContent['classRow']) + EPDataLocalizationClassPosInRowSpinbox['state'] = TK.NORMAL + EPDataLocalizationClassPosInRowVar.set(formatFileContent['classPositionInRow']) + editingPresetSaveButton['state'] = TK.NORMAL + editingPresetCancelButton['state'] = TK.NORMAL + loadingButton = TKttk.Button(loadingPresetFrame) + loadingButton.config(style = 'button1.TButton') + loadingButton.config(command = loadingButtonAction) + loadingButton.config(width = GUI.R()['loadingButtonWidth']) + loadingButton.config(text = 'WCZYTAJ') + loadingButton.pack(side = 'right') + + ############################################# + + # (1) Separator 1 ########################### + + formatSeparator1 = TKttk.Separator(formatFrame) + formatSeparator1.config(style = 'separator1.TSeparator') + formatSeparator1.config(orient = TK.HORIZONTAL) + formatSeparator1.pack(fill = TK.X, pady = 10) + + ############################################# + + # (1) Edycja presetu ######################## + + editingPresetFrame = TKttk.Frame(formatFrame) + editingPresetFrame.config(style = 'layoutFrame.TFrame') + editingPresetFrame.pack(fill = TK.BOTH, expand = 1) + + # (2) Ustawienia ################## + + editingPresetSettingsFrame = TKttk.Frame(editingPresetFrame) + editingPresetSettingsFrame.config(style = 'layoutFrame.TFrame') + editingPresetSettingsFrame.pack(fill = TK.BOTH, expand = 1) + + # (3) Inne ustawienia ### + + editingPresetOtherSettingsFrame = TKttk.Frame(editingPresetSettingsFrame) + editingPresetOtherSettingsFrame.config(style = 'layoutFrame.TFrame') + editingPresetOtherSettingsFrame.pack(fill = TK.BOTH, expand = 1, side = TK.LEFT) + + # (4) Typ osoby + + editingPresetOSFrame = TKttk.Frame(editingPresetOtherSettingsFrame) + editingPresetOSFrame.config(style = 'layoutFrame.TFrame') + editingPresetOSFrame.pack(fill = TK.BOTH, expand = 1, side = TK.BOTTOM, pady = 5) + + # "Typ osoby" + EPOSTypeLabel = TKttk.Label(editingPresetOSFrame) + EPOSTypeLabel.config(style = 'label1.TLabel') + EPOSTypeLabel.config(text = 'Typ osoby') + EPOSTypeLabel.grid(row = 0, column = 0, pady = 5, sticky = 'w') + + # Typ osoby - Radiobutton + EPOSTypeVar = TK.StringVar() + + EPOSTypeStudentRadiobutton = TKttk.Radiobutton(editingPresetOSFrame) + EPOSTypeStudentRadiobutton.config(style = 'radiobutton1.TRadiobutton') + EPOSTypeStudentRadiobutton.config(variable = EPOSTypeVar) + EPOSTypeStudentRadiobutton.config(value = 's') + EPOSTypeStudentRadiobutton.config(state = TK.DISABLED) + EPOSTypeStudentRadiobutton.config(width = 20) + EPOSTypeStudentRadiobutton.config(text = 'Uczniowie') + + EPOSTypeTeacherRadiobutton = TKttk.Radiobutton(editingPresetOSFrame) + EPOSTypeTeacherRadiobutton.config(style = 'radiobutton1.TRadiobutton') + EPOSTypeTeacherRadiobutton.config(variable = EPOSTypeVar) + EPOSTypeTeacherRadiobutton.config(value = 't') + EPOSTypeTeacherRadiobutton.config(state = TK.DISABLED) + EPOSTypeTeacherRadiobutton.config(width = 20) + EPOSTypeTeacherRadiobutton.config(text = 'Nauczyciele') + + EPOSTypeStudentRadiobutton.grid(row = 0, column = 1, pady = 5) + EPOSTypeTeacherRadiobutton.grid(row = 0, column = 2, pady = 5) + + # "Separator pomiędzy osobami" + EPOSPersonSeparatorLabel = TKttk.Label(editingPresetOSFrame) + EPOSPersonSeparatorLabel.config(style = 'label1.TLabel') + EPOSPersonSeparatorLabel.config(text = 'Separator pomiędzy osobami') + EPOSPersonSeparatorLabel.grid(row = 1, column = 0, pady = 5, sticky = 'w') + + # Entry - Separator pomiedzy osobami + EPOSPersonSeparatorVar = TK.StringVar() + EPOSPersonSeparatorEntry = TKttk.Entry(editingPresetOSFrame) + EPOSPersonSeparatorEntry.config(style = 'entry1.TEntry') + EPOSPersonSeparatorEntry.config(textvariable = EPOSPersonSeparatorVar) + EPOSPersonSeparatorEntry.config(state = TK.DISABLED) + EPOSPersonSeparatorEntry.config(width = 56) + EPOSPersonSeparatorEntry.grid(row = 1, column = 1, columnspan = 2, padx = 5, pady = 5) + + # "Separator pomiędzy wierszami" + EPOSRowSeparatorLabel = TKttk.Label(editingPresetOSFrame) + EPOSRowSeparatorLabel.config(style = 'label1.TLabel') + EPOSRowSeparatorLabel.config(text = 'Separator pomiędzy wierszami') + EPOSRowSeparatorLabel.grid(row = 2, column = 0, pady = 5, sticky = 'w') + + # Entry - Separator pomiedzy wierszami + EPOSRowSeparatorVar = TK.StringVar() + EPOSRowSeparatorEntry = TKttk.Entry(editingPresetOSFrame) + EPOSRowSeparatorEntry.config(style = 'entry1.TEntry') + EPOSRowSeparatorEntry.config(textvariable = EPOSRowSeparatorVar) + EPOSRowSeparatorEntry.config(state = TK.DISABLED) + EPOSRowSeparatorEntry.config(width = 56) + EPOSRowSeparatorEntry.grid(row = 2, column = 1, columnspan = 2, padx = 5, pady = 5) + + # "Separatory pomiędzy danymi" + EPOSDataSeparatorLabel = TKttk.Label(editingPresetOSFrame) + EPOSDataSeparatorLabel.config(style = 'label1.TLabel') + EPOSDataSeparatorLabel.config(text = 'Separatory pomiędzy danymi') + EPOSDataSeparatorLabel.grid(row = 3, column = 0, pady = 5, sticky = 'nw') + + # Entry - Separator pomiedzy wierszami + EPOSDataSeparatorText = TK.Text(editingPresetOSFrame) + EPOSDataSeparatorText.config(state = TK.DISABLED) + EPOSDataSeparatorText.config(width = 42) + EPOSDataSeparatorText.config(height = 19) + EPOSDataSeparatorText.config(background = GUI.R()['text1Background']) + EPOSDataSeparatorText.config(foreground = GUI.R()['text1TextColor']) + EPOSDataSeparatorText.config(relief = GUI.R()['text1Relief']) + EPOSDataSeparatorText.grid(row = 3, column = 1, columnspan = 2, padx = 5, pady = 5) + + # " - nowa linia | wciśnięcie przycisku ENTER | \n" + EPOSSeparatorEnterInfoLabel = TKttk.Label(editingPresetOSFrame) + EPOSSeparatorEnterInfoLabel.config(style = 'label1.TLabel') + EPOSSeparatorEnterInfoLabel.config(text = r' - nowa linia | wciśnięcie przycisku ENTER | \n') + EPOSSeparatorEnterInfoLabel.grid(row = 4, column = 1, columnspan = 2) + + ############### + + ######################### + + # (3) Separator 2 ####### + + formatSeparator2 = TKttk.Separator(editingPresetSettingsFrame) + formatSeparator2.config(style = 'separator1.TSeparator') + formatSeparator2.config(orient = TK.VERTICAL) + formatSeparator2.pack(fill = TK.Y, padx = 10, side = TK.LEFT) + + ######################### + + # (3) Lokalizacja danych + + editingPresetDataLocalizationSettingsFrame = TKttk.Frame(editingPresetSettingsFrame) + editingPresetDataLocalizationSettingsFrame.config(style = 'layoutFrame.TFrame') + editingPresetDataLocalizationSettingsFrame.pack(fill = TK.BOTH, side = TK.RIGHT) + + # C1 - "Wiersz" + editingPresetDataLocalizationC1Label = TKttk.Label(editingPresetDataLocalizationSettingsFrame) + editingPresetDataLocalizationC1Label.config(style = 'label1.TLabel') + editingPresetDataLocalizationC1Label.config(text = 'Wiersz') + editingPresetDataLocalizationC1Label.grid(row = 0, column = 1, padx = 5, pady = 5) + + # C2 - "Pozycja w wierszu" + editingPresetDataLocalizationC2Label = TKttk.Label(editingPresetDataLocalizationSettingsFrame) + editingPresetDataLocalizationC2Label.config(style = 'label1.TLabel') + editingPresetDataLocalizationC2Label.config(text = 'Pozycja w wierszu') + editingPresetDataLocalizationC2Label.grid(row = 0, column = 2, padx = 5, pady = 5) + + # W1 - "Login" + editingPresetDataLocalizationW1Label = TKttk.Label(editingPresetDataLocalizationSettingsFrame) + editingPresetDataLocalizationW1Label.config(style = 'label2.TLabel') + editingPresetDataLocalizationW1Label.config(text = 'Login') + editingPresetDataLocalizationW1Label.grid(row = 1, column = 0, padx = 5, pady = 5) + + # Lokalizacja loginu (wiersz) + EPDataLocalizationLoginRowVar = TK.IntVar() + EPDataLocalizationLoginRowSpinbox = TKttk.Spinbox(editingPresetDataLocalizationSettingsFrame) + EPDataLocalizationLoginRowSpinbox.config(textvariable = EPDataLocalizationLoginRowVar) + EPDataLocalizationLoginRowSpinbox.config(from_ = 0) + EPDataLocalizationLoginRowSpinbox.config(to = 1000000) + EPDataLocalizationLoginRowSpinbox.config(style = 'spinbox1.TSpinbox') + EPDataLocalizationLoginRowSpinbox.grid(row = 1, column = 1, padx = 5, pady = 5) + + # Lokalizacja loginu (pozycja w wierszu) + EPDataLocalizationLoginPosInRowVar = TK.IntVar() + EPDataLocalizationLoginPosInRowSpinbox = TKttk.Spinbox(editingPresetDataLocalizationSettingsFrame) + EPDataLocalizationLoginPosInRowSpinbox.config(textvariable = EPDataLocalizationLoginPosInRowVar) + EPDataLocalizationLoginPosInRowSpinbox.config(from_ = 0) + EPDataLocalizationLoginPosInRowSpinbox.config(to = 1000000) + EPDataLocalizationLoginPosInRowSpinbox.config(style = 'spinbox1.TSpinbox') + EPDataLocalizationLoginPosInRowSpinbox.grid(row = 1, column = 2, padx = 5, pady = 5) + + # W2 - "Imię" + editingPresetDataLocalizationW2Label = TKttk.Label(editingPresetDataLocalizationSettingsFrame) + editingPresetDataLocalizationW2Label.config(style = 'label2.TLabel') + editingPresetDataLocalizationW2Label.config(text = 'Imię') + editingPresetDataLocalizationW2Label.grid(row = 2, column = 0, padx = 5, pady = 5) + + # Lokalizacja imienia (wiersz) + EPDataLocalizationFnameRowVar = TK.IntVar() + EPDataLocalizationFnameRowSpinbox = TKttk.Spinbox(editingPresetDataLocalizationSettingsFrame) + EPDataLocalizationFnameRowSpinbox.config(textvariable = EPDataLocalizationFnameRowVar) + EPDataLocalizationFnameRowSpinbox.config(from_ = 0) + EPDataLocalizationFnameRowSpinbox.config(to = 1000000) + EPDataLocalizationFnameRowSpinbox.config(style = 'spinbox1.TSpinbox') + EPDataLocalizationFnameRowSpinbox.grid(row = 2, column = 1, padx = 5, pady = 5) + + # Lokalizacja imienia (pozycja w wierszu) + EPDataLocalizationFnamePosInRowVar = TK.IntVar() + EPDataLocalizationFnamePosInRowSpinbox = TKttk.Spinbox(editingPresetDataLocalizationSettingsFrame) + EPDataLocalizationFnamePosInRowSpinbox.config(textvariable = EPDataLocalizationFnamePosInRowVar) + EPDataLocalizationFnamePosInRowSpinbox.config(from_ = 0) + EPDataLocalizationFnamePosInRowSpinbox.config(to = 1000000) + EPDataLocalizationFnamePosInRowSpinbox.config(style = 'spinbox1.TSpinbox') + EPDataLocalizationFnamePosInRowSpinbox.grid(row = 2, column = 2, padx = 5, pady = 5) + + # W3 - "Nazwisko" + editingPresetDataLocalizationW3Label = TKttk.Label(editingPresetDataLocalizationSettingsFrame) + editingPresetDataLocalizationW3Label.config(style = 'label2.TLabel') + editingPresetDataLocalizationW3Label.config(text = 'Nazwisko') + editingPresetDataLocalizationW3Label.grid(row = 3, column = 0, padx = 5, pady = 5) + + # Lokalizacja nazwiska (wiersz) + EPDataLocalizationLnameRowVar = TK.IntVar() + EPDataLocalizationLnameRowSpinbox = TKttk.Spinbox(editingPresetDataLocalizationSettingsFrame) + EPDataLocalizationLnameRowSpinbox.config(textvariable = EPDataLocalizationLnameRowVar) + EPDataLocalizationLnameRowSpinbox.config(from_ = 0) + EPDataLocalizationLnameRowSpinbox.config(to = 1000000) + EPDataLocalizationLnameRowSpinbox.config(style = 'spinbox1.TSpinbox') + EPDataLocalizationLnameRowSpinbox.grid(row = 3, column = 1, padx = 5, pady = 5) + + # Lokalizacja nazwiska (pozycja w wierszu) + EPDataLocalizationLnamePosInRowVar = TK.IntVar() + EPDataLocalizationLnamePosInRowSpinbox = TKttk.Spinbox(editingPresetDataLocalizationSettingsFrame) + EPDataLocalizationLnamePosInRowSpinbox.config(textvariable = EPDataLocalizationLnamePosInRowVar) + EPDataLocalizationLnamePosInRowSpinbox.config(from_ = 0) + EPDataLocalizationLnamePosInRowSpinbox.config(to = 1000000) + EPDataLocalizationLnamePosInRowSpinbox.config(style = 'spinbox1.TSpinbox') + EPDataLocalizationLnamePosInRowSpinbox.grid(row = 3, column = 2, padx = 5, pady = 5) + + # W4 - "Szkoła" + editingPresetDataLocalizationW4Label = TKttk.Label(editingPresetDataLocalizationSettingsFrame) + editingPresetDataLocalizationW4Label.config(style = 'label2.TLabel') + editingPresetDataLocalizationW4Label.config(text = 'Szkoła') + editingPresetDataLocalizationW4Label.grid(row = 4, column = 0, padx = 5, pady = 5) + + # Lokalizacja nazwiska (wiersz) + EPDataLocalizationSchoolRowVar = TK.IntVar() + EPDataLocalizationSchoolRowSpinbox = TKttk.Spinbox(editingPresetDataLocalizationSettingsFrame) + EPDataLocalizationSchoolRowSpinbox.config(textvariable = EPDataLocalizationSchoolRowVar) + EPDataLocalizationSchoolRowSpinbox.config(from_ = 0) + EPDataLocalizationSchoolRowSpinbox.config(to = 1000000) + EPDataLocalizationSchoolRowSpinbox.config(style = 'spinbox1.TSpinbox') + EPDataLocalizationSchoolRowSpinbox.grid(row = 4, column = 1, padx = 5, pady = 5) + + # Lokalizacja nazwiska (pozycja w wierszu) + EPDataLocalizationSchoolPosInRowVar = TK.IntVar() + EPDataLocalizationSchoolPosInRowSpinbox = TKttk.Spinbox(editingPresetDataLocalizationSettingsFrame) + EPDataLocalizationSchoolPosInRowSpinbox.config(textvariable = EPDataLocalizationSchoolPosInRowVar) + EPDataLocalizationSchoolPosInRowSpinbox.config(from_ = 0) + EPDataLocalizationSchoolPosInRowSpinbox.config(to = 1000000) + EPDataLocalizationSchoolPosInRowSpinbox.config(style = 'spinbox1.TSpinbox') + EPDataLocalizationSchoolPosInRowSpinbox.grid(row = 4, column = 2, padx = 5, pady = 5) + + # W5 - "Klasa" + editingPresetDataLocalizationW5Label = TKttk.Label(editingPresetDataLocalizationSettingsFrame) + editingPresetDataLocalizationW5Label.config(style = 'label2.TLabel') + editingPresetDataLocalizationW5Label.config(text = 'Klasa') + editingPresetDataLocalizationW5Label.grid(row = 5, column = 0, padx = 5, pady = 5) + + # Lokalizacja nazwiska (wiersz) + EPDataLocalizationClassRowVar = TK.IntVar() + EPDataLocalizationClassRowSpinbox = TKttk.Spinbox(editingPresetDataLocalizationSettingsFrame) + EPDataLocalizationClassRowSpinbox.config(textvariable = EPDataLocalizationClassRowVar) + EPDataLocalizationClassRowSpinbox.config(from_ = 0) + EPDataLocalizationClassRowSpinbox.config(to = 1000000) + EPDataLocalizationClassRowSpinbox.config(style = 'spinbox1.TSpinbox') + EPDataLocalizationClassRowSpinbox.grid(row = 5, column = 1, padx = 5, pady = 5) + + # Lokalizacja nazwiska (pozycja w wierszu) + EPDataLocalizationClassPosInRowVar = TK.IntVar() + EPDataLocalizationClassPosInRowSpinbox = TKttk.Spinbox(editingPresetDataLocalizationSettingsFrame) + EPDataLocalizationClassPosInRowSpinbox.config(textvariable = EPDataLocalizationClassPosInRowVar) + EPDataLocalizationClassPosInRowSpinbox.config(from_ = 0) + EPDataLocalizationClassPosInRowSpinbox.config(to = 1000000) + EPDataLocalizationClassPosInRowSpinbox.config(style = 'spinbox1.TSpinbox') + EPDataLocalizationClassPosInRowSpinbox.grid(row = 5, column = 2, padx = 5, pady = 5) + + ######################### + + ################################### + + # (2) Przyciski ################### + + editingPresetButtonsFrame = TKttk.Frame(editingPresetFrame) + editingPresetButtonsFrame.config(style = 'layoutFrame.TFrame') + editingPresetButtonsFrame.pack(fill = TK.X, side = TK.BOTTOM, pady = 10) + + def editingPresetSaveAction(): + if loadingList.get() not in FMT.getList(): + if MSG('A0001', False): + studentVar = EPOSTypeVar.get() + if studentVar == 's': + studentVar = True + else: + studentVar = False + formatFileContentToSave = { + "student" : studentVar, + "personSeparator" : EPOSPersonSeparatorEntry.get(), + "rowSeparator" : EPOSRowSeparatorEntry.get(), + "dataSeparators" : (EPOSDataSeparatorText.get("1.0", TK.END)).split('\n')[:-1], + "loginRow" : int(EPDataLocalizationLoginRowSpinbox.get()), + "loginPositionInRow" : int(EPDataLocalizationLoginPosInRowSpinbox.get()), + "fnameRow" : int(EPDataLocalizationFnameRowSpinbox.get()), + "fnamePositionInRow" : int(EPDataLocalizationFnamePosInRowSpinbox.get()), + "lnameRow" : int(EPDataLocalizationLnameRowSpinbox.get()), + "lnamePositionInRow" : int(EPDataLocalizationLnamePosInRowSpinbox.get()), + "schoolRow" : int(EPDataLocalizationSchoolRowSpinbox.get()), + "schoolPositionInRow" : int(EPDataLocalizationSchoolPosInRowSpinbox.get()), + "classRow" : int(EPDataLocalizationClassRowSpinbox.get()), + "classPositionInRow" : int(EPDataLocalizationClassPosInRowSpinbox.get()), + } + FMT.W(loadingList.get(), formatFileContentToSave) + formatFileContent = { + "student" : True, + "personSeparator" : '', + "rowSeparator" : '', + "dataSeparators" : [], + "loginRow" : 0, + "loginPositionInRow" : 0, + "fnameRow" : 0, + "fnamePositionInRow" : 0, + "lnameRow" : 0, + "lnamePositionInRow" : 0, + "schoolRow" : 0, + "schoolPositionInRow" : 0, + "classRow" : 0, + "classPositionInRow" : 0, + } + loadingList['state'] = TK.NORMAL + loadingButton['state'] = TK.NORMAL + EPOSTypeStudentRadiobutton['state'] = TK.DISABLED + EPOSTypeTeacherRadiobutton['state'] = TK.DISABLED + if formatFileContent['student']: + EPOSTypeVar.set('s') + else: + EPOSTypeVar.set('t') + EPOSPersonSeparatorEntry['state'] = TK.DISABLED + EPOSPersonSeparatorVar.set(formatFileContent['personSeparator']) + EPOSRowSeparatorEntry['state'] = TK.DISABLED + EPOSRowSeparatorVar.set(formatFileContent['rowSeparator']) + EPOSDataSeparatorText.delete('1.0', TK.END) + EPOSDataSeparatorText['state'] = TK.DISABLED + EPDataLocalizationLoginRowSpinbox['state'] = TK.DISABLED + EPDataLocalizationLoginRowVar.set(formatFileContent['loginRow']) + EPDataLocalizationLoginPosInRowSpinbox['state'] = TK.DISABLED + EPDataLocalizationLoginPosInRowVar.set(formatFileContent['loginPositionInRow']) + EPDataLocalizationFnameRowSpinbox['state'] = TK.DISABLED + EPDataLocalizationFnameRowVar.set(formatFileContent['fnameRow']) + EPDataLocalizationFnamePosInRowSpinbox['state'] = TK.DISABLED + EPDataLocalizationFnamePosInRowVar.set(formatFileContent['fnamePositionInRow']) + EPDataLocalizationLnameRowSpinbox['state'] = TK.DISABLED + EPDataLocalizationLnameRowVar.set(formatFileContent['lnameRow']) + EPDataLocalizationLnamePosInRowSpinbox['state'] = TK.DISABLED + EPDataLocalizationLnamePosInRowVar.set(formatFileContent['lnamePositionInRow']) + EPDataLocalizationSchoolRowSpinbox['state'] = TK.DISABLED + EPDataLocalizationSchoolRowVar.set(formatFileContent['schoolRow']) + EPDataLocalizationSchoolPosInRowSpinbox['state'] = TK.DISABLED + EPDataLocalizationSchoolPosInRowVar.set(formatFileContent['schoolPositionInRow']) + EPDataLocalizationClassRowSpinbox['state'] = TK.DISABLED + EPDataLocalizationClassRowVar.set(formatFileContent['classRow']) + EPDataLocalizationClassPosInRowSpinbox['state'] = TK.DISABLED + EPDataLocalizationClassPosInRowVar.set(formatFileContent['classPositionInRow']) + editingPresetSaveButton['state'] = TK.DISABLED + editingPresetCancelButton['state'] = TK.DISABLED + loadingList['values'] = tuple(FMT.getList()) + else: + return + else: + if MSG('A0002', False): + studentVar = EPOSTypeVar.get() + if studentVar == 's': + studentVar = True + else: + studentVar = False + formatFileContentToSave = { + "student" : studentVar, + "personSeparator" : EPOSPersonSeparatorEntry.get(), + "rowSeparator" : EPOSRowSeparatorEntry.get(), + "dataSeparators" : (EPOSDataSeparatorText.get("1.0", TK.END)).split('\n')[:-1], + "loginRow" : int(EPDataLocalizationLoginRowSpinbox.get()), + "loginPositionInRow" : int(EPDataLocalizationLoginPosInRowSpinbox.get()), + "fnameRow" : int(EPDataLocalizationFnameRowSpinbox.get()), + "fnamePositionInRow" : int(EPDataLocalizationFnamePosInRowSpinbox.get()), + "lnameRow" : int(EPDataLocalizationLnameRowSpinbox.get()), + "lnamePositionInRow" : int(EPDataLocalizationLnamePosInRowSpinbox.get()), + "schoolRow" : int(EPDataLocalizationSchoolRowSpinbox.get()), + "schoolPositionInRow" : int(EPDataLocalizationSchoolPosInRowSpinbox.get()), + "classRow" : int(EPDataLocalizationClassRowSpinbox.get()), + "classPositionInRow" : int(EPDataLocalizationClassPosInRowSpinbox.get()), + } + FMT.W(loadingList.get(), formatFileContentToSave) + formatFileContent = { + "student" : True, + "personSeparator" : '', + "rowSeparator" : '', + "dataSeparators" : [], + "loginRow" : 0, + "loginPositionInRow" : 0, + "fnameRow" : 0, + "fnamePositionInRow" : 0, + "lnameRow" : 0, + "lnamePositionInRow" : 0, + "schoolRow" : 0, + "schoolPositionInRow" : 0, + "classRow" : 0, + "classPositionInRow" : 0, + } + loadingList['state'] = TK.NORMAL + loadingButton['state'] = TK.NORMAL + EPOSTypeStudentRadiobutton['state'] = TK.DISABLED + EPOSTypeTeacherRadiobutton['state'] = TK.DISABLED + if formatFileContent['student']: + EPOSTypeVar.set('s') + else: + EPOSTypeVar.set('t') + EPOSPersonSeparatorEntry['state'] = TK.DISABLED + EPOSPersonSeparatorVar.set(formatFileContent['personSeparator']) + EPOSRowSeparatorEntry['state'] = TK.DISABLED + EPOSRowSeparatorVar.set(formatFileContent['rowSeparator']) + EPOSDataSeparatorText.delete('1.0', TK.END) + EPOSDataSeparatorText['state'] = TK.DISABLED + EPDataLocalizationLoginRowSpinbox['state'] = TK.DISABLED + EPDataLocalizationLoginRowVar.set(formatFileContent['loginRow']) + EPDataLocalizationLoginPosInRowSpinbox['state'] = TK.DISABLED + EPDataLocalizationLoginPosInRowVar.set(formatFileContent['loginPositionInRow']) + EPDataLocalizationFnameRowSpinbox['state'] = TK.DISABLED + EPDataLocalizationFnameRowVar.set(formatFileContent['fnameRow']) + EPDataLocalizationFnamePosInRowSpinbox['state'] = TK.DISABLED + EPDataLocalizationFnamePosInRowVar.set(formatFileContent['fnamePositionInRow']) + EPDataLocalizationLnameRowSpinbox['state'] = TK.DISABLED + EPDataLocalizationLnameRowVar.set(formatFileContent['lnameRow']) + EPDataLocalizationLnamePosInRowSpinbox['state'] = TK.DISABLED + EPDataLocalizationLnamePosInRowVar.set(formatFileContent['lnamePositionInRow']) + EPDataLocalizationSchoolRowSpinbox['state'] = TK.DISABLED + EPDataLocalizationSchoolRowVar.set(formatFileContent['schoolRow']) + EPDataLocalizationSchoolPosInRowSpinbox['state'] = TK.DISABLED + EPDataLocalizationSchoolPosInRowVar.set(formatFileContent['schoolPositionInRow']) + EPDataLocalizationClassRowSpinbox['state'] = TK.DISABLED + EPDataLocalizationClassRowVar.set(formatFileContent['classRow']) + EPDataLocalizationClassPosInRowSpinbox['state'] = TK.DISABLED + EPDataLocalizationClassPosInRowVar.set(formatFileContent['classPositionInRow']) + editingPresetSaveButton['state'] = TK.DISABLED + editingPresetCancelButton['state'] = TK.DISABLED + loadingList['values'] = tuple(FMT.getList()) + else: + return + editingPresetSaveButton = TKttk.Button(editingPresetButtonsFrame) + editingPresetSaveButton.config(command = editingPresetSaveAction) + editingPresetSaveButton.config(state = TK.DISABLED) + editingPresetSaveButton.config(style = 'button1.TButton') + editingPresetSaveButton.config(width = GUI.R()['editingPresetSaveButtonWidth']) + editingPresetSaveButton.config(text = 'ZAPISZ') + editingPresetSaveButton.pack(side = TK.LEFT, expand = 1) + + def editingPresetCancelAction(): + formatFileContent = { + "student" : True, + "personSeparator" : '', + "rowSeparator" : '', + "dataSeparators" : [], + "loginRow" : 0, + "loginPositionInRow" : 0, + "fnameRow" : 0, + "fnamePositionInRow" : 0, + "lnameRow" : 0, + "lnamePositionInRow" : 0, + "schoolRow" : 0, + "schoolPositionInRow" : 0, + "classRow" : 0, + "classPositionInRow" : 0, + } + loadingList['state'] = TK.NORMAL + loadingButton['state'] = TK.NORMAL + EPOSTypeStudentRadiobutton['state'] = TK.DISABLED + EPOSTypeTeacherRadiobutton['state'] = TK.DISABLED + if formatFileContent['student']: + EPOSTypeVar.set('s') + else: + EPOSTypeVar.set('t') + EPOSPersonSeparatorEntry['state'] = TK.DISABLED + EPOSPersonSeparatorVar.set(formatFileContent['personSeparator']) + EPOSRowSeparatorEntry['state'] = TK.DISABLED + EPOSRowSeparatorVar.set(formatFileContent['rowSeparator']) + EPOSDataSeparatorText.delete('1.0', TK.END) + EPOSDataSeparatorText['state'] = TK.DISABLED + EPDataLocalizationLoginRowSpinbox['state'] = TK.DISABLED + EPDataLocalizationLoginRowVar.set(formatFileContent['loginRow']) + EPDataLocalizationLoginPosInRowSpinbox['state'] = TK.DISABLED + EPDataLocalizationLoginPosInRowVar.set(formatFileContent['loginPositionInRow']) + EPDataLocalizationFnameRowSpinbox['state'] = TK.DISABLED + EPDataLocalizationFnameRowVar.set(formatFileContent['fnameRow']) + EPDataLocalizationFnamePosInRowSpinbox['state'] = TK.DISABLED + EPDataLocalizationFnamePosInRowVar.set(formatFileContent['fnamePositionInRow']) + EPDataLocalizationLnameRowSpinbox['state'] = TK.DISABLED + EPDataLocalizationLnameRowVar.set(formatFileContent['lnameRow']) + EPDataLocalizationLnamePosInRowSpinbox['state'] = TK.DISABLED + EPDataLocalizationLnamePosInRowVar.set(formatFileContent['lnamePositionInRow']) + EPDataLocalizationSchoolRowSpinbox['state'] = TK.DISABLED + EPDataLocalizationSchoolRowVar.set(formatFileContent['schoolRow']) + EPDataLocalizationSchoolPosInRowSpinbox['state'] = TK.DISABLED + EPDataLocalizationSchoolPosInRowVar.set(formatFileContent['schoolPositionInRow']) + EPDataLocalizationClassRowSpinbox['state'] = TK.DISABLED + EPDataLocalizationClassRowVar.set(formatFileContent['classRow']) + EPDataLocalizationClassPosInRowSpinbox['state'] = TK.DISABLED + EPDataLocalizationClassPosInRowVar.set(formatFileContent['classPositionInRow']) + editingPresetSaveButton['state'] = TK.DISABLED + editingPresetCancelButton['state'] = TK.DISABLED + loadingList['values'] = tuple(FMT.getList()) + editingPresetCancelButton = TKttk.Button(editingPresetButtonsFrame) + editingPresetCancelButton.config(command = editingPresetCancelAction) + editingPresetCancelButton.config(state = TK.DISABLED) + editingPresetCancelButton.config(style = 'button1.TButton') + editingPresetCancelButton.config(width = GUI.R()['editingPresetCancelButtonWidth']) + editingPresetCancelButton.config(text = 'Anuluj') + editingPresetCancelButton.pack(side = TK.RIGHT, expand = 1) + + ################################### + + ############################################# + + ###################################################################### + + + + # TAB4 - Ustawienia ################################################## + + settingsTab = TKttk.Frame(mainMenu) + settingsTab.config(style = "mainMenuTabFrame.TFrame") + settingsTabImg = PLimg.open(GUI.R()['settingsTabIcon']) + settingsTabImg = settingsTabImg.resize((GUI.R()['tabIconsSize'], GUI.R()['tabIconsSize']), PLimg.ANTIALIAS) + settingsTabImg = PLitk.PhotoImage(settingsTabImg) + mainMenu.add(settingsTab, image = settingsTabImg, state = TK.NORMAL) + + + # Nagłówek + settingsHeader = TKttk.Label(settingsTab) + settingsHeader.config(style = 'tabHeader.TLabel') + settingsHeader.config(text = 'USTAWIENIA') + settingsHeader.pack(fill = TK.X) + + + # Zawartość + settingsFrame = TKttk.Frame(settingsTab) + settingsFrame.config(style = 'tabFrame.TFrame') + settingsFrame.pack(fill = TK.BOTH, expand = 1, padx = GUI.R()['tabFramePadding'], pady = GUI.R()['tabFramePadding']) + + ###################################################################### + + + + # TAB5 - O programie ################################################# + + aboutTab = TKttk.Frame(mainMenu) + aboutTab.config(style = "mainMenuTabFrame.TFrame") + aboutTabImg = PLimg.open(GUI.R()['aboutTabIcon']) + aboutTabImg = aboutTabImg.resize((GUI.R()['tabIconsSize'], GUI.R()['tabIconsSize']), PLimg.ANTIALIAS) + aboutTabImg = PLitk.PhotoImage(aboutTabImg) + mainMenu.add(aboutTab, image = aboutTabImg, state = TK.NORMAL) + + + # Nagłówek + aboutHeader = TKttk.Label(aboutTab) + aboutHeader.config(style = 'tabHeader.TLabel') + aboutHeader.config(text = 'O PROGRAMIE') + aboutHeader.pack(fill = TK.X) + + + # Zawartość + aboutFrame = TKttk.Frame(aboutTab) + aboutFrame.config(style = 'tabFrame.TFrame') + aboutFrame.pack(fill = TK.BOTH, expand = 1, padx = GUI.R()['tabFramePadding'], pady = GUI.R()['tabFramePadding']) + + ###################################################################### + + + + # Mainloop + window.mainloop() +window() \ No newline at end of file diff --git a/src/load_cfg.py b/src/load_cfg.py deleted file mode 100644 index e69de29..0000000 diff --git a/src/vars.py b/src/vars.py deleted file mode 100644 index 3712333..0000000 --- a/src/vars.py +++ /dev/null @@ -1,132 +0,0 @@ -""" -# Generator CSV -# 4.0 Experimental -# by Mateusz Skoczek -# styczeń 2019 - luty 2020 -# dla ZSP Sobolew - -# -# Zmienne -# -""" - - - - - -# ----------------------- # Informacje o programie # ------------------------ # - -class prgInfo: - name = 'Generator CSV' # Nazwa programu - school = 'ZSP Sobolew' # Nazwa szkoły - version = '4.0 Experimental' # Wersja programu - years = '2019 - 2020' # Lata pracy na programem - authors = 'Mateusz Skoczek' # Autorzy - - - - - -# ------------------- # Zmienne środowiska graficznego # -------------------- # - -class guiVars: - # Wymiary - class dimension: - # Karty - iconTab = 20 # Wielkość ikon w kartach - borderTab = 0 # Szerokość ramki kart - iconPaddingTab = 8 # Margines kart - tabWindowBorderWidth = 0 # Szerokość ramki okna kart - - # Nagłówki kart - tabHeaderHeight = 8 # Wysokość nagłówka - tabHeaderWidth = 80 # Szerokość nagłówka - - # Labelframe'y - lfBorderwidth = 1 # Szerokość obramowania - - # Textbox'y - tbBorderwidth = 0 # Szerokość obramowania - - # FORMATTAB - framePadY = 10 - tbPad = 8 - tbWidth = 42 - tbHeight = 9 - tbWidth2 = 56 - bnHeight = 2 - bnWidth = 30 - bnWidth2 = 30 - - # INFOTAB - programIconInInfo = 100 # Szerokość/wysokość ikony - programIconInInfoPlace = 150 # Wysokość kontrolki zawierającej ikonę - separator1Height = 2 # Wysokość separator1 - separator2Height = 1 # Wysokość separator2 - separator3Height = 4 # Wysokość separator3 - - - # Kolory - class color: - # Głowne - mainBG = '#21242D' # Głowne tło - - # Karty - unselectedTabBG = '#21242D' # Niewybrana karta - selectedTabBG = '#333842' # Wybrana karta - - # Nagłowki kart - headerBG = '#323741' # Tło - headerText = '#C0C0C0' # Tekst - - # Labelframe'y - lfText = '#C0C0C0' # Tekst - - # Label'e - label1 = '#C0C0C0' # Tekst - - # Textbox'y - textboxBG = '#282B36' # Tło - textboxText = '#C0C0C0' # Tekst - - # Button'y - buttonBG = '#323741' # Tło - buttonText = '#C0C0C0' # Tekst - - # Grafika - class image: - # Ikona programu - programIcon = 'assets/icon.ico' - programIconOther = 'assets/other_images/icon.png' - - # Ikony kart - iconTab = 'assets/tab_icons/icon.png' - generateTab = 'assets/tab_icons/generate.png' - linkTab = 'assets/tab_icons/link.png' - mergeTab = 'assets/tab_icons/merge.png' - settingsTab = 'assets/tab_icons/settings.png' - formatTab = 'assets/tab_icons/format.png' - infoTab = 'assets/tab_icons/info.png' - - - # Czcionki - class fonts: - # Główne - tabHeader = ['Segoe UI', 12] # Nagłowki - - # INFOTAB - info1 = ['Segoe UI'] # Czcionka - info1.append(20) # Wielkość tekstu - Nazwa programu - info1.append(10) # Wielkość tekstu - Wersja programu - info1.append(8) # Wielkość tekstu - Copyright - info1.append(8) # Wielkość tekstu - Autorzy - - - # Inne - class other: - # Ustawienia okna - windowHeightResize = False # Rozszerzanie okna w pionie - windowWidthResize = False # Rozszerzanie okna w poziomie - - # Ustawienia kart - tabPosition = 'wn' # Pozycja kart \ No newline at end of file