# !!!!! Przed uruchomieniem skryptu WYŁĄCZYĆ EXCELA !!!! # zmieić miejsce dźwięku # w cmd: pip install playsound, pandas, datetime, xlsxwriter, pyinstaller # generowanie pliku exe (bez kodu) # cmd: pyinstaller.exe main.py --onefile -i ico.ico --name PomiarKardiocepcji # Import metod z klas # from <klasa> import <metoda> from time import sleep from random import choice from datetime import datetime from os import system from sys import exit, exc_info from pandas import DataFrame, ExcelWriter from playsound import playsound from vlc import MediaPlayer from log import Log if(__name__ == "__main__"): # Przypisanie pliku audio audio = "ding.mp3" # Wywołanie instancji klas log = Log() media = MediaPlayer(audio) log.info("Start programu") id_patient = input("Wpisz numer pacjenta: ") log.info(f"Użytkownik wpisał numer pacjenta: {id_patient}") #### Przygotowanie stringów #### instructions = """ Bierzesz udział w badaniu sprawdzającym jeden ze składników zmysłu interocepcji - kardiocepcję. Twoje zadanie będzie polegało na liczeniu, ile uderzeń serca czujesz w podanym okienku czasowym. O momencie rozpoczęcia liczenia będziesz poinformowany sygnałem dźwiękowym. Proszę skup się na swoich odczuciach i nie wspomagaj się dodatkowymi urządzeniami mierzącymi aktywność Twojego serca. """ relax = "Zrelaksuj się, oddychaj spokojnie..." info_count_heart = "Za chwilę usłyszysz sygnał dźwiękowy. Po sygnale rozpocznij liczenie uderzeń serca" ### Koniec przygotowania stringów # Wyświetlanie zmiennej instructions print(instructions) log.info(f"Wyświetlenie instrukcji") # Zatrzymanie skryptu na 5 sekund sleep(5) # Interakcja użytkownika - w tym przypadku wywołanie metody input nie skutkuje niczym # Wartość funkcji input (tego co wpiszę użytkownik) nie jest nigdzie przekazywana dalej input("Jeżeli przeczytałeś/aś wciśnij jakiś klawisz: ") log.info(f"Użytkownik potwierdził instrukcję") # Wyświetlenie zmiennej relax print(relax) log.info(f"Wyświetlono relaks") # Zatrzymanie skryptu na 10 sekund sleep(10) # tablica sekund do losowania tab_seconds = [30, 45, 60] # Stworzenie pustej tablicy, do której będą wpisywane dane pod wyciąg w excelu tmp_for_excel_tab = [] # Stworzenie pętli # W dosłownym tłum. dla wartości "i" przypisz kolejno wartości od 1 do 4 (+1 bo liczy od 0, dlatego 6) # z przesunięciem o 1 (bo można też np. 0,5... o 2 itd.) for i in range(1, 5, 1): # Stworzenie pętli # W dosłownym tłum. dla wartości "j" przypisz kolejno wartości od 1 do 3 (+1 bo liczy od 0, dlatego 5) # z przesunięciem o 1 (bo można też np. 0,5... o 2 itd.) for j in range(1, 4, 1): # czyść to co już zostało napisane w konsoli system("cls") log.info(f"Wyczyszczono cmd") print(info_count_heart) log.info(f"Wyświetlono informację o sygnalę dźwiękowym") # przypisanie do zmiennej accept tego co wpisze użytkownik accept = input("Jesteś gotowy/a?: ") log.info(f"Użytkownik potwierdził gotowość") # Jeżeli to co napisał użytkownik i zmienisz to na małe znaki = "nie" lub "n" # to: # 1. napisz "Zamykam program" # 2. zatrzymaj program na 5 sekund (tak, aby zdążył to przeczytać) # 3. komenda exit() zamyka cały program if((accept.lower() == "nie") or (accept.lower() == "n")): print("Zamykam program.") sleep(5) exit() # do zmiennej seconds przypisz wylosowaną wartość z tab_seconds seconds = choice(tab_seconds) log.info(f"Wylosowano {seconds} sekund") sleep(5) print(f"Po sygnale licz liczbę uderzeń serca przez {seconds} sekund.") sleep(3) try: playsound(audio) log.info(f"Odtworzono dźwięk") except: log.exception(exc_info()) try: log.warning("Próbuję innego kodeka audio") media.play() except: log.exception(exc_info()) finally: media.stop() log.info(f"Odtworzono dźwięk") log.info(f"Start odliczania") # do zmiennej time_start przypisz aktualny czas i sformatuj go do HH:MM:SS.F RRRR-MM-DD time_start = datetime.now().strftime("%H:%M:%S.%f") log.info(f"Zastopowano program na {seconds} sekund") sleep(seconds) print("Koniec liczenia...") log.info(f"Koniec odliczania") time_end = datetime.now().strftime("%H:%M:%S.%f") try: playsound(audio) log.info(f"Odtworzono dźwięk") except: log.exception(exc_info()) try: log.warning("Próbuję innego kodeka audio") media.play() except: log.exception(exc_info()) finally: media.stop() finally: print("Wystąpił problem z odtworzeniem dźwieku\n") # Stworzenie walidacji na to co wpisuje użytkownik # Wykonuj dopóki nie ma błędu while True: # Obsługa wyjątku try: <kod> except: <obsługa błędu> try: # do zmiennej user_count_hear przypisz LICZBOWĄ CAŁKOWITĄ wartość tego co wpiszę użytkownik user_count_heart = int(input("Ile uderzeń naliczyłeś/aś?: ")) log.info(f"Użytkownik wpisał {user_count_heart} uderzeń") except ValueError: print("Wpisana wartość musi być liczbą !") log.error("Użytkownik wpisał wartość niebędącą liczbą") # Jeżeli wystąpi błąd ValueError # komenda continue tworzy nową iterację pętli while continue else: # Jeżeli nie wpadł w błąd to komenda break przerywa pętlę break # Do pustej tablicy dodaj kolejno wszystkie parametry tmp_for_excel_tab.append([seconds, user_count_heart, time_start, time_end]) log.info("Dodano wartości do tablicy tymczasoej") print(relax) log.info(f"Wyświetlono relaks") sleep(10) log.info(f"Zatrzymanie programu na 10 sekund") print(f"Koniec {i} serii...") log.info(f"Koniec {i} serii...") sleep(5) # Zadeklarowanie nazwy pliku excel output_file = f"Wynik_{id_patient}.xlsx" # Do zmiennej df przypisujemy stworzenie obieku typu DataFrame (taka tabelka excelowa w formie Pythonowej) # Z danymi w zmiennej tmp_for_excel_tab oraz kolumnami, które nazywają się columns=[...] while True: ok = False try: df = DataFrame(tmp_for_excel_tab, columns=["Wylosowany czas", "Liczba uderzeń wpisana przez pacjenta", "Czas startu", "Czas zakonczenia"]) log.info(f"Stworzenie DataFrame (inside Excel)") # do zmiennej output deklarujemy, że to będzie plik w formacie excelowym na silniku xlsxwriter output = ExcelWriter(output_file, engine="xlsxwriter") log.info(f"Zadeklarowano plik wyjściowy") # obiekt typu Dataframe eksportuj do pliku excel, gdzie arkusz ma się nazywać "Wyniki" df.to_excel(output, sheet_name="Wyniki") log.info(f"Eksport danych") # do zmiennej workbook przypisz plik excel workbook = output.book # do zmiennej worksheet przypisz arkusz "Wyniki" worksheet = output.sheets["Wyniki"] # deklarujemy format komórek, aby ładnie wyglądało format_data = workbook.add_format() # przypisz do format_data wyrównanie centralnie w pionie format_data.set_align("vcenter") # przypisz do format_data wyrównanie centralnie w poziomie format_data.set_align("center") # Nagłowek ma inne właściwości w excelu niż dane # Dlatego Nagłowek musi mieć dedykowane formatowanie format_header = workbook.add_format({ "bold": True, "text_wrap": True, "valign": "vcenter", "align": "center", "border": 1, "fg_color": "#fffba6" }) # Tworzymy pętle, z której dla wiersza pierwszego (liczymy od 0) # przypisujemy dla kolumny pierwszej col_num (liczymy od 0) wartość value i formatowanie # idziemy kolumnami col_num +1 po przejściach z pętli for col_num, value in enumerate(df.columns.values): worksheet.write(0, col_num+1, value, format_header) # Przypisujemy dla wcześniej zadeklarowanego worksheet ("Wyniki") # dla kolumn od B do D # szerokość kolumny 20.71 (trzeba wejść do excela i rozszerzyć kolumnę na tyle pixeli ile chcemy), a obok jest podana wartość w formie takiej formie # formatowanie zadeklarowane jako format_data worksheet.set_column("B:C", 20.71, format_data) # tutaj akurat 20.71 to 150 px worksheet.set_column("D:E", 27.86, format_data) log.info(f"Ustawiono formatowanie") # Zapisujemy plik output.close() log.info(f"Zapis pliku") ok = True except: input(exc_info()[:-1]) print("Jeżeli jest access denied to zamknij plik excel.") log.exception(exc_info()) ok = False finally: if(ok == True): break print(relax) log.info(f"Wyświetlono relaks") log.info(f"Zatrzymanie programu na 5 min") # 5*60 to 5 min sleep(5*60) print("Koniec eksperymentu!") exit()