import streamlit as st
import json
import os
# • wyświetlać odpowiednie pola do wprowadzania pytań / odpowiedzi / punktacji (to wersja minimum) z przyciskiem do dodania takiego zestawu do istniejącego kwestionariusza
# • wyświetlać zawartość kwestionariusza (może to być po prostu wyświetlenie słownika z pytaniami
# / odp)
# • wczytywać pliki z kwestionariuszem w formacie JSON
# • zapisywać (z możliwością pobrania) kwestionariusz jako plik JSON z dodanymi nowymi pytaniami
folder_path = "data"
os.makedirs(folder_path, exist_ok=True)
file_name = 'quiz.json'
path_to_save_quiz = os.path.join(folder_path, file_name)
# def save_to_file():
if os.path.exists(path_to_save_quiz) and os.path.getsize(path_to_save_quiz) > 0:
try:
with open(path_to_save_quiz, "r", encoding="utf-8") as plik_json:
quiz_data = json.load(plik_json)
except json.JSONDecodeError:
st.error("Plik quiz.json jest uszkodzony — został nadpisany pustym kwestionariuszem.")
quiz_data = {}
else:
quiz_data = {}
with open(path_to_save_quiz, "w", encoding="utf-8") as plik_json:
json.dump(quiz_data, plik_json, ensure_ascii=False, indent=2)
if st.session_state.get("clear_form", False):
st.session_state["question_input"] = ""
st.session_state["answer1_input"] = ""
st.session_state["answer2_input"] = ""
st.session_state["answer3_input"] = ""
st.session_state["correct_answer"] = None
st.session_state["clear_form"] = False
# st.rerun()
with st.container():
st.markdown("# Twój arkusz do tworzenia quiz-ów")
st.write("### Wypełnij formularz lub załaduj kwestionariusz z pliku w formacie JSON.")
uploaded_file = st.file_uploader("Wybierz plik JSON", type="json")
if uploaded_file is not None:
file_data = json.load(uploaded_file)
st.json(file_data)
col1, col2 = st.columns(2, gap="large")
with col1:
with st.form("quiz_form"):
st.subheader("Dodaj nowe pytanie")
question_val = st.text_input("Wprowadź pytanie", placeholder="Jakie miasto jest stolicą Francji?", key="question_input")
answer_first_val = st.text_input("Wprowadź pierwszą odpowiedź", placeholder="Barcelona", key="answer1_input")
answer_second_val = st.text_input("Wprowadź drugą odpowiedź", placeholder="Paryż", key="answer2_input")
answer_third_val = st.text_input("Wprowadź trzecią odpowiedź", placeholder="Warszawa", key="answer3_input")
choice_correct_answer = st.radio(
"Zaznacz prawidłową odpowiedź:",
# [answer_first_val, answer_second_val, answer_third_val],
["1", "2", "3"],
index=None,
key="correct_answer"
)
# form_ready = all([
# st.session_state.get("question_input", "").strip(),
# st.session_state.get("answer1_input", "").strip(),
# st.session_state.get("answer2_input", "").strip(),
# st.session_state.get("answer3_input", "").strip(),
# st.session_state.get("correct_answer", None) is not None,
# ])
submitted = st.form_submit_button("Dodaj i zapsz plik")
# submitted = st.form_submit_button("Dodaj i zapsz plik", disabled=not form_ready)
if submitted:
st.write("Pytanie: ", question_val, "odp1: ", answer_first_val, "odp2: ", answer_second_val, "odp3: ", answer_third_val)
st.write("Prawidłowa odpowiedź to: ", choice_correct_answer)
errors = []
if not question_val.strip():
errors.append("Pole 'Pytanie' jest obowiązkowe")
if (not answer_first_val.strip()) or (not answer_second_val.strip()) or (not answer_third_val.strip()):
errors.append("Wszystkie pola odpowiedzi musza byc uzupełnione")
if choice_correct_answer is None:
errors.append("Musisz zaznaczyć prawidłową odpowiedź")
if errors:
for error in errors:
st.error(error)
# st.form_submit_button JAK ZROBIC ZEBY BYŁ DISABLED???????????????????????
else:
odpowiedzi = []
answers = [answer_first_val, answer_second_val, answer_third_val]
letters = ["a", "b", "c"]
for i, txt in enumerate(answers, start=1):
punkt = 1 if str(i) == choice_correct_answer else -0.5
odpowiedzi.append((f"{letters[i-1]}) {txt}", punkt))
quiz_data[question_val] = odpowiedzi
with open(path_to_save_quiz, "w", encoding="utf-8") as plik_json:
json.dump(quiz_data, plik_json, ensure_ascii=False, indent=2)
st.success("Pytanie dodane do kwestionariusza!")
st.session_state["clear_form"] = True
st.rerun()
with col2:
st.write("### Aktualny kwestionariusz:")
st.write("Pobierz plik w formacie JSON:")
# zamienia słownik z pytaniami na string JSON, który pobiera użytkownik.
json_data = json.dumps(quiz_data, ensure_ascii=False, indent=2)
st.download_button(
label="Pobierz",
data=json_data,
file_name="quiz.json",
mime="application/json",
icon=":material/download:",
)
if quiz_data:
for i, (pytanie, odpowiedzi) in enumerate(quiz_data.items(), start=1):
st.markdown(f"**{i}. {pytanie}**")
for odp, pkt in odpowiedzi:
if pkt == 1:
st.write(f"{odp} (poprawna, +1 pkt)")
else:
st.write(f"{odp} (błędna, -0.5 pkt)")
st.markdown("------")
else:
st.write("Brak pytań w kwestionariuszu. Dodaj pierwsze pytanie powyżej.")