4.0 Alpha (Build 19346)

This commit is contained in:
2020-08-06 18:10:55 +02:00
Unverified
parent 7942cdac70
commit e16844fcce
19 changed files with 326 additions and 613 deletions

View File

@@ -2,7 +2,7 @@
<module type="PYTHON_MODULE" version="4">
<component name="NewModuleRootManager">
<content url="file://$MODULE_DIR$" />
<orderEntry type="jdk" jdkName="Python 3.8 (Zadanie 4)" jdkType="Python SDK" />
<orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" />
</component>
<component name="TestRunnerService">

2
.idea/modules.xml generated
View File

@@ -2,7 +2,7 @@
<project version="4">
<component name="ProjectModuleManager">
<modules>
<module fileurl="file://$PROJECT_DIR$/.idea/GeneratorCSV.iml" filepath="$PROJECT_DIR$/.idea/GeneratorCSV.iml" />
<module fileurl="file://$PROJECT_DIR$/.idea/GeneratorCSV 3.1.iml" filepath="$PROJECT_DIR$/.idea/GeneratorCSV 3.1.iml" />
</modules>
</component>
</project>

47
.idea/workspace.xml generated
View File

@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ChangeListManager">
<list default="true" id="f2c161d8-ce90-4812-beb4-a44c9013c541" name="Default Changelist" comment="" />
<list default="true" id="a4251987-c37e-4856-aaee-adde546bed78" name="Default Changelist" comment="" />
<option name="EXCLUDED_CONVERTED_TO_IGNORED" value="true" />
<option name="SHOW_DIALOG" value="false" />
<option name="HIGHLIGHT_CONFLICTS" value="true" />
@@ -15,10 +15,9 @@
</list>
</option>
</component>
<component name="ProjectId" id="1UCu6ZWXUKDrAFKKgXFMJB1R5q3" />
<component name="ProjectId" id="1ULHfQb5VkZDNLqAqiV5YEYWfmE" />
<component name="PropertiesComponent">
<property name="WebServerToolWindowFactoryState" value="false" />
<property name="settings.editor.selected.configurable" value="com.jetbrains.python.configuration.PyActiveSdkModuleConfigurable" />
</component>
<component name="RunDashboard">
<option name="ruleStates">
@@ -32,9 +31,9 @@
</list>
</option>
</component>
<component name="RunManager" selected="Python.generator">
<component name="RunManager">
<configuration name="generator" type="PythonConfigurationType" factoryName="Python" temporary="true">
<module name="GeneratorCSV" />
<module name="GeneratorCSV 3.1" />
<option name="INTERPRETER_OPTIONS" value="" />
<option name="PARENT_ENVS" value="true" />
<envs>
@@ -55,32 +54,9 @@
<option name="INPUT_FILE" value="" />
<method v="2" />
</configuration>
<configuration name="test" type="PythonConfigurationType" factoryName="Python" temporary="true">
<module name="GeneratorCSV" />
<option name="INTERPRETER_OPTIONS" value="" />
<option name="PARENT_ENVS" value="true" />
<envs>
<env name="PYTHONUNBUFFERED" value="1" />
</envs>
<option name="SDK_HOME" value="" />
<option name="WORKING_DIRECTORY" value="$PROJECT_DIR$" />
<option name="IS_MODULE_SDK" value="true" />
<option name="ADD_CONTENT_ROOTS" value="true" />
<option name="ADD_SOURCE_ROOTS" value="true" />
<EXTENSION ID="PythonCoverageRunConfigurationExtension" runner="coverage.py" />
<option name="SCRIPT_NAME" value="$PROJECT_DIR$/test.py" />
<option name="PARAMETERS" value="" />
<option name="SHOW_COMMAND_LINE" value="false" />
<option name="EMULATE_TERMINAL" value="false" />
<option name="MODULE_MODE" value="false" />
<option name="REDIRECT_INPUT" value="false" />
<option name="INPUT_FILE" value="" />
<method v="2" />
</configuration>
<recent_temporary>
<list>
<item itemvalue="Python.generator" />
<item itemvalue="Python.test" />
</list>
</recent_temporary>
</component>
@@ -89,16 +65,12 @@
</component>
<component name="TaskManager">
<task active="true" id="Default" summary="Default task">
<changelist id="f2c161d8-ce90-4812-beb4-a44c9013c541" name="Default Changelist" comment="" />
<created>1574872723273</created>
<changelist id="a4251987-c37e-4856-aaee-adde546bed78" name="Default Changelist" comment="" />
<created>1575129057993</created>
<option name="number" value="Default" />
<option name="presentableId" value="Default" />
<updated>1574872723273</updated>
<workItem from="1574872724849" duration="19564000" />
<workItem from="1574945757291" duration="32858000" />
<workItem from="1575021304049" duration="1032000" />
<workItem from="1575022913504" duration="500000" />
<workItem from="1575031053599" duration="646000" />
<updated>1575129057993</updated>
<workItem from="1575129059395" duration="10526000" />
</task>
<servers />
</component>
@@ -106,7 +78,6 @@
<option name="version" value="1" />
</component>
<component name="com.intellij.coverage.CoverageDataManagerImpl">
<SUITE FILE_PATH="coverage/GeneratorCSV$test.coverage" NAME="test Coverage Results" MODIFIED="1574890328703" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="coverage.py" COVERAGE_BY_TEST_ENABLED="true" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$" />
<SUITE FILE_PATH="coverage/GeneratorCSV$generator.coverage" NAME="generator Coverage Results" MODIFIED="1575023380703" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="coverage.py" COVERAGE_BY_TEST_ENABLED="true" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$" />
<SUITE FILE_PATH="coverage/GeneratorCSV_3_1$generator.coverage" NAME="generator Coverage Results" MODIFIED="1575142941417" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="coverage.py" COVERAGE_BY_TEST_ENABLED="true" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$" />
</component>
</project>

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

