2020-08-06 18:10:55 +02:00
"""
# GeneratorCSV
2020-08-06 18:17:00 +02:00
# Wersja 4.0 Experimental
2020-08-06 18:10:55 +02:00
# by Mateusz Skoczek
# luty 2019 - grudzień 2019
# dla ZSP Sobolew
#
# Główny plik składowy programu
#
"""
2020-08-06 18:20:52 +02:00
2020-08-06 18:12:58 +02:00
# -------------------------------------------- # Informacje o programie # -------------------------------------------- #
Nazwa = ' GeneratorCSV '
2020-08-06 18:17:00 +02:00
Wersja = ' 4.0 Experimental '
2020-08-06 18:12:58 +02:00
2020-08-06 18:10:55 +02:00
# ----------------------------------------- # Definicja kodów dialogowych # ------------------------------------------ #
2020-08-06 18:19:38 +02:00
E003x01 = [ " Nie podano lokalizacji plików do importu. (E003x01) " , False ]
E003x02 = [ " Nie podano lokalizacji zapisu wygenerowanych plików. (E003x02) " , False ]
E003x111 = [ " Plik podany w sciezce 1 nie istnieje (E003x111) " , False ]
E003x112 = [ " Plik podany w sciezce 2 nie istnieje (E003x112) " , False ]
E003x113 = [ " Plik podany w sciezce 3 nie istnieje (E003x113) " , False ]
E003x114 = [ " Plik podany w sciezce 4 nie istnieje (E003x114) " , False ]
A001 = " Czy na pewno chcesz rozpocząć generowanie? \n Program utworzy w podanej lokalizacji pliki ' email.csv ' i ' office.csv ' . \n Jeżeli w podanej lokalizacji istnieją pliki o takich nazwach zostaną one nadpisane. "
2020-08-06 18:10:55 +02:00
# ----------------------------------- # Import bibliotek zewnętrznych i modułów # ------------------------------------ #
# Biblioteki zewnętrzne
import os as OS
import sys as SS
2020-08-06 18:12:58 +02:00
2020-08-06 18:10:55 +02:00
# Moduły składowe programu
try :
import dialog as MDdlg
except ModuleNotFoundError :
2020-08-06 18:20:52 +02:00
print ( ' Nie znaleziono modułu programu (dialog.py) \n Nie można załadować programu \n Kod błędu: E00x0001 ' )
wait = input ( ' Naciśnij ENTER aby wyjść ' )
2020-08-06 18:10:55 +02:00
SS . exit ( 0 )
2020-08-06 18:12:58 +02:00
2020-08-06 18:10:55 +02:00
try :
import load_config as MDlcg
except ModuleNotFoundError :
2020-08-06 18:20:52 +02:00
print ( ' Nie znaleziono modułu programu (load_config.py) \n Nie można załadować programu \n Kod błędu: E00x0002 ' )
wait = input ( ' Naciśnij ENTER aby wyjść ' )
SS . exit ( 0 )
2020-08-06 18:10:55 +02:00
2020-08-06 18:19:38 +02:00
try :
2020-08-06 18:20:52 +02:00
import load_format as MDlfm
2020-08-06 18:19:38 +02:00
except ModuleNotFoundError :
2020-08-06 18:20:52 +02:00
print ( ' Nie znaleziono modułu programu (load_format.py) \n Nie można załadować programu \n Kod błędu: E00x0003 ' )
wait = input ( ' Naciśnij ENTER aby wyjść ' )
SS . exit ( 0 )
2020-08-06 18:19:38 +02:00
try :
import processing as MDprc
except ModuleNotFoundError :
2020-08-06 18:20:52 +02:00
print ( ' Nie znaleziono modułu programu (processing.py) \n Nie można załadować programu \n Kod błędu: E00x0004 ' )
wait = input ( ' Naciśnij ENTER aby wyjść ' )
SS . exit ( 0 )
2020-08-06 18:12:58 +02:00
2020-08-06 18:10:55 +02:00
# Biblioteki zewnętrzne interfejsu graficznego
from tkinter import filedialog as TKfld
2020-08-06 18:17:00 +02:00
from tkinter import ttk as TKttk
2020-08-06 18:10:55 +02:00
import tkinter as TK
2020-08-06 18:20:52 +02:00
#TODO
2020-08-06 18:10:55 +02:00
# ------------------------------------- # Uruchomienie interfejsu graficznego # -------------------------------------- #
# Zmienne globalne środowiska graficznego
2020-08-06 18:12:58 +02:00
if int ( MDlcg . read ( ) [ 0 ] ) == 1 :
CiemnyMotyw = True
else :
CiemnyMotyw = False
2020-08-06 18:10:55 +02:00
SzerokoscOpisu = 17
2020-08-06 18:12:58 +02:00
SzerokoscPola = 122
# Kolorystyka okna
if CiemnyMotyw :
PaletaBarw = [ ' #1F1F1F ' , ' #191919 ' , ' #B8B8B8 ' , ' #FFFFFF ' , ' #404040 ' , ' #FFFFFF ' , ' #1F1F1F ' , 1 ]
else :
PaletaBarw = [ ' #F0F0F0 ' , ' #D4D4D4 ' , ' #000000 ' , ' #000000 ' , ' #A6A6A6 ' , ' #000000 ' , ' #FFFFFF ' , 2 ]
B_tlo = PaletaBarw [ 0 ]
B_tytultlo = PaletaBarw [ 1 ]
B_tytultext = PaletaBarw [ 2 ]
B_text = PaletaBarw [ 3 ]
B_przycisktlo = PaletaBarw [ 4 ]
B_przycisktext = PaletaBarw [ 5 ]
B_entrytlo = PaletaBarw [ 6 ]
B_framewielkosc = PaletaBarw [ 7 ]
2020-08-06 18:10:55 +02:00
def settings ( ) :
2020-08-06 18:14:39 +02:00
# Tworzenie okna ustawień
2020-08-06 18:10:55 +02:00
SettingsWindow = TK . Tk ( )
2020-08-06 18:12:58 +02:00
SettingsWindow . title ( ' Ustawienia programu ' )
SettingsWindow . resizable ( width = False , height = False )
2020-08-06 18:14:39 +02:00
SettingsWindow . configure ( background = B_tlo )
# Tytul
Tytul = TK . Label ( SettingsWindow )
Tytul . config ( text = ' Ustawienia ' )
Tytul . config ( width = 20 )
Tytul . config ( bg = B_tytultlo , fg = B_tytultext )
Tytul . config ( font = ( ' Segoe UI Semilight ' , 20 ) )
Tytul . grid ( row = 0 )
# Frame1 - Motyw
Ramka1 = TK . LabelFrame ( SettingsWindow )
Ramka1 . config ( text = ' Motyw programu ' )
Ramka1 . config ( bg = B_tlo , fg = B_text )
Ramka1 . config ( borderwidth = B_framewielkosc )
2020-08-06 18:17:00 +02:00
Ramka1 . grid ( row = 1 , pady = 5 )
Motyw_var = TK . StringVar ( )
if int ( MDlcg . read ( ) [ 0 ] ) == 1 :
Motyw_var . set ( ' Ciemny ' )
Motyw_index = 1
else :
Motyw_var . set ( ' Jasny ' )
Motyw_index = 0
Motyw_list = TKttk . Combobox ( Ramka1 )
Motyw_list . config ( textvariable = Motyw_var , state = ' readonly ' )
Motyw_list . config ( width = 43 )
Motyw_list . grid ( row = 0 , pady = 5 , padx = 5 )
Motyw_list [ ' values ' ] = ( ' Jasny ' , ' Ciemny ' )
Motyw_list . current ( Motyw_index )
# Frame2 - Kodowanie
Ramka2 = TK . LabelFrame ( SettingsWindow )
Ramka2 . config ( text = ' Kodowanie wyjściowe ' )
Ramka2 . config ( bg = B_tlo , fg = B_text )
Ramka2 . config ( borderwidth = B_framewielkosc )
Ramka2 . grid ( row = 2 , pady = 5 )
Code_var = TK . StringVar ( )
Code_var . set ( MDlcg . read ( ) [ 1 ] )
Code_list = TKttk . Combobox ( Ramka2 )
Code_list . config ( textvariable = Code_var , state = ' readonly ' )
Code_list . config ( width = 43 )
Code_list . grid ( row = 0 , pady = 5 , padx = 5 )
Code_list [ ' values ' ] = ( ' utf-8 ' )
Code_list . set ( MDlcg . read ( ) [ 1 ] )
# Przycisk ZAPISZ
def zapis ( ) :
X1 = Motyw_list . get ( )
if X1 == ' Jasny ' :
X1 = ' 0 '
else :
X1 = ' 1 '
X2 = Code_list . get ( )
ToSave = [ X1 , X2 ]
MDlcg . edit ( ToSave )
SettingsWindow . destroy ( )
PrzyciskZAPISZ = TK . Button ( SettingsWindow )
PrzyciskZAPISZ . config ( text = ' ZAPISZ ' )
PrzyciskZAPISZ . config ( command = zapis )
PrzyciskZAPISZ . config ( width = 40 )
PrzyciskZAPISZ . config ( bg = B_przycisktlo , fg = B_przycisktext , relief = ' flat ' , activebackground = B_przycisktlo )
PrzyciskZAPISZ . grid ( row = 3 , pady = 8 )
2020-08-06 18:14:39 +02:00
2020-08-06 18:12:58 +02:00
2020-08-06 18:10:55 +02:00
SettingsWindow . mainloop ( )
2020-08-06 18:12:58 +02:00
2020-08-06 18:14:39 +02:00
2020-08-06 18:10:55 +02:00
def main ( ) :
# Tworzenie okna głównego
MainWindow = TK . Tk ( )
MainWindow . title ( Nazwa + ' ' + Wersja )
MainWindow . resizable ( width = False , height = False )
2020-08-06 18:12:58 +02:00
MainWindow . configure ( background = B_tlo )
2020-08-06 18:10:55 +02:00
2020-08-06 18:12:58 +02:00
# Tytul
Tytul = TK . Label ( MainWindow )
Tytul . config ( text = Nazwa )
Tytul . config ( width = 41 )
Tytul . config ( bg = B_tytultlo , fg = B_tytultext )
Tytul . config ( font = ( ' Segoe UI Semilight ' , 30 ) )
Tytul . grid ( row = 0 )
2020-08-06 18:10:55 +02:00
2020-08-06 18:12:58 +02:00
# Frame1 - Import
Ramka1 = TK . LabelFrame ( MainWindow )
Ramka1 . config ( text = ' Pliki do importu zawierające dane ' )
Ramka1 . config ( bg = B_tlo , fg = B_text )
Ramka1 . config ( borderwidth = B_framewielkosc )
Ramka1 . grid ( row = 1 )
2020-08-06 18:10:55 +02:00
# Ścieżka pliku do importu 1
2020-08-06 18:12:58 +02:00
wiersz = 1
2020-08-06 18:10:55 +02:00
text1 = TK . StringVar ( )
2020-08-06 18:12:58 +02:00
OpisPola1 = TK . Label ( Ramka1 )
OpisPola1 . config ( text = ' Plik z danymi (1) ' )
OpisPola1 . config ( width = SzerokoscOpisu )
OpisPola1 . config ( bg = B_tlo , fg = B_text )
OpisPola1 . grid ( row = wiersz , column = 0 )
Pole1 = TK . Entry ( Ramka1 )
Pole1 . config ( textvariable = text1 )
Pole1 . config ( width = SzerokoscPola )
Pole1 . config ( bg = B_entrytlo , fg = B_text )
Pole1 . grid ( row = wiersz , column = 1 )
2020-08-06 18:10:55 +02:00
def Browse1_Dialog ( ) :
2020-08-06 18:12:58 +02:00
Browse1 . filename = TKfld . askopenfilename ( initialdir = " / " , title = " Wybierz plik do importu " , filetypes = ( ( " Pliki txt " , " *.txt " ) , ( " Wszystkie pliki " , " *.* " ) ) )
2020-08-06 18:10:55 +02:00
Pole1 . delete ( 0 , ' end ' )
Pole1 . insert ( 0 , Browse1 . filename )
2020-08-06 18:12:58 +02:00
Browse1 = TK . Button ( Ramka1 )
Browse1 . config ( text = ' ... ' )
Browse1 . config ( command = Browse1_Dialog )
Browse1 . config ( bg = B_przycisktlo , fg = B_przycisktext , relief = ' flat ' , activebackground = B_przycisktlo )
Browse1 . grid ( row = wiersz , column = 2 , padx = 5 , pady = 3 )
2020-08-06 18:10:55 +02:00
# Ścieżka pliku do importu 2
2020-08-06 18:12:58 +02:00
wiersz = 2
2020-08-06 18:10:55 +02:00
text2 = TK . StringVar ( )
2020-08-06 18:12:58 +02:00
OpisPola2 = TK . Label ( Ramka1 )
OpisPola2 . config ( text = ' Plik z danymi (2) ' )
OpisPola2 . config ( width = SzerokoscOpisu )
OpisPola2 . config ( bg = B_tlo , fg = B_text )
OpisPola2 . grid ( row = wiersz , column = 0 )
Pole2 = TK . Entry ( Ramka1 )
Pole2 . config ( textvariable = text2 )
Pole2 . config ( width = SzerokoscPola )
Pole2 . config ( bg = B_entrytlo , fg = B_text )
Pole2 . grid ( row = wiersz , column = 1 )
2020-08-06 18:10:55 +02:00
def Browse2_Dialog ( ) :
2020-08-06 18:12:58 +02:00
Browse2 . filename = TKfld . askopenfilename ( initialdir = " / " , title = " Wybierz plik do importu " , filetypes = ( ( " Pliki txt " , " *.txt " ) , ( " Wszystkie pliki " , " *.* " ) ) )
2020-08-06 18:10:55 +02:00
Pole2 . delete ( 0 , ' end ' )
Pole2 . insert ( 0 , Browse2 . filename )
2020-08-06 18:12:58 +02:00
Browse2 = TK . Button ( Ramka1 )
Browse2 . config ( text = ' ... ' )
Browse2 . config ( command = Browse1_Dialog )
Browse2 . config ( bg = B_przycisktlo , fg = B_przycisktext , relief = ' flat ' , activebackground = B_przycisktlo )
Browse2 . grid ( row = wiersz , column = 2 , padx = 5 , pady = 3 )
2020-08-06 18:10:55 +02:00
# Ścieżka pliku do importu 3
2020-08-06 18:12:58 +02:00
wiersz = 3
2020-08-06 18:10:55 +02:00
text3 = TK . StringVar ( )
2020-08-06 18:12:58 +02:00
OpisPola3 = TK . Label ( Ramka1 )
OpisPola3 . config ( text = ' Plik z danymi (3) ' )
OpisPola3 . config ( width = SzerokoscOpisu )
OpisPola3 . config ( bg = B_tlo , fg = B_text )
OpisPola3 . grid ( row = wiersz , column = 0 )
Pole3 = TK . Entry ( Ramka1 )
Pole3 . config ( textvariable = text3 )
Pole3 . config ( width = SzerokoscPola )
Pole3 . config ( bg = B_entrytlo , fg = B_text )
Pole3 . grid ( row = wiersz , column = 1 )
2020-08-06 18:10:55 +02:00
def Browse3_Dialog ( ) :
2020-08-06 18:12:58 +02:00
Browse3 . filename = TKfld . askopenfilename ( initialdir = " / " , title = " Wybierz plik do importu " , filetypes = ( ( " Pliki txt " , " *.txt " ) , ( " Wszystkie pliki " , " *.* " ) ) )
2020-08-06 18:10:55 +02:00
Pole3 . delete ( 0 , ' end ' )
Pole3 . insert ( 0 , Browse3 . filename )
2020-08-06 18:12:58 +02:00
Browse3 = TK . Button ( Ramka1 )
Browse3 . config ( text = ' ... ' )
Browse3 . config ( command = Browse1_Dialog )
Browse3 . config ( bg = B_przycisktlo , fg = B_przycisktext , relief = ' flat ' , activebackground = B_przycisktlo )
Browse3 . grid ( row = wiersz , column = 2 , padx = 5 , pady = 3 )
2020-08-06 18:10:55 +02:00
# Ścieżka pliku do importu 4
2020-08-06 18:12:58 +02:00
wiersz = 4
2020-08-06 18:10:55 +02:00
text4 = TK . StringVar ( )
2020-08-06 18:12:58 +02:00
OpisPola4 = TK . Label ( Ramka1 )
OpisPola4 . config ( text = ' Plik z danymi (4) ' )
OpisPola4 . config ( width = SzerokoscOpisu )
OpisPola4 . config ( bg = B_tlo , fg = B_text )
OpisPola4 . grid ( row = wiersz , column = 0 )
Pole4 = TK . Entry ( Ramka1 )
Pole4 . config ( textvariable = text4 )
Pole4 . config ( width = SzerokoscPola )
Pole4 . config ( bg = B_entrytlo , fg = B_text )
Pole4 . grid ( row = wiersz , column = 1 )
2020-08-06 18:10:55 +02:00
def Browse4_Dialog ( ) :
2020-08-06 18:12:58 +02:00
Browse4 . filename = TKfld . askopenfilename ( initialdir = " / " , title = " Wybierz plik do importu " , filetypes = ( ( " Pliki txt " , " *.txt " ) , ( " Wszystkie pliki " , " *.* " ) ) )
2020-08-06 18:10:55 +02:00
Pole4 . delete ( 0 , ' end ' )
Pole4 . insert ( 0 , Browse4 . filename )
2020-08-06 18:12:58 +02:00
Browse4 = TK . Button ( Ramka1 )
Browse4 . config ( text = ' ... ' )
Browse4 . config ( command = Browse1_Dialog )
Browse4 . config ( bg = B_przycisktlo , fg = B_przycisktext , relief = ' flat ' , activebackground = B_przycisktlo )
Browse4 . grid ( row = wiersz , column = 2 , padx = 5 , pady = 3 )
2020-08-06 18:10:55 +02:00
2020-08-06 18:12:58 +02:00
# Frame2 - Eksport
Ramka2 = TK . LabelFrame ( MainWindow )
Ramka2 . config ( text = ' Ustawienia eksportu ' )
Ramka2 . config ( bg = B_tlo , fg = B_text )
Ramka2 . config ( borderwidth = B_framewielkosc )
Ramka2 . grid ( row = 2 )
2020-08-06 18:10:55 +02:00
# Ścieżka folderu do zapisu wygenerowanych plików
2020-08-06 18:12:58 +02:00
textExport = TK . StringVar ( )
OpisPolaExport = TK . Label ( Ramka2 )
OpisPolaExport . config ( text = ' Lokalizacja ' )
OpisPolaExport . config ( width = SzerokoscOpisu )
OpisPolaExport . config ( bg = B_tlo , fg = B_text , relief = ' flat ' , activebackground = B_przycisktlo )
2020-08-06 18:10:55 +02:00
OpisPolaExport . grid ( row = 0 , column = 0 )
2020-08-06 18:12:58 +02:00
PoleExport = TK . Entry ( Ramka2 )
PoleExport . config ( textvariable = textExport )
PoleExport . config ( width = SzerokoscPola )
PoleExport . config ( bg = B_entrytlo , fg = B_text )
2020-08-06 18:10:55 +02:00
PoleExport . grid ( row = 0 , column = 1 )
def BrowseExport_Dialog ( ) :
BrowseExport . filename = TKfld . askdirectory ( )
PoleExport . delete ( 0 , ' end ' )
PoleExport . insert ( 0 , BrowseExport . filename )
2020-08-06 18:12:58 +02:00
BrowseExport = TK . Button ( Ramka2 )
BrowseExport . config ( text = ' ... ' )
BrowseExport . config ( command = BrowseExport_Dialog )
BrowseExport . config ( bg = B_przycisktlo , fg = B_przycisktext , relief = ' flat ' , activebackground = B_przycisktlo )
2020-08-06 18:10:55 +02:00
BrowseExport . grid ( row = 0 , column = 2 , padx = 5 , pady = 3 )
2020-08-06 18:12:58 +02:00
2020-08-06 18:10:55 +02:00
# Przycisk START
2020-08-06 18:12:58 +02:00
def PathPreprocess ( ) :
2020-08-06 18:19:38 +02:00
if MDdlg . Ask ( A001 ) :
while True :
sciezka1 = Pole1 . get ( )
sciezka1_puste = True
sciezka2 = Pole2 . get ( )
sciezka2_puste = True
sciezka3 = Pole3 . get ( )
sciezka3_puste = True
sciezka4 = Pole3 . get ( )
sciezka4_puste = True
sciezkaExport = PoleExport . get ( )
sciezkaExport_puste = True
if sciezka1 != ' ' :
sciezka1_puste = False
if sciezka2 != ' ' :
sciezka2_puste = False
if sciezka3 != ' ' :
sciezka3_puste = False
if sciezka4 != ' ' :
sciezka4_puste = False
if sciezkaExport != ' ' :
sciezkaExport_puste = False
if sciezka1_puste and sciezka2_puste and sciezka3_puste and sciezka4_puste :
MDdlg . Err ( E003x01 )
break
if sciezkaExport_puste :
MDdlg . Err ( E003x02 )
break
KontenerDanych = [ ]
if not sciezka1_puste :
try :
x = open ( sciezka1 )
except FileNotFoundError :
MDdlg . Err ( E003x111 )
else :
with open ( sciezka1 , ' r ' ) as plik1 :
KontenerDanych + = MDfmt . przetworz ( plik1 . read ( ) )
if not sciezka2_puste :
try :
x = open ( sciezka2 )
except FileNotFoundError :
MDdlg . Err ( E003x112 )
else :
with open ( sciezka2 , ' r ' ) as plik2 :
KontenerDanych + = MDfmt . przetworz ( plik2 . read ( ) )
if not sciezka3_puste :
try :
x = open ( sciezka3 )
except FileNotFoundError :
MDdlg . Err ( E003x113 )
else :
with open ( sciezka3 , ' r ' ) as plik3 :
KontenerDanych + = MDfmt . przetworz ( plik3 . read ( ) )
if not sciezka4_puste :
try :
x = open ( sciezka4 )
except FileNotFoundError :
MDdlg . Err ( E003x114 )
else :
with open ( sciezka4 , ' r ' ) as plik4 :
KontenerDanych + = MDfmt . przetworz ( plik4 . read ( ) )
break
MDprc . do ( KontenerDanych , sciezkaExport )
else :
pass
2020-08-06 18:12:58 +02:00
PrzyciskSTART = TK . Button ( MainWindow )
PrzyciskSTART . config ( text = ' START ' )
PrzyciskSTART . config ( command = PathPreprocess )
PrzyciskSTART . config ( width = 50 )
PrzyciskSTART . config ( bg = B_przycisktlo , fg = B_przycisktext , relief = ' flat ' , activebackground = B_przycisktlo )
PrzyciskSTART . grid ( row = 3 , pady = 15 )
2020-08-06 18:10:55 +02:00
# Pasek dolny
2020-08-06 18:12:58 +02:00
PasekDolny = TK . LabelFrame ( MainWindow )
PasekDolny . config ( bd = 0 , bg = B_tytultlo , fg = B_tytultext )
PasekDolny . grid ( row = 4 )
InfoLabel = TK . Label ( PasekDolny )
InfoLabel . config ( text = ' GeneratorCSV 3.0 | © Mateusz Skoczek 2019 dla ZSP Sobolew ' )
InfoLabel . config ( justify = ' left ' , anchor = ' w ' , width = 107 )
InfoLabel . config ( bg = B_tytultlo , fg = B_tytultext )
2020-08-06 18:10:55 +02:00
InfoLabel . grid ( row = 0 , column = 0 )
def InfoOpen ( ) :
try :
x = open ( ' instrukcja.txt ' )
except FileNotFoundError :
2020-08-06 18:12:58 +02:00
MDdlg . Err ( E001x02 )
2020-08-06 18:10:55 +02:00
else :
OS . system ( " notepad instrukcja.txt " )
2020-08-06 18:12:58 +02:00
PrzyciskINFO = TK . Button ( PasekDolny )
PrzyciskINFO . config ( text = ' Instrukcja ' )
PrzyciskINFO . config ( command = InfoOpen )
PrzyciskINFO . config ( bg = B_przycisktlo , fg = B_przycisktext , relief = ' flat ' , activebackground = B_przycisktlo )
PrzyciskINFO . grid ( row = 0 , column = 1 , padx = 5 , pady = 5 )
2020-08-06 18:10:55 +02:00
2020-08-06 18:12:58 +02:00
PrzyciskUSTAWIENIA = TK . Button ( PasekDolny )
PrzyciskUSTAWIENIA . config ( text = ' Ustawienia ' )
PrzyciskUSTAWIENIA . config ( command = settings )
PrzyciskUSTAWIENIA . config ( bg = B_przycisktlo , fg = B_przycisktext , relief = ' flat ' )
PrzyciskUSTAWIENIA . grid ( row = 0 , column = 2 , padx = 5 , pady = 5 )
2020-08-06 18:10:55 +02:00
2020-08-06 18:12:58 +02:00
MainWindow . mainloop ( )
main ( )