GSMEthesis commited on
Commit
3450c90
·
verified ·
1 Parent(s): a533144

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +45 -27
app.py CHANGED
@@ -739,37 +739,53 @@ h3 {
739
 
740
 
741
 
742
- def likert_radio(question_data):
743
- """نمایش سوال لیکرت با 7 گزینه انتخابی"""
 
744
  question = question_data["question"]
745
  key = question_data["key"]
746
- points = question_data["scale"] # تعداد نقاط (7 یا 5)
747
  labels = question_data.get("labels", ["کمترین", "بیشترین"]) # لیبل‌های پیش‌فرض
748
 
749
- # مقدار پیش‌فرضسط طیف)
750
- default_value = st.session_state.get(key, (points + 1) // 2)
751
-
752
- # نمایش سوال
753
- st.markdown(f"<p style='font-size:16px; margin-bottom:5px;'>{question}</p>", unsafe_allow_html=True)
754
-
755
- # استفاده از st.radio برای نمایش گزینه‌ها
756
- options = [str(i) for i in range(1, points+1)] # 7 گزینه از 1 تا 7
757
- value = st.radio(
758
- "",
759
- options=options,
760
- index=default_value - 1, # تنظیم مقدار پیش‌فرض
761
- key=f"radio_{key}",
762
- format_func=lambda x: f"گزینه {x}" # نمایش گزینه‌ها به صورت "گزینه 1", "گزینه 2" و غیره
763
- )
764
-
765
- # نمایش پاسخ انتخاب‌شده
766
- st.markdown(f"<p style='text-align:center; color:#6a0dad; font-weight:bold;'>پاسخ شما: {value}</p>", unsafe_allow_html=True)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
767
 
768
- # ذخیره مقدار در session_state
769
- st.session_state[key] = value
770
 
771
- return value
772
-
773
 
774
  def save_likert_answers():
775
  """ذخیره مقادیر نهایی اسلایدرها در session_state پس از کلیک روی دکمه 'ادامه'"""
@@ -777,6 +793,7 @@ def save_likert_answers():
777
  if "distributive" in key or "procedural" in key or "informational" in key: # انتخاب کلیدهای مربوط به سوالات
778
  st.session_state[key] = st.session_state.get(key, None)
779
 
 
780
  def create_ride_map():
781
  """ایجاد نقشه سفر با Folium - نسخه اصلاح شده با مناطق عمومی"""
782
  # نقاط تقریبی برای مناطق عمومی جنوب و غرب تهران
@@ -1268,7 +1285,7 @@ def random_likert_questions():
1268
 
1269
 
1270
  def random_likert_questions():
1271
- """نمایش سوالات لیکرت به ترتیب مشخص با 7 گزینه انتخابی"""
1272
  # تعریف گروه‌های سوالات با لیبل‌های سفارشی
1273
  question_groups = [
1274
  {
@@ -1330,7 +1347,7 @@ def random_likert_questions():
1330
  # نمایش تمام سوالات این گروه در یک صفحه
1331
  for question in current_group['questions']:
1332
  # دریافت مقدار اسلایدر و ذخیره آن
1333
- answer = likert_radio(question)
1334
  st.session_state[question["key"]] = answer # ذخیره مقدار اسلایدر در session_state
1335
 
1336
  # دکمه ادام��/اتمام
@@ -1347,6 +1364,7 @@ def random_likert_questions():
1347
  else:
1348
  st.session_state.current_page = "explanation_questions"
1349
  st.rerun()
 
1350
  def explanation_questions():
1351
  """نمایش سوالات تکمیلی به صورت مرحله‌ای با دکمه ادامه"""
1352
  st.markdown("### 📋 سوالات تکمیلی")
 
739
 
740
 
741
 
742
+
743
+ def custom_likert_slider(question_data):
744
+ """نمایش سوال لیکرت با اسلایدر 7 نقطه‌ای افقی و لیبل‌های سفارشی"""
745
  question = question_data["question"]
746
  key = question_data["key"]
747
+ points = question_data["scale"] # تعداد نقاط (7 نقطه)
748
  labels = question_data.get("labels", ["کمترین", "بیشترین"]) # لیبل‌های پیش‌فرض
749
 
750
+ # دریافت مقدار آخرین انتخاب از session_state (اگر موجود باشد)
751
+ default_value = st.session_state.get(key, (points + 1) // 2) # اگر هیچ مقداری ذخیره نشده بود، مقدار پیش‌فرض وسط طیف
752
+
753
+ # HTML و JavaScript برای ایجاد اسلایدر
754
+ html = f"""
755
+ <div id="container_{key}" style="direction: ltr; font-family: 'B Nazanin'; margin-bottom: 30px;">
756
+ <label style="font-size: 16px; font-weight: bold; display: block; text-align: right;">{question}</label>
757
+ <div style="display: flex; justify-content: space-between; font-size: 12px; margin-bottom: 5px;">
758
+ <span>{labels[0]}</span>
759
+ <span>{labels[1]}</span>
760
+ </div>
761
+ <input type="range" id="{key}" min="1" max="{points}" step="1" value="{default_value}"
762
+ style="width: 100%; height: 10px; accent-color: #6a0dad; margin-bottom: 15px;"
763
+ oninput="updateSlider('{key}')">
764
+ <div style="text-align: center; margin-top: 10px; direction: rtl;">
765
+ پاسخ انتخاب‌شده: <strong><span id="output_{key}">{default_value}</span></strong>
766
+ </div>
767
+ </div>
768
+
769
+ <script>
770
+ function updateSlider(key) {{
771
+ const value = parseInt(document.getElementById(key).value);
772
+ document.getElementById('output_' + key).innerText = value;
773
+
774
+ // ارسال مقدار به Streamlit
775
+ window.parent.postMessage({{
776
+ type: 'streamlit:setComponentValue',
777
+ key: key,
778
+ value: value
779
+ }}, '*');
780
+ }}
781
+ </script>
782
+ """
783
 
784
+ # نمایش کامپوننت HTML
785
+ components.html(html, height=150)
786
 
787
+ # در اینجا باید مقدار نهایی انتخاب‌شده را از session_state ذخیره کنیم
788
+ return st.session_state.get(key, default_value)
789
 
790
  def save_likert_answers():
791
  """ذخیره مقادیر نهایی اسلایدرها در session_state پس از کلیک روی دکمه 'ادامه'"""
 
793
  if "distributive" in key or "procedural" in key or "informational" in key: # انتخاب کلیدهای مربوط به سوالات
794
  st.session_state[key] = st.session_state.get(key, None)
795
 
796
+
797
  def create_ride_map():
798
  """ایجاد نقشه سفر با Folium - نسخه اصلاح شده با مناطق عمومی"""
799
  # نقاط تقریبی برای مناطق عمومی جنوب و غرب تهران
 
1285
 
1286
 
1287
  def random_likert_questions():
1288
+ """نمایش سوالات لیکرت به ترتیب مشخص با اسلایدر سفارشی"""
1289
  # تعریف گروه‌های سوالات با لیبل‌های سفارشی
1290
  question_groups = [
1291
  {
 
1347
  # نمایش تمام سوالات این گروه در یک صفحه
1348
  for question in current_group['questions']:
1349
  # دریافت مقدار اسلایدر و ذخیره آن
1350
+ answer = custom_likert_slider(question)
1351
  st.session_state[question["key"]] = answer # ذخیره مقدار اسلایدر در session_state
1352
 
1353
  # دکمه ادام��/اتمام
 
1364
  else:
1365
  st.session_state.current_page = "explanation_questions"
1366
  st.rerun()
1367
+
1368
  def explanation_questions():
1369
  """نمایش سوالات تکمیلی به صورت مرحله‌ای با دکمه ادامه"""
1370
  st.markdown("### 📋 سوالات تکمیلی")