6
changelog-UC.txt Normal file
View File

@@ -0,0 +1,6 @@
4.0 Alpha (Build 19346)
- Wstępne podzielenie programu na kilka modułów i przeniesienie ich do folderu 'components'
- Dodanie w głównym (nadrzędnym) folderze programu, skryptu inicjującego główny moduł programu
- Dodanie zapisu opcji czarnego motywu do 'config.cfg'
- Wstępne stworzenie skryptu pozwalającego na zapis do pliku 'config.cfg'
- Błąd o braku głównego pliku składowego programu ('main.py') oraz modułu wywołującego okna dialogowe ('dialog.py')

View File

@@ -19,3 +19,4 @@
- Poprawka błędu - pole 3 i 4 nie mają już przypisanej tej samej zmiennej tekstowej
- Przydzielenie wersji, autorów, tytułu programu i lat pracy do zmiennych globalnych środowiska graficznego
4.0 - Work in progress

Binary file not shown.

Binary file not shown.

49
components/dialog.py Normal file
View File

@@ -0,0 +1,49 @@
"""
# GeneratorCSV
# Wersja 4.0: UC 1
# by Mateusz Skoczek
# luty 2019 - grudzień 2019
# dla ZSP Sobolew
#
# Moduł wywołujący okna dialogowe
#
"""
# ---------------------------------------- # Import bibliotek zewnętrznych # ----------------------------------------- #
from tkinter import messagebox as TKmsb
import sys as SS
# --------------------------------------------------- # Funkcje # ---------------------------------------------------- #
# Okno dialogowe błędu
def Err(KodBledu):
Message = 'Wystąpił błąd!\n' + KodBledu[0]
TKmsb.showerror('Błąd', Message)
if KodBledu[1]:
SS.exit(0)
# Okno dialogowe informacyjne
def Inf(KodInformacji):
TKmsb.showinfo('Informacja', KodInformacji[0])
if KodInformacji[1]:
SS.exit(0)
# Okno dialogowe zapytania
def Ask(KodZapytania):
if TKmsb.askokcancel('Pytanie', KodZapytania):
return True
else:
return False

20
components/load_config.py Normal file
View File

@@ -0,0 +1,20 @@
"""
# GeneratorCSV
# Wersja 4.0: UC 1
# by Mateusz Skoczek
# luty 2019 - grudzień 2019
# dla ZSP Sobolew
#
# Moduł zarządzający plikiem konfiguracyjnym
#
"""
def read():
with open('.\config.cfg') as cfg:
cfg = cfg.read().split('\n')
settings = []
for x in cfg
def edit():
pass

220
components/main.py Normal file
View File

@@ -0,0 +1,220 @@
"""
# GeneratorCSV
# Wersja 4.0: UC 1
# by Mateusz Skoczek
# luty 2019 - grudzień 2019
# dla ZSP Sobolew
#
# Główny plik składowy programu
#
"""
# ----------------------------------------- # Definicja kodów dialogowych # ------------------------------------------ #
E000x01 = "Brak modułu wywołującego okna dialogowe ('dialog.py').\nPrzywróć plik. (E000x01)"
E000x02 = ["Brak modułu zarządzającego plikiem konfiguracyjnym ('load_config.py').\nPrzywróć plik. (E000x02)", True]
# ----------------------------------- # Import bibliotek zewnętrznych i modułów # ------------------------------------ #
# Biblioteki zewnętrzne
import os as OS
import sys as SS
# Moduły składowe programu
try:
import dialog as MDdlg
except ModuleNotFoundError:
print('Nieoczekiwany wyjatek - nie mozna wygenerowac okna dialogowego bledu\n\nBŁĄD KRYTYCZNY!\n%s') %E000x01
wait = input('Naciśnij ENTER aby zakończyć')
SS.exit(0)
try:
import load_config as MDlcg
except ModuleNotFoundError:
MDdlg.Err(E000x02)
# Biblioteki zewnętrzne interfejsu graficznego
from tkinter import filedialog as TKfld
import tkinter as TK
# ------------------------------------- # Uruchomienie interfejsu graficznego # -------------------------------------- #
# Informacje o programie
Nazwa = 'GeneratorCSV'
Wersja = '4.0' #Todo wersja
# Zmienne globalne środowiska graficznego
CiemnyMotyw =
SzerokoscOpisu = 17
SzerokoscPola = 91
def settings():
SettingsWindow = TK.Tk()
SettingsWindow.title('ustawienia')
SettingsWindow.mainloop()
def main():
# Tworzenie okna głównego
MainWindow = TK.Tk()
MainWindow.title(Nazwa + ' ' + Wersja)
MainWindow.resizable(width = False, height = False)
Tytul = TK.Label(MainWindow, text='GeneratorCSV', font=('Segoe UI Semilight', 20), borderwidth=7, justify='center',
bg='Gainsboro', width=47)
Tytul.grid(row=0)
MainWindow.mainloop()
main()
"""
def gui():
# Tworzenie okna
OknoGlowne = TK.Tk()
OknoGlowne.title('GeneratorCSV')
OknoGlowne.resizable(width=False, height=False)
# Nazwa programu
# Tworzenie frame dla ścieżek plików do importu
Ramka1 = TK.LabelFrame(OknoGlowne, text='Pliki do importu zawierające dane')
Ramka1.grid(row=1)
# Ścieżka pliku do importu 1
wiersz1 = 0
text1 = TK.StringVar()
OpisPola1 = TK.Label(Ramka1, text='Plik z danymi (1)', justify='left', width=SzerokoscOpisu)
OpisPola1.grid(row=wiersz1, column=0)
Pole1 = TK.Entry(Ramka1, textvariable=text1, width=SzerokoscPola)
Pole1.grid(row=wiersz1, column=1)
def Browse1_Dialog():
Browse1.filename = TKfld.askopenfilename(initialdir="/", title="Wybierz plik",
filetypes=(("Pliki txt", "*.txt"), ("Wszystkie pliki", "*.*")))
Pole1.delete(0, 'end')
Pole1.insert(0, Browse1.filename)
Browse1 = TK.Button(Ramka1, text='...', command=Browse1_Dialog, background='silver', relief='flat')
Browse1.grid(row=wiersz1, column=2, padx=5, pady=3)
# Ścieżka pliku do importu 2
wiersz2 = 1
text2 = TK.StringVar()
OpisPola2 = TK.Label(Ramka1, text='Plik z danymi (2)', justify='left', width=SzerokoscOpisu)
OpisPola2.grid(row=wiersz2, column=0)
Pole2 = TK.Entry(Ramka1, textvariable=text2, width=SzerokoscPola)
Pole2.grid(row=wiersz2, column=1)
def Browse2_Dialog():
Browse2.filename = TKfld.askopenfilename(initialdir="/", title="Wybierz plik",
filetypes=(("Pliki txt", "*.txt"), ("Wszystkie pliki", "*.*")))
Pole2.delete(0, 'end')
Pole2.insert(0, Browse2.filename)
Browse2 = TK.Button(Ramka1, text='...', command=Browse2_Dialog, background='silver', relief='flat')
Browse2.grid(row=wiersz2, column=2, padx=5, pady=3)
# Ścieżka pliku do importu 3
wiersz3 = 2
text3 = TK.StringVar()
OpisPola3 = TK.Label(Ramka1, text='Plik z danymi (3)', justify='left', width=SzerokoscOpisu)
OpisPola3.grid(row=wiersz3, column=0)
Pole3 = TK.Entry(Ramka1, textvariable=text3, width=SzerokoscPola)
Pole3.grid(row=wiersz3, column=1)
def Browse3_Dialog():
Browse3.filename = TKfld.askopenfilename(initialdir="/", title="Wybierz plik",
filetypes=(("Pliki txt", "*.txt"), ("Wszystkie pliki", "*.*")))
Pole3.delete(0, 'end')
Pole3.insert(0, Browse3.filename)
Browse3 = TK.Button(Ramka1, text='...', command=Browse3_Dialog, background='silver', relief='flat')
Browse3.grid(row=wiersz3, column=2, padx=5, pady=3)
# Ścieżka pliku do importu 4
wiersz4 = 3
text4 = TK.StringVar()
OpisPola4 = TK.Label(Ramka1, text='Plik z danymi (4)', justify='left', width=SzerokoscOpisu)
OpisPola4.grid(row=wiersz4, column=0)
Pole4 = TK.Entry(Ramka1, textvariable=text3, width=SzerokoscPola)
Pole4.grid(row=wiersz4, column=1)
def Browse4_Dialog():
Browse4.filename = TKfld.askopenfilename(initialdir="/", title="Wybierz plik",
filetypes=(("Pliki txt", "*.txt"), ("Wszystkie pliki", "*.*")))
Pole4.delete(0, 'end')
Pole4.insert(0, Browse4.filename)
Browse4 = TK.Button(Ramka1, text='...', command=Browse4_Dialog, background='silver', relief='flat')
Browse4.grid(row=wiersz4, column=2, padx=5, pady=3)
# Tworzenie frame dla plików export
Ramka2 = TK.LabelFrame(OknoGlowne, text='Ustawienia eksportu')
Ramka2.grid(row=2)
# Ścieżka folderu do zapisu wygenerowanych plików
text4 = TK.StringVar()
OpisPolaExport = TK.Label(Ramka2, text='Lokalizacja', justify='left', width=SzerokoscOpisu)
OpisPolaExport.grid(row=0, column=0)
PoleExport = TK.Entry(Ramka2, textvariable=text4, width=SzerokoscPola)
PoleExport.grid(row=0, column=1)
def BrowseExport_Dialog():
BrowseExport.filename = TKfld.askdirectory()
PoleExport.delete(0, 'end')
PoleExport.insert(0, BrowseExport.filename)
BrowseExport = TK.Button(Ramka2, text='...', command=BrowseExport_Dialog, background='silver', relief='flat')
BrowseExport.grid(row=0, column=2, padx=5, pady=3)
# Przycisk START
Przycisk = TK.Button(OknoGlowne, text='START', justify='center', width=50, relief='flat', background='silver')
command=Main
Przycisk.grid(row=3, pady=15)
# Pasek dolny
PasekDolny = TK.LabelFrame(OknoGlowne, bd=0, background='Gainsboro')
PasekDolny.grid(row=4)
InfoLabel = TK.Label(PasekDolny, text='GeneratorCSV 3.0 | © Mateusz Skoczek 2019 dla ZSP Sobolew', justify='left',
width=93, anchor='w', background='Gainsboro')
InfoLabel.grid(row=0, column=0)
def InfoOpen():
try:
x = open('instrukcja.txt')
except FileNotFoundError:
DG.err(E001x03)
else:
OS.system("notepad instrukcja.txt")
Przycisk = TK.Button(PasekDolny, text='Instrukcja', justify='center', foreground='blue', relief='flat',
command=InfoOpen, background='Gainsboro')
Przycisk.grid(row=0, column=1)
TK.mainloop()
gui()
"""

View File

@@ -1 +1,2 @@
Ciemny motyw: 1
Kodowanie: utf-8

141
format.py
View File

@@ -1,141 +0,0 @@
# Oznaczenia zmiennych:
# K - Klasa
# N - Nazwisko
# I - Imie
# L - Login do librusa
import codecs as cd
def SprawdzKlasa(K):
if len(K.split(' ')) != 2: # Wywołuje błąd jeżeli napis nie dzieli się w pożądanym formacie
blad = int('x') #
for x in range(0,10): #
if K[1:].find(str(x)) != -1: # Wywołuje bląd jeżeli w nazwie klasy (poza numerem klasy) znajduje się liczba
blad = int('x') #
numery_niedozwolone = [0,9,8,7,6,5,4] # Określa numery klas które nie istnieją
for x in numery_niedozwolone: #
if K[0] == str(x): # Wywołuje błąd jeżeli numer klasy jest równy numerowi niedozwolonemu
blad = int('x') #
szkoly = ['BS', 'LO'] # Określa istniejące szkoly
if K.split(' ')[1] not in szkoly: # Wywołuje błąd jeżeli szkola nie należy do szkół istniejących
blad = int('x') #
oddzialy = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'r', 's', 't', 'w', 'y', 'z'] # Określa istniejące oddzialy
if K[1] not in oddzialy: # Wywołuje błąd jeżeli oddział nie należy do oddziałów istniejących
blad = int('x') #
def SprawdzNazwisko(N):
for a in N:
for x in range(0,10): #
if a.find(str(x)) != -1: # Wywoluje blad jeżeli nazwisko zawiera liczbę
blad = int('x') #
def SprawdzImie(I):
for x in range(0,10): #
if I.find(str(x)) != -1: # Wywoluje blad jeżeli imie zawiera liczbę
blad = int('x') #
def SprawdzLogin(L, CzyUczen):
if CzyUczen and L[-1] != 'u': # Wywoluje blad jeżeli login ucznia nie zawiera na końcu 'u'
blad = int('x') #
if CzyUczen: #
blad = int(L[:-1]) # Wywoluje blad jeżeli login (-'u' dla ucznia) nie jest liczbą
else: #
blad = int(L) #
def przetworz(dane):
dane = dane.split('\n\n') # dzielenie danych na pojedyńcze osoby
przetworzone = [] # tworzenie kontenera na przetworzone dane
for osoba in dane: #
try: #
x = int(osoba[0]) #
except ValueError: # Sprawdza czy osoba jest nauczycielem czy uczniem
CzyUczen = False #
else: #
CzyUczen = True #
# Dla uczniów
if CzyUczen:
K = osoba.split(', ')[0].split(' ')[:2]
K = K[0] + ' ' + K[1]
N = osoba.split(', ')[0].split(' ')[2:]
I = osoba.split(', ')[1].split(' ')[0]
L = osoba.split(', ')[1].split(' ')[2]
# Sprawdzenie poprawności
SprawdzKlasa(K)
SprawdzNazwisko(N)
SprawdzImie(I)
SprawdzLogin(L, CzyUczen)
dane = [K, N, I, L, CzyUczen]
przetworzone.append(dane)
# Dla nauczycieli
else:
N = osoba.split(', ')[0].split(' ')
I = osoba.split(', ')[1].split(' ')[-4]
L = osoba.split(', ')[1].split(' ')[-2]
# Sprawdzenie poprawnosci
SprawdzNazwisko(N)
SprawdzImie(I)
SprawdzLogin(L, CzyUczen)
dane = [N, I, L, CzyUczen]
przetworzone.append(dane)
return przetworzone
# Legenda do części dokumentacji poniżej:
# X - Dane nieznaczące
# Q - Pusta linia
# Format danych dla uczniów:
# <Klasa> <Nazwisko>, <Imie> <X> <Login do librusa> <X>
# <Q>
# Przykład:
# 1a BS Nowak, Adam <NieznaczaceDane> 1234567u <NieznaczaceDane>
#
# Format danych dla nauczycieli:
# <Nazwisko>, <Imie> <X> <Login do Librusa> <X>
# <Q>
# Przykład:
# Nowak, Adam <NieznaczaceDane> 1234567 <NieznaczaceDane>
#
# Inne:
# - skrypt akceptuje prefix 'ks.', nieuwzględnia go w przetwarzaniu
# - skrypt akceptuje nazwiska holenderskie (typu 'van X', 'van der X' itp.) i uwzględnia je w przetwarzaniu
# - skrypt nie akceptuje nazwisk złożonych (np. Nowak-Kowalska)
# - skrypt wymaga kodowania ANSI

View File

@@ -1,9 +1,14 @@
"""
# GeneratorCSV
# Wersja 3.0.1
# Wersja 4.0: UC 1
# by Mateusz Skoczek
# luty 2019 - grudzień 2019
# dla ZSP Sobolew
#
# Główny skrypt uruchamiający
#
"""
@@ -12,28 +17,9 @@
# ----------------------------------------- # Definicja kodów dialogowych # ------------------------------------------ #
## Defincja błędów ##############################################################################
# E001 - Brak pliku składowego
E001x00 = "Brak pliku formatu 'moduly.py'.\nPrzywróć plik. (E001x00)"
E001x01 = "Brak pliku formatu 'format.py'.\nPrzywróć plik. (E001x01)"
E001x02 = "Brak pliku konfiguracyjnego 'config.cfg'.\nPrzywróć plik. (E001x02)"
E001x03 = "Brak pliku 'instrukcja.txt'.\nPrzywróć plik. (E001x03)"
# E002 - Błąd pliku składowego
E002x02 = "Nieokreślony błąd pliku konfiguracyjnego 'config.cfg'.\nPrzywróć domyślny plik lub popraw ustawienia. (E002x02)"
E002x021 = "Błąd pliku konfiguracyjnego 'config.cfg'.\nPodane kodowanie nie jest obsługiwane\nPrzywróć domyślny plik lub popraw ustawienia. (E002x021)"
# E003 - Błąd lokalizacji plików I/O
E003x01 = "Nie podano lokalizacji plików do importu. (E003x01)"
E003x02 = "Nie podano lokalizacji zapisu wygenerowanych plików. (E003x02)"
E003x111 = "Plik podany w sciezce 1 nie istnieje (E003x111)"
E003x112 = "Plik podany w sciezce 2 nie istnieje (E003x112)"
E003x113 = "Plik podany w sciezce 3 nie istnieje (E003x113)"
E003x114 = "Plik podany w sciezce 4 nie istnieje (E003x114)"
#_______________________________________________________________________________________________#
E000x00 = "Brak głównego pliku składowego programu ('main.py').\nPrzywróć plik. (E000x00)"
@@ -42,21 +28,10 @@ E003x114 = "Plik podany w sciezce 4 nie istnieje (E003x114)"
# ---------------------------------------- # Import bibliotek zewnętrznych # ----------------------------------------- #
## Import bibliotek zewnętrznych ################################################################
import tkinter as tk
import codecs as cd
import os
import time as tm
import sys as ss
# Definicja składowych biblioteki interfejsu graficznego
from tkinter import filedialog as TKfld
from tkinter import messagebox as TKmsb
#_______________________________________________________________________________________________#
import os as OS
import sys as SS
@@ -65,351 +40,13 @@ from tkinter import messagebox as TKmsb
## Weryfikacja istnienia plików składowych programu #############################################
# ----------------------------------------- # Uruchomienie głównego modułu # ----------------------------------------- #
try:
x = open('moduly.py')
except FileNotFoundError:
Message = 'Wystąpił błąd!\n' + E001x00
tk.showerror('Błąd', Message)
ss.exit(0)
try:
x = open('format.py')
except FileNotFoundError:
Message = 'Wystąpił błąd!\n' + E001x01
tk.showerror('Błąd', Message)
ss.exit(0)
#_______________________________________________________________________________________________#
## Import modułów programu ######################################################################
# Import modułów składowych programu
from moduly import ErrorDialog as MDerr
from moduly import FileCheck as MDfck
from moduly import PolishLetterRemover as MDplr
from moduly import ClassTagCreator as MDctc
# Import skryptu przetwarzającego dane
import format as ft
#_______________________________________________________________________________________________#
## Weryfikacja istnienia plików składowych ######################################################
MDfck('format.py', E001x01)
MDfck('config.cfg', E001x02)
MDfck('instrukcja.txt', E001x03)
#_______________________________________________________________________________________________#
## Wczytywanie pliku konfiguracyjnego ###########################################################
try:
with open('config.cfg', 'r') as config:
config = config.read().split('\n')
Kodowanie = str(config[0].strip('Kodowanie: '))
TypyKodowania = ['utf-8', 'cp1252', 'iso-8859-1']
if Kodowanie not in TypyKodowania:
MDerr(E002x021)
fck = open("components\main.py")
except:
MDerr(E002x02)
#_______________________________________________________________________________________________#
## Inicjacja skryptu przetwarzającego dane ######################################################
def Main():
if TKmsb.askokcancel('Ostrzeżenie', "Czy na pewno chcesz rozpocząć generowanie?\nProgram utworzy w podanej lokalizacji pliki 'email.csv' i 'office.csv'.\nJeżeli w podanej lokalizacji istnieją pliki o takich nazwach zostaną one nadpisane."):
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:
MDerr(E003x01)
if sciezkaExport_puste:
MDerr(E003x02)
KontenerDanych = []
if not sciezka1_puste:
try:
x = open(sciezka1)
except FileNotFoundError:
MDerr(E003x111)
else:
with open(sciezka1, 'r') as plik1:
KontenerDanych += ft.przetworz(plik1.read())
if not sciezka2_puste:
try:
x = open(sciezka2)
except FileNotFoundError:
MDerr(E003x112)
else:
with open(sciezka2, 'r') as plik2:
KontenerDanych += ft.przetworz(plik2.read())
if not sciezka3_puste:
try:
x = open(sciezka3)
except FileNotFoundError:
MDerr(E003x113)
else:
with open(sciezka3, 'r') as plik3:
KontenerDanych += ft.przetworz(plik3.read())
if not sciezka4_puste:
try:
x = open(sciezka4)
except FileNotFoundError:
MDerr(E003x114)
else:
with open(sciezka4, 'r') as plik4:
KontenerDanych += ft.przetworz(plik4.read())
KontenerEmail = []
KontenerOffice = []
for osoba in KontenerDanych:
if osoba[-1]:
Klasa = osoba[0]
Imie = osoba[2]
Inicjaly = Imie[0]
Nazwisko = ''
NazwiskoDoEmaila = ''
for x in osoba[1]:
Nazwisko += x + ' '
NazwiskoDoEmaila += ('.' + x)
Inicjaly += x[0]
Nazwisko = Nazwisko[:-1]
ZnacznikKlasy = MDctc(Klasa)
Login = osoba[3]
Adres = MDplr(Imie).lower() + MDplr(NazwiskoDoEmaila).lower() + ZnacznikKlasy + '@losobolew.pl'
Email = Adres + ',' + Login + ':' + MDplr(Inicjaly) + ',500'
Office = Adres + ',' + Imie + ',' + Nazwisko + ',' + Imie + ' ' + Nazwisko + ',uczeń,' + Klasa + ',,,,,,,,,Rzeczypospolita Polska'
KontenerEmail.append(Email)
KontenerOffice.append(Office)
else:
Imie = osoba[1]
Inicjaly = Imie[0]
Nazwisko = ''
NazwiskoDoEmaila = ''
for x in osoba[0]:
Nazwisko += x + ' '
NazwiskoDoEmaila += ('.' + x)
Inicjaly += x[0]
Nazwisko = Nazwisko[:-1]
Login = osoba[2]
Adres = MDplr(Imie).lower() + MDplr(NazwiskoDoEmaila).lower() + '@losobolew.pl'
Email = Adres + ',' + Login + ':' + MDplr(Inicjaly) + ',500'
Office = Adres + ',' + Imie + ',' + Nazwisko + ',' + Imie + ' ' + Nazwisko + ',nauczyciel,,,,,,,,,,Rzeczpospolita Polska'
KontenerEmail.append(Email)
KontenerOffice.append(Office)
sciezkaEmail = sciezkaExport + '/email.csv'
sciezkaOffice = sciezkaExport + '/office.csv'
with cd.open(sciezkaEmail, 'w', Kodowanie) as plikEmail:
for x in KontenerEmail:
plikEmail.writelines(x + '\n')
plikEmail.close()
with cd.open(sciezkaOffice, 'w', Kodowanie) as plikOffice:
for x in KontenerOffice:
plikOffice.writelines(x + '\n')
plikOffice.close()
TKmsb.showinfo('Zakończono', 'Operacja zakończona pomyślnie')
ss.exit(0)
else:
ss.exit(0)
#_______________________________________________________________________________________________#
## Inicjacja okna ###############################################################################
# Zmienne globalne środowiska graficznego
SzerokoscOpisu = 17
SzerokoscPola = 91
TytulProgramu = 'GeneratorCSV'
Autorzy = 'Mateusz Skoczek'
Wersja = '3.0.1'
Lata = '2019'
# Tworzenie okna
OknoGlowne = tk.Tk()
OknoGlowne.title(TytulProgramu)
OknoGlowne.resizable(width = False, height = False)
# Nazwa programu
Tytul = tk.Label(OknoGlowne, text = TytulProgramu, font = ('Segoe UI Semilight', 20), borderwidth = 7, justify = 'center', bg = 'Gainsboro', width = 47)
Tytul.grid(row = 0)
# Tworzenie frame dla ścieżek plików do importu
Ramka1 = tk.LabelFrame(OknoGlowne, text = 'Pliki do importu zawierające dane')
Ramka1.grid(row = 1)
# Ścieżka pliku do importu 1
wiersz1 = 0
text1 = tk.StringVar()
OpisPola1 = tk.Label(Ramka1, text = 'Plik z danymi (1)', justify = 'left', width = SzerokoscOpisu)
OpisPola1.grid(row = wiersz1, column = 0)
Pole1 = tk.Entry(Ramka1, textvariable = text1, width = SzerokoscPola)
Pole1.grid(row = wiersz1, column = 1)
def Browse1_Dialog():
Browse1.filename = TKfld.askopenfilename(initialdir="/", title="Wybierz plik", filetypes=(("Pliki txt", "*.txt"), ("Wszystkie pliki", "*.*")))
Pole1.delete(0, 'end')
Pole1.insert(0, Browse1.filename)
Browse1 = tk.Button(Ramka1, text = '...', command = Browse1_Dialog, background = 'silver', relief = 'flat')
Browse1.grid(row = wiersz1, column = 2, padx = 5, pady = 3)
# Ścieżka pliku do importu 2
wiersz2 = 1
text2 = tk.StringVar()
OpisPola2 = tk.Label(Ramka1, text = 'Plik z danymi (2)', justify = 'left', width = SzerokoscOpisu)
OpisPola2.grid(row = wiersz2, column = 0)
Pole2 = tk.Entry(Ramka1, textvariable = text2, width = SzerokoscPola)
Pole2.grid(row = wiersz2, column = 1)
def Browse2_Dialog():
Browse2.filename = TKfld.askopenfilename(initialdir="/", title="Wybierz plik", filetypes=(("Pliki txt", "*.txt"), ("Wszystkie pliki", "*.*")))
Pole2.delete(0, 'end')
Pole2.insert(0, Browse2.filename)
Browse2 = tk.Button(Ramka1, text = '...', command = Browse2_Dialog, background = 'silver', relief = 'flat')
Browse2.grid(row = wiersz2, column = 2, padx = 5, pady = 3)
# Ścieżka pliku do importu 3
wiersz3 = 2
text3 = tk.StringVar()
OpisPola3 = tk.Label(Ramka1, text = 'Plik z danymi (3)', justify = 'left', width = SzerokoscOpisu)
OpisPola3.grid(row = wiersz3, column = 0)
Pole3 = tk.Entry(Ramka1, textvariable = text3, width = SzerokoscPola)
Pole3.grid(row = wiersz3, column = 1)
def Browse3_Dialog():
Browse3.filename = TKfld.askopenfilename(initialdir="/", title="Wybierz plik", filetypes=(("Pliki txt", "*.txt"), ("Wszystkie pliki", "*.*")))
Pole3.delete(0, 'end')
Pole3.insert(0, Browse3.filename)
Browse3 = tk.Button(Ramka1, text = '...', command = Browse3_Dialog, background = 'silver', relief = 'flat')
Browse3.grid(row = wiersz3, column = 2, padx = 5, pady = 3)
# Ścieżka pliku do importu 4
wiersz4 = 3
text4 = tk.StringVar()
OpisPola4 = tk.Label(Ramka1, text = 'Plik z danymi (4)', justify = 'left', width = SzerokoscOpisu)
OpisPola4.grid(row = wiersz4, column = 0)
Pole4 = tk.Entry(Ramka1, textvariable = text4, width = SzerokoscPola)
Pole4.grid(row = wiersz4, column = 1)
def Browse4_Dialog():
Browse4.filename = TKfld.askopenfilename(initialdir="/", title="Wybierz plik", filetypes=(("Pliki txt", "*.txt"), ("Wszystkie pliki", "*.*")))
Pole4.delete(0, 'end')
Pole4.insert(0, Browse4.filename)
Browse4 = tk.Button(Ramka1, text = '...', command = Browse4_Dialog, background = 'silver', relief = 'flat')
Browse4.grid(row = wiersz4, column = 2, padx = 5, pady = 3)
# Tworzenie frame dla plików export
Ramka2 = tk.LabelFrame(OknoGlowne, text = 'Ustawienia eksportu')
Ramka2.grid(row = 2)
# Ścieżka folderu do zapisu wygenerowanych plików
text4 = tk.StringVar()
OpisPolaExport = tk.Label(Ramka2, text = 'Lokalizacja', justify = 'left', width = SzerokoscOpisu)
OpisPolaExport.grid(row = 0, column = 0)
PoleExport = tk.Entry(Ramka2, textvariable = text4, width = SzerokoscPola)
PoleExport.grid(row = 0, column = 1)
def BrowseExport_Dialog():
BrowseExport.filename = TKfld.askdirectory()
PoleExport.delete(0, 'end')
PoleExport.insert(0, BrowseExport.filename)
BrowseExport = tk.Button(Ramka2, text = '...', command = BrowseExport_Dialog, background = 'silver', relief = 'flat')
BrowseExport.grid(row = 0, column = 2, padx = 5, pady = 3)
# Przycisk START
Przycisk = tk.Button(OknoGlowne, text = 'START', justify = 'center', width = 50, command = Main, relief = 'flat', background = 'silver')
Przycisk.grid(row = 3, pady = 15)
# Pasek dolny
PasekDolny = tk.LabelFrame(OknoGlowne, bd = 0, background = 'Gainsboro')
PasekDolny.grid(row = 4)
info = TytulProgramu + ' ' + Wersja + ' | © ' + Autorzy + ' '+ Lata + ' dla ZSP Sobolew'
InfoLabel = tk.Label(PasekDolny, text = info, justify = 'left', width = 93, anchor = 'w', background = 'Gainsboro')
InfoLabel.grid(row= 0, column = 0)
def InfoOpen():
try:
x = open('instrukcja.txt')
except FileNotFoundError:
MDerr(E001x03)
else:
os.system("notepad instrukcja.txt")
Przycisk = tk.Button(PasekDolny, text = 'Instrukcja', justify = 'center', foreground = 'blue', relief = 'flat', command = InfoOpen, background = 'Gainsboro')
Przycisk.grid(row = 0, column = 1)
tk.mainloop()
#_______________________________________________________________________________________________#
print('Nieoczekiwany wyjatek - nie mozna wygenerowac okna dialogowego bledu\n\nBŁĄD KRYTYCZNY!\n%s') % E000x00
wait = input('Naciśnij ENTER aby zakończyć')
SS.exit(0)
else:
OS.system("components\main.py")

View File

@@ -1,51 +0,0 @@
import sys as ss
import time as tm
from tkinter import messagebox as TKmsb
def ErrorDialog(KodBledu):
Message = 'Wystąpił błąd!\n' + KodBledu
TKmsb.showerror('Błąd', Message)
ss.exit(0)
def FileCheck(Plik, KodBledu):
try:
x = open(Plik)
except FileNotFoundError:
ErrorDialog(KodBledu)
def PolishLetterRemover(text):
text1 = text.replace('ę', 'e')
text2 = text1.replace('ó', 'o')
text3 = text2.replace('ą', 'a')
text4 = text3.replace('ś', 's')
text5 = text4.replace('ł', 'l')
text6 = text5.replace('ż', 'z')
text7 = text6.replace('ź', 'z')
text8 = text7.replace('ć', 'c')
text9 = text8.replace('ń', 'n')
text10 = text9.replace('Ę', 'E')
text11 = text10.replace('Ó', 'O')
text12 = text11.replace('Ą', 'A')
text13 = text12.replace('Ś', 'S')
text14 = text13.replace('Ł', 'L')
text15 = text14.replace('Ż', 'Z')
text16 = text15.replace('Ź', 'Z')
text17 = text16.replace('Ć', 'C')
text = text17.replace('Ń', 'N')
return text
def ClassTagCreator(Klasa):
czas = tm.localtime()
miesiac = czas[1]
if miesiac >= 9:
rokpodst = czas[0]
else:
rokpodst = czas[0] - 1
nrklasy = int(Klasa[0])
literaklasy = Klasa[1]
szkola = Klasa.split(' ')[1]
if szkola == 'BS':
znacznik = str((4 - nrklasy) + rokpodst) + szkola
else:
znacznik = str((5 - nrklasy) + rokpodst) + literaklasy
return znacznik