Streamlit - kwestionariusz

Zaaktualizowałam Kwestionariusz, z użyciem Streamlit (zostawiając pierwotną budowę).

Kwestionariusz:

import streamlit as st
import json
import random

# Baza pytań - taka sama struktura jak poprzednio
if "baza_pytan" not in st.session_state:
    st.session_state.baza_pytan = {
    # baza pytań
    }
st.header("Dodaj pytanie do kwestionariusza")
with st.form(key="formularz_dodawania_pytania"):
    kategoria = st.text_input("Kategoria")
    poziom = st.selectbox("Poziom trudności", ["łatwe", "średnie", "trudne"])
    pytanie = st.text_input("Treść pytania")
    odp1 = st.text_input("Odpowiedź 1")
    odp2 = st.text_input("Odpowiedź 2")
    odp3 = st.text_input("Odpowiedź 3")
    poprawna = st.selectbox("Poprawna odpowiedź", ["1", "2", "3"])
    przycisk_dodaj = st.form_submit_button(label="Dodaj pytanie")
    
    if przycisk_dodaj:
        if kategoria not in st.session_state.baza_pytan:
            st.session_state.baza_pytan[kategoria] = {"łatwe": [], "średnie": [], "trudne": []}
        st.session_state.baza_pytan[kategoria][poziom].append({
            "pytanie": pytanie,
            "odpowiedzi": [odp1, odp2, odp3],
            "poprawna": int(poprawna)-1
        })
        st.success(f"Pytanie dodane do kategorii '{kategoria}'")

# Podgląd kwestionariusza
st.header("Aktualny kwestionariusz")
st.json(st.session_state.baza_pytan)

# Wczytywanie kwestionariusza z pliku JSON
st.header("Wczytaj kwestionariusz z pliku JSON")
plik_wczytany = st.file_uploader("Wybierz plik JSON", type="json")
if plik_wczytany is not None:
    dane = json.load(plik_wczytany)
    st.session_state.baza_pytan.update(dane)
    st.success("Kwestionariusz wczytany!")

st.header("Pobierz kwestionariusz")
if st.session_state.baza_pytan:
    json_dane = json.dumps(st.session_state.baza_pytan, ensure_ascii=False, indent=2)
    st.download_button(label="Pobierz JSON", data=json_dane, file_name="kwestionariusz.json", mime="application/json")

# Start
st.header("Rozpocznij quiz")
if st.button("Start Quizu"):
    if not st.session_state.baza_pytan:
        st.warning("Brak pytań w kwestionariuszu!")
    else:
        wynik = 0
        wszystkie_kategorie = list(st.session_state.baza_pytan.keys())
        wybrane_kategorie = st.multiselect("Wybierz kategorie", wszystkie_kategorie, default=wszystkie_kategorie)
        poziom = st.selectbox("Wybierz poziom", ["łatwe", "średnie", "trudne"])
        
        pytania = []
        for kat in wybrane_kategorie:
            pytania.extend(st.session_state.baza_pytan[kat][poziom])
        
        random.shuffle(pytania)
        for i, p in enumerate(pytania[:10], 1):
            st.markdown(f"**{i}. {p['pytanie']}**") # pogrubienie pytania
            odp = st.radio(f"Wybierz odpowiedź {i}", p['odpowiedzi'], key=i)
            poprawna_odp = p['odpowiedzi'][p['poprawna']]
            if odp == poprawna_odp:
                wynik += 1
        st.success(f"Twój wynik: {wynik} / {len(pytania[:10])}")

Baza Pytań:

st.session_state.baza_pytan = {
        "Zwierzęta": {
                "łatwe": [
                    {
                        "pytanie": "Które zwierzę jest najszybszym lądowym ssakiem?",
                        "odpowiedzi": ["Antylopa", "Gepard", "Struś"],
                        "poprawna": 1
                    },
                    {
                        "pytanie": "Jakie zwierzę jest znane z tego, że potrafi wytwarzać jedwab?",
                        "odpowiedzi": ["Pająk", "Motyl", "Gąsienica jedwabnika"],
                        "poprawna": 2
                    },
                    {
                        "pytanie": "Które zwierzę ma największą ilość zębów?",
                        "odpowiedzi": ["Krokodyl", "Rekin", "Wieloryb"],
                        "poprawna": 0
                    },
                    {
                        "pytanie": "Które zwierzę ma skrzela?",
                        "odpowiedzi": ["Kos", "Słowik", "Foka"],
                        "poprawna": 0
                    },
                    {
                        "pytanie": "Który ptak nie potrafi latać, ale jest jednym z najszybszych biegaczy?",
                        "odpowiedzi": ["Struś afrykański", "Nandu południowoamerykański", "Emu australijski"],
                        "poprawna": 0
                    },
                    {
                        "pytanie": "Które zwierzę posiada najtwardszą skorupę wśród zwierząt lądowych?",
                        "odpowiedzi": ["Żółw pustynny", "Krab kokosowy", "Żółw morski"],
                        "poprawna": 0
                    },
                    {
                        "pytanie": "Jakie zwierzę jest znane z tego, że potrafi wykrywać trzęsienia ziemi?",
                        "odpowiedzi": ["Pies domowy", "Słoń afrykański", "Kret europejski"],
                        "poprawna": 1
                    },
                    {
                        "pytanie": "Które zwierzę potrafi odgryzać swoje ogony, by uciec drapieżnikowi?",
                        "odpowiedzi": ["Wąż zbożowy", "Jaszczurka zielona", "Salamandra plamista"],
                        "poprawna": 1
                    }
                ],

                "średnie": [
                    {
                        "pytanie": "Które zwierzę ma największe oczy spośród ssaków?",
                        "odpowiedzi": ["Sowa śnieżna", "Szakal pręgowany", "Słoń afrykański"],
                        "poprawna": 1
                    },
                    {
                        "pytanie": "Które zwierzę potrafi przeżyć hibernację przez kilka miesięcy, zwalniając całkowicie swoje funkcje życiowe?",
                        "odpowiedzi": ["Wąż zbożowy", "Niedźwiedź", "Świstak"],
                        "poprawna": 2
                    },
                    {
                        "pytanie": "Które zwierzę jest znane z bardzo długiej żywotności, przekraczającej 100 lat?",
                        "odpowiedzi": ["Papuga kakadu", "Rekin wielorybi", "Żółw olbrzymi z Galapagos"],
                        "poprawna": 2
                    },
                    {
                        "pytanie": "Jaki gatunek zwierzęcia ma największe serce w stosunku do masy ciała?",
                        "odpowiedzi": ["Mysz polna", "Koliber", "Kot"],
                        "poprawna": 0
                    },
                    {
                       "pytanie": "Które zwierzę ma język dłuższy niż całe jego ciało?",
                       "odpowiedzi": ["Żaba drzewna", "Mrówkojad", "Kameleon"],
                       "poprawna": 1 
                    },
                    {
                        "pytanie": "Które zwierzę wytwarza najbardziej trujący jad spośród ssaków?",
                        "odpowiedzi": ["Kret ziemny", "Kolczatka australijska", "Dziobak"],
                        "poprawna": 2
                    },
                    {
                        "pytanie": "Które zwierzę słynie z najdłuższej migracji wśród ptaków?",
                        "odpowiedzi": ["Jaskółka", "Bocian biały", "Albatros wędrowny"],
                        "poprawna": 0
                    },
                    {
                        "pytanie": "Które zwierzę jest znane z tego, że potrafi widzieć ultrafioletowe światło, niewidoczne dla ludzi?",
                        "odpowiedzi": ["Nietoperz", "Pies", "Motyl"],
                        "poprawna": 2
                    }
                ],

                "trudne": [
                    {
                        "pytanie": "Które zwierzę ma największe oczy w stosunku do wielkości ciała?",
                        "odpowiedzi": ["Humbak", "Kałamarnica olbrzymia", "Kiwaczek leśny"],
                        "poprawna": 1
                    },
                    {
                        "pytanie": "Jakie zwierzę jest znane z najdłuższego okresu snu (hibernacji) bez przerwy, trwającego nawet do 7 lat?",
                        "odpowiedzi": ["Świstak górski", "Żaba Wooda", "Ślimak z gatunku Melanopsis"],
                        "poprawna": 1
                    },
                    {
                        "pytanie": "Jakie zwierzę posiada największą różnorodność chromosomów (liczba chromosomów u jednego gatunku)?",
                        "odpowiedzi": ["Mrówka Saharaensis", "Człowiek (Homo sapiens)", "Węgorz elektryczny"],
                        "poprawna": 0
                    },
                    {
                        "pytanie": "Które zwierzę ma najdłuższą żywotność znaną wśród kręgowców?",
                        "odpowiedzi": ["Rekin grenlandzki", "Żółw olbrzymi z Galapagos", "Wieloryb grenlandzki"],
                        "poprawna": 0
                    },
                    {
                        "pytanie": "Które zwierzę jest jedynym znanym gatunkiem zdolnym do regeneracji całkowicie utraconych kończyn?",
                        "odpowiedzi": ["Gekon", "Kameleon zwyczajny", "Salamandra plamista"],
                        "poprawna": 0
                    },
                    {
                        "pytanie": "Które zwierzę potrafi zmieniać kolor skóry najszybciej?",
                        "odpowiedzi": ["Kameleon jemeński", "Ośmiornica zwyczajna", "Płaszczka"],
                        "poprawna": 1
                    },
                    {
                        "pytanie": "Które zwierzę jest najbardziej jadowitym wężem na świecie?",
                        "odpowiedzi": ["Mamba czarna", "Kobra królewska", "Tajpan pustynny"],
                        "poprawna": 2
                    },
                    {
                        "pytanie": "Które zwierzę posiada najsilniejszy zmierzony uścisk szczęki na świecie?",
                        "odpowiedzi": ["Lew afrykański", "Orka (wieloryb zabójca)", "Krokodyl nilowy"],
                        "poprawna": 2
                    }
                ]
            },
            "Geografia": {
                "łatwe": [
                    {
                        "pytanie": "Które z tych miast jest stolicą Australii?",
                        "odpowiedzi": ["Sydney", "Canberra", "Melbourne"],
                        "poprawna": 1
                    },
                    {
                        "pytanie": "Jakie morze leży pomiędzy Włochami a Chorwacją?",
                        "odpowiedzi": ["Morze Adriatyckie", "Morze Jońskie", "Morze Egejskie"],
                        "poprawna": 0
                    },
                    {
                        "pytanie": "Który kontynent jest najmniejszy pod względem powierzchni?",
                        "odpowiedzi": ["Australia", "Antarktyda", "Ameryka Południowa"],
                        "poprawna": 0
                    },
                    {
                        "pytanie": "W jakim kraju leży piramida Cheopsa?",
                        "odpowiedzi": ["Egipt", "Sudan", "Libia"],
                        "poprawna": 0
                    },
                    {
                        "pytanie": "Jakie państwo ma największą powierzchnię na świecie?",
                        "odpowiedzi": ["Stany Zjednoczone", "Rosja", "Chiny"],
                        "poprawna": 1
                    },
                    {
                        "pytanie": "Jak nazywa się najdłuższa rzeka w Polsce?",
                        "odpowiedzi": ["Wisła", "Warta", "Odra"],
                        "poprawna": 0
                    },
                    {
                        "pytanie": "Które państwo leży na Półwyspie Iberyjskim?",
                        "odpowiedzi": ["Hiszpania", "Włochy", "Grecja"],
                        "poprawna": 0
                    },
                    {
                        "pytanie": "Które miasto jest stolicą Kanady?",
                        "odpowiedzi": ["Toronto", "Vancouver", "Ottawa"],
                        "poprawna": 2
                    }
                ],
                "średnie": [
                    {
                        "pytanie": "Jakie jest najwyżej położone stale zamieszkane miasto na świecie?",
                        "odpowiedzi": ["La Rinconada – Peru", "Lhasa - Tybet", "El Ato - Boliwia"],
                        "poprawna": 0
                    },
                    {
                        "pytanie": "W którym kraju znajduje się najwięcej jezior na świecie?",
                        "odpowiedzi": ["Kanada", "Rosja", "Stany Zjednoczone"],
                        "poprawna": 0
                    },
                    {
                        "pytanie": "Jak nazywa się największa wyspa świata, która nie jest kontynentem?",
                        "odpowiedzi": ["Nowa Gwinea", "Grenlandia", "Australia"],
                        "poprawna": 1
                    },
                    {
                        "pytanie": "Która rzeka jest najdłuższa w Europie?",
                        "odpowiedzi": ["Dniepr", "Dunaj", "Wołga"],
                        "poprawna": 2
                    },
                    {
                        "pytanie": "W jakim kraju znajduje się największy wulkan świata (Mauna Loa)?",
                        "odpowiedzi": ["Indonezja", "Stany Zjednoczone (Hawaje)", "Papua-Nowa Gwinea"],
                        "poprawna": 1
                    },
                    {
                        "pytanie": "Jakie jest najwyższe pasmo górskie w Afryce?",
                        "odpowiedzi": ["Góry Kilimandżaro", "Góry Smocze", "Góry Atlas"],
                        "poprawna": 0
                    },
                    {
                        "pytanie": "Które z państw leży jednocześnie na dwóch kontynentach, ale cała jego stolica znajduje się po stronie azjatyckiej?",
                        "odpowiedzi": ["Turcja", "Rosja", "Egipt"],
                        "poprawna": 0 # innym państwem który spełnia ten warunek jest Kazachstan (Astana/Nur-Sułtan)
                    },
                    {
                        "pytanie": "Na jakim kontynencie leży jezioro Bajkał?",
                        "odpowiedzi": ["Azja", "Europa", "Ameryka Południowa"],
                        "poprawna": 0
                    }
                ],
                "trudne": [
                    {
                        "pytanie": "Które jezioro jest najstarsze na świecie?",
                        "odpowiedzi": ["Jezioro Bajkał", "Jezioro Tanganika", "Jezioro Wiktorii"],
                        "poprawna": 0
                    },
                    {
                        "pytanie": "Jaka jest największa depresja (najniżej położony punkt) na lądzie poza obszarem mórz i oceanów?",
                        "odpowiedzi": ["Dolina Jordanu", "Dolina Śmierci", "Basen Turfa"],
                        "poprawna": 2
                    },
                    {
                        "pytanie": "Która stolica jest położona na największej wysokości nad poziomem morzaw?",
                        "odpowiedzi": ["La Paz (Boliwia)", "Quito (Ekwador)", "Thimphu (Bhutan)"],
                        "poprawna": 0
                    },
                    {
                        "pytanie": "Jaki jest oficjalny najwyższy szczyt Antarktydy i jaka jest jego wysokość?",
                        "odpowiedzi": ["Mount Vinson – 4 892 m",
                                        "Mount Erebus – 3 794 m", 
                                        "Mount Sidley – 4 285 m"],
                        "poprawna": 0
                    },
                    {
                        "pytanie": "Które państwo ma najwięcej wysp na świecie?",
                        "odpowiedzi": ["Szwecja", "Chiny", "Stany Zjednoczone"],
                        "poprawna": 0 
                    },
                    {
                        "pytanie": "Jaki jest najdłuższy na świecie system jaskiń?",
                        "odpowiedzi": ["Mammoth Cave – USA", "Sistema Sac Actun – Meksyk", "Krubera - Gruzja"],
                        "poprawna": 0
                    },
                    {
                        "pytanie": "W którym kraju znajduje się najwyższy na świecie wodospad?",
                        "odpowiedzi": ["Wenezuela", "Zambia", "Norwegia"],
                        "poprawna": 0
                    },
                    {
                        "pytanie": "Które morze ma największą zasolenie?",
                        "odpowiedzi": ["Morze Martwe", "Morze Czerwone", "Morze Karaibskie"],
                        "poprawna": 0
                    }
                ]
            },
            "Programowanie": {
                "łatwe": [
                    {
                        "pytanie": "Co oznacza skrót IDE w programowaniu?",
                        "odpowiedzi": ["Integrated Development Environment",
                                        "Internal Data Execution",
                                        "Internet Data Exchange"],
                        "poprawna": 0
                    },
                    {
                        "pytanie": "Jaką instrukcję używamy, by wypisać tekst na ekran w Pythonie?",
                        "odpowiedzi": ["print()",
                                        "write()",
                                        "output()"],
                        "poprawna": 0
                    },
                    {
                        "pytanie": "Jakiego znaku używa się do komentowania pojedynczej linii w Pythonie?",
                        "odpowiedzi": ["#", "//", "/*"],
                        "poprawna": 0
                    },
                    {
                        "pytanie": "Co oznacza pojęcie „syntax error”?",
                        "odpowiedzi": ["Błąd w składni kodu, który uniemożliwia jego wykonanie", 
                                       "Błąd logiczny w działaniu programu", 
                                       "Komentarz w kodzie"],
                        "poprawna": 0
                    },
                    {
                        "pytanie": "Co zwróci wyrażenie Python.lower()",
                        "odpowiedzi": ["python", "PYTHON", "Python"],
                        "poprawna": 0
                    },
                    {
                        "pytanie": "Jakiego typu danych zwraca funkcja enumerate()?",
                        "odpowiedzi": ["Iterator zwracający krotki (indeks, wartość)", 
                                       "Listę wartości", 
                                       "Słownik indeksów i wartości"],
                        "poprawna": 0
                    },
                    {
                        "pytanie": "Co oznacza __init__ w definicji klasy w Pythonie?",
                        "odpowiedzi": ["Metodę inicjalizującą nowo utworzony obiekt klasy", 
                                       "Metodę wywoływaną przy usuwaniu obiektu", 
                                       "Metodę definiującą zachowanie obiektu przy wywołaniu funkcji"],
                        "poprawna": 0
                    },
                    {
                        "pytanie": "Jaki operator służy do łączenia (konkatenacji) stringów?",
                        "odpowiedzi": ["+", "*", "/"],
                        "poprawna": 0
                    }
                ],
                "średnie": [
                    {
                        "pytanie": "Co oznacza, że Python jest językiem interpretowanym?",
                        "odpowiedzi": ["Kod jest wykonywany linia po linii przez interpreter, bez konieczności kompilacji", 
                                       "Kod jest wykonywany bezpośrednio przez procesor bez pośrednictwa interpretera", 
                                       "Kod jest kompilowany do pliku wykonywalnego przed uruchomieniem"],
                        "poprawna": 0
                    },
                    {
                        "pytanie": "Jaka jest różnica między listą a słownikiem w Pythonie?",
                        "odpowiedzi": ["Lista przechowuje elementy w kolejności, słownik w parach klucz-wartość bez gwarancji kolejności", 
                                       "Lista może mieć tylko liczby, słownik tylko teksty", 
                                       "Słownik jest typem niemodyfikowalnym (immutable), lista jest modyfikowalna (mutable)"],
                        "poprawna": 0
                    },
                    {
                        "pytanie": "Co oznacza wyjątek (exception) w Pythonie?",
                        "odpowiedzi": ["Błąd, który występuje podczas wykonywania programu i może być obsłużony przez programistę", 
                                       "Sposób na przyspieszenie działania programu", 
                                       "Nowa zmienna deklarowana dynamicznie w programie"],
                        "poprawna": 0
                    },
                    {
                        "pytanie": "Jaki jest efekt wywołania metody append() na liście w Pythonie?",
                        "odpowiedzi": ["Dodaje pojedynczy element na koniec listy, modyfikując ją w miejscu", 
                                       "Tworzy nową listę z dodanym elementem, pozostawiając oryginał bez zmian", 
                                       "Usuwa pierwszy element listy i dodaje nowy na koniec"],
                        "poprawna": 0
                    },
                    {
                        "pytanie": "Co oznacza, że zmienna jest “lokalna” w funkcji?",
                        "odpowiedzi": ["Jest dostępna tylko w obrębie tej funkcji i przestaje istnieć po jej zakończeniu",
                                       "Może być używana w całym programie, ale jest zdefiniowana w funkcji", 
                                       "Jest zmienną globalną z ograniczoną widocznością"],
                        "poprawna": 0
                    },
                    {
                        "pytanie": "Co zwróci wyrażenie bool([]) w Pythonie?",
                        "odpowiedzi": ["False (pusta lista jest traktowana jako fałsz)", 
                                       "True (każda zmienna ma wartość prawdy)", 
                                       "Zwróci błąd"],
                        "poprawna": 0
                    },
                    {
                        "pytanie": "Co to jest wyjątek w programowaniu?",
                        "odpowiedzi": ["Błąd lub zdarzenie, które przerywa normalny przebieg programu, ale można je obsłużyć", 
                                       "Nowy typ zmiennej przechowujący dane wejściowe użytkownika", 
                                       "Specjalna funkcja, która automatycznie poprawia błędy w kodzie"],
                        "poprawna": 0
                    },
                    {
                        "pytanie": "Co oznacza termin „mutable” w kontekście typów danych?",
                        "odpowiedzi": ["Obiekt, którego zawartość można zmieniać po jego utworzeniu", 
                                       "Obiekt, który nie może być skopiowany", 
                                       "Obiekt, który może zmieniać swój typ podczas działania programu"],
                        "poprawna": 0
                    }
                ],
                "trudne": [
                    {
                        "pytanie": "Co w Pythonie oznacza pojęcie immutability (niemodyfikowalności) i które typy danych są tego przykładem?",
                        "odpowiedzi": ["Obiekty, których wartość nie może być zmieniona po utworzeniu, np. tuple i string", 
                                       "Obiekty, które można kopiować bez zmiany oryginału", 
                                       "Możliwość zmiany wartości po utworzeniu obiektu"],
                        "poprawna": 0
                    },
                    {
                        "pytanie": "Jakie jest podstawowe zastosowanie funkcji lambda w Pythonie?",
                        "odpowiedzi": ["Definiowanie krótkich funkcji anonimowych, zwykle jednowierszowych", 
                                       "Tworzenie modułów", 
                                       "Tworzenie klas dynamicznie"],
                        "poprawna": 0
                    },
                    {
                        "pytanie": "Czym jest i do czego służy virtual environment (środowisko wirtualne) w Pythonie?",
                        "odpowiedzi": ["Izolowanym środowiskiem, które pozwala na instalowanie pakietów bez wpływu na system globalny", 
                                       "Programem do zarządzania pamięcią", 
                                       "Specjalnym typem pliku wykonywalnego"],
                        "poprawna": 0
                    },
                    {
                        "pytanie": "Jaka jest różnica między listą a krotką (tuple) w Pythonie?",
                        "odpowiedzi": ["Lista jest zmienialna (mutable), a krotka niezmienialna (immutable)", 
                                       "Krotka jest typem globalnym, lista lokalnym", 
                                       "Krotka jest zmienialna (mutable), a lista niezmienialna (immutable)"],
                        "poprawna": 0
                    },
                    {
                        "pytanie": "Czym jest metaklasa w Pythonie i jakie jest jej główne zastosowanie?",
                        "odpowiedzi": ["Klasa tworząca inne klasy, kontrolująca ich sposób tworzenia", 
                                       "Klasa, która dziedziczy po klasie bazowej", 
                                       "Klasa służąca do serializacji danych"],
                        "poprawna": 0
                    },
                    {
                        "pytanie": "Jak działa garbage collector w Pythonie i jaka jest różnica między referencyjnym zliczaniem a cyklicznym zbieraniem śmieci?",
                        "odpowiedzi": ["Referencyjne zliczanie usuwa obiekty, gdy liczba ich referencji spadnie do zera, a cykliczne zbieranie wykrywa i usuwa obiekty tworzące cykle referencji", 
                                       "Garbage collector działa tylko na listach i słownikach", 
                                       "Garbage collector usuwa obiekty natychmiast po ich użyciu"],
                        "poprawna": 0
                    },
                    {
                        "pytanie": "Jaka jest różnica między programowaniem synchronicznym a asynchronicznym?",
                        "odpowiedzi": ["Synchroniczne czeka na zakończenie operacji, asynchroniczne pozwala wykonywać inne zadania równolegle", 
                                       "Synchroniczne to programowanie w Pythonie, asynchroniczne w Javie", 
                                       "Synchroniczne oznacza powolne działanie programu, asynchroniczne szybkie"],
                        "poprawna": 0
                    },
                    {
                        "pytanie": "Co oznacza termin „immutability” i jakie ma znaczenie w programowaniu funkcyjnym?",
                        "odpowiedzi": ["Obiekty niezmienne, co ułatwia uniknięcie błędów związanych z modyfikacją danych", 
                                       "Obiekty zawsze zmieniające się podczas działania programu", 
                                       "Obiekty, które nie mogą być użyte w programie"],
                        "poprawna": 0
                    }
                ]
            }
    }