GSMEthesis commited on
Commit
ff63995
·
verified ·
1 Parent(s): 6fdf94c

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +27 -27
app.py CHANGED
@@ -739,63 +739,63 @@ h3 {
739
 
740
  # ========== توابع اصلی ==========
741
  def custom_likert_slider(question_data):
742
- """Custom Likert-style question with circles and labels."""
743
  question = question_data["question"]
744
  key = question_data["key"]
745
  scale = question_data["scale"]
746
- labels = question_data.get("labels", ["کمترین", "بیشترین"]) # Default labels
747
 
748
- # مقدار پیش‌فرض فقط برای بار اول (اگر هیچ مقداری در session_state وجود نداشته باشد)
749
- if key not in st.session_state:
750
- st.session_state[key] = (scale + 1) // 2 # مقدار میانی به عنوان پیش‌فرض
751
 
752
- # HTML و JavaScript برای دکمه‌های رادیویی
753
  html = f"""
754
  <div style="direction: ltr; font-family: 'B Nazanin'; margin-bottom: 30px;">
755
  <label style="font-size: 16px; font-weight: bold; display: block; text-align: center;">{question}</label>
756
  <div style="display: flex; justify-content: center; align-items: center; gap: 10px; margin: 10px 0;">
757
  <span>{labels[0]}</span>
758
  <div style="display: flex; gap: 10px;">
759
- <input type="radio" id="radio_{key}_1" name="{key}" value="1" style="width: 30px; height: 30px;" {'checked' if st.session_state[key] == 1 else ''} onclick="updateSlider(1, '{key}')">
760
- <input type="radio" id="radio_{key}_2" name="{key}" value="2" style="width: 30px; height: 30px;" {'checked' if st.session_state[key] == 2 else ''} onclick="updateSlider(2, '{key}')">
761
- <input type="radio" id="radio_{key}_3" name="{key}" value="3" style="width: 30px; height: 30px;" {'checked' if st.session_state[key] == 3 else ''} onclick="updateSlider(3, '{key}')">
762
- <input type="radio" id="radio_{key}_4" name="{key}" value="4" style="width: 30px; height: 30px;" {'checked' if st.session_state[key] == 4 else ''} onclick="updateSlider(4, '{key}')">
763
- <input type="radio" id="radio_{key}_5" name="{key}" value="5" style="width: 30px; height: 30px;" {'checked' if st.session_state[key] == 5 else ''} onclick="updateSlider(5, '{key}')">
 
764
  </div>
765
  <span>{labels[1]}</span>
766
  </div>
 
 
 
767
  </div>
768
 
769
  <script>
770
  function updateSlider(value, key) {{
 
 
 
771
  // ارسال مقدار به Streamlit
772
  window.parent.postMessage({{
773
  type: 'streamlit:setComponentValue',
774
  key: key,
775
- value: parseInt(value) // تبدیل به عدد صحیح
 
 
 
 
 
 
 
776
  }}, '*');
777
  }}
778
-
779
- // دریافت پیام از Streamlit برای به‌روزرسانی session_state
780
- window.addEventListener('message', function(event) {{
781
- if (event.data.type === 'streamlit:render') {{
782
- // به‌روزرسانی دکمه‌های رادیویی بر اساس مقدار session_state
783
- let value = {st.session_state[key]}; // مقدار از Python تزریق می‌شود
784
- document.querySelector(`#radio_{key}_${value}`).checked = true;
785
- }}
786
- }});
787
  </script>
788
  """
789
 
790
  # رندر HTML و JavaScript
791
  components.html(html, height=200)
792
 
793
- # مدیریت پیام‌های دریافتی از JavaScript
794
- if f"{key}_component" in st.session_state:
795
- st.session_state[key] = st.session_state[f"{key}_component"]
796
-
797
- # بازگرداندن مقدار ذخیره‌شده در session_state
798
- return st.session_state[key]
799
 
800
  def create_ride_map():
801
  """ایجاد نقشه سفر با Folium - نسخه اصلاح شده با مناطق عمومی"""
 
739
 
740
  # ========== توابع اصلی ==========
741
  def custom_likert_slider(question_data):
742
+ """Custom Likert-style question with circles and labels that returns the actual selected value."""
743
  question = question_data["question"]
744
  key = question_data["key"]
745
  scale = question_data["scale"]
746
+ labels = question_data.get("labels", ["کمترین", "بیشترین"])
747
 
748
+ # مقدار پیش‌فرض از session_state یا وسط مقیاس
749
+ default_value = st.session_state.get(key, (scale + 1) // 2)
 
750
 
751
+ # HTML و JavaScript برای اسلایدر سفارشی
752
  html = f"""
753
  <div style="direction: ltr; font-family: 'B Nazanin'; margin-bottom: 30px;">
754
  <label style="font-size: 16px; font-weight: bold; display: block; text-align: center;">{question}</label>
755
  <div style="display: flex; justify-content: center; align-items: center; gap: 10px; margin: 10px 0;">
756
  <span>{labels[0]}</span>
757
  <div style="display: flex; gap: 10px;">
758
+ {"".join([
759
+ f'<input type="radio" id="radio_{key}_{i}" name="{key}" value="{i}" style="width: 30px; height: 30px;" '
760
+ f'{"checked" if st.session_state.get(f"radio_{key}", default_value) == i else ""} '
761
+ f'onclick="updateSlider({i}, \'{key}\')">'
762
+ for i in range(1, scale + 1)
763
+ ])}
764
  </div>
765
  <span>{labels[1]}</span>
766
  </div>
767
+ <p id="selected_value_{key}" style='text-align:center; color:#6a0dad; font-weight:bold;'>
768
+ پاسخ شما: {st.session_state.get(f"radio_{key}", default_value)}
769
+ </p>
770
  </div>
771
 
772
  <script>
773
  function updateSlider(value, key) {{
774
+ // به روزرسانی نمایش مقدار انتخاب شده
775
+ document.getElementById("selected_value_" + key).innerHTML = "پاسخ شما: " + value;
776
+
777
  // ارسال مقدار به Streamlit
778
  window.parent.postMessage({{
779
  type: 'streamlit:setComponentValue',
780
  key: key,
781
+ value: value
782
+ }}, '*');
783
+
784
+ // ذخیره مقدار در session
785
+ window.parent.postMessage({{
786
+ type: 'streamlit:setSessionState',
787
+ key: "radio_" + key,
788
+ value: value
789
  }}, '*');
790
  }}
 
 
 
 
 
 
 
 
 
791
  </script>
792
  """
793
 
794
  # رندر HTML و JavaScript
795
  components.html(html, height=200)
796
 
797
+ # بازگرداندن مقدار انتخاب شده کاربر (یا پیش‌فرض اگر هنوز انتخابی نکرده)
798
+ return st.session_state.get(f"radio_{key}", default_value)
 
 
 
 
799
 
800
  def create_ride_map():
801
  """ایجاد نقشه سفر با Folium - نسخه اصلاح شده با مناطق عمومی"""