Kashub's Code Barn - "Python"

podświetlone jako robots (dodał(a) Majster @ 2022-08-23 17:47:35)

Twoja wyszukiwarka
Podświetl ten kod w:
Ostatnio dodane:
Losowe wpisy:
# !!!!! 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()
| Sklep z artykułami dla dzieci | | Sklep z oponami | | Kamery IP sklep | | Dyskretny sexshop internetowy | | Skróć link | | Blog o książkach | | Blogi za darmo | | Gdzie przenieść blog za darmo? | | Załóż za darmo bloga | | Skracacz adresów |