# !!!!! 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()