GSMEthesis commited on
Commit
4b79bd9
·
verified ·
1 Parent(s): 252ebf7

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +53 -31
app.py CHANGED
@@ -738,33 +738,23 @@ h3 {
738
  """, unsafe_allow_html=True)
739
 
740
  # ========== توابع اصلی ==========
 
741
  def enhanced_likert_scale(question_data):
742
  """لیکرت اسکیل با خط و نقاط - کاملاً واکنش‌گرا"""
743
  question = question_data["question"]
744
  key = question_data["key"]
745
  scale = question_data["scale"]
746
- labels = question_data.get("labels", ["کاملاً مخالفم", "کاملاً موافقم"])
747
-
 
748
  if key not in st.session_state:
749
  st.session_state[key] = None
750
-
751
  # نمایش سوال
752
  st.markdown(f"<div style='text-align:center; font-weight:bold; margin-bottom:15px;'>{question}</div>",
753
  unsafe_allow_html=True)
754
-
755
- # ایجاد سلکت باکس برای انتخاب گزینه‌ها
756
- selected_value = st.selectbox(
757
- "لطفاً یک گزینه را انتخاب کنید:",
758
- options=range(1, scale+1), # گزینه‌ها از 1 تا scale
759
- index=st.session_state.get(key) - 1 if st.session_state.get(key) else 0, # پیش‌فرض انتخاب شده
760
- key=f"select_{key}",
761
- format_func=lambda x: labels[x-1] # برچسب‌ها برای هر گزینه
762
- )
763
-
764
- # ذخیره انتخاب کاربر
765
- st.session_state[key] = selected_value
766
-
767
- # نمایش خط و دکمه‌ها با HTML/CSS
768
  scale_html = f"""
769
  <style>
770
  .likert-line {{
@@ -822,28 +812,60 @@ def enhanced_likert_scale(question_data):
822
  }}
823
  }}
824
  </style>
 
 
 
 
 
 
 
825
  """
826
 
 
 
 
 
 
 
 
 
827
  # نمایش مقدار انتخاب شده
828
  if st.session_state.get(key):
829
- scale_html += f"<div class='likert-value'>پاسخ شما: {labels[st.session_state[key] - 1]}</div>"
830
 
831
  scale_html += "</div>"
832
-
833
- # تزریق HTML/CSS برای خط و نقاط
834
- components.html(scale_html, height=80)
835
-
836
- # دکمه ارسال (پررنگ و فعال)
837
- button_label = "ثبت پاسخ"
838
- if st.session_state.get(key) is not None:
839
- st.button(button_label, use_container_width=True, key=f"submit_{key}", type="primary")
840
- else:
841
- st.button(button_label, use_container_width=True, key=f"submit_{key}", type="secondary")
842
-
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
843
  return st.session_state.get(key)
844
 
845
-
846
-
847
  def create_ride_map():
848
  """ایجاد نقشه سفر با Folium - نسخه اصلاح شده با مناطق عمومی"""
849
  # نقاط تقریبی برای مناطق عمومی جنوب و غرب تهران
 
738
  """, unsafe_allow_html=True)
739
 
740
  # ========== توابع اصلی ==========
741
+
742
  def enhanced_likert_scale(question_data):
743
  """لیکرت اسکیل با خط و نقاط - کاملاً واکنش‌گرا"""
744
  question = question_data["question"]
745
  key = question_data["key"]
746
  scale = question_data["scale"]
747
+ labels = question_data.get("labels", \["کاملاً مخالفم", "کاملاً موافقم"])
748
+
749
+ ```
750
  if key not in st.session_state:
751
  st.session_state[key] = None
752
+
753
  # نمایش سوال
754
  st.markdown(f"<div style='text-align:center; font-weight:bold; margin-bottom:15px;'>{question}</div>",
755
  unsafe_allow_html=True)
756
+
757
+ # ایجاد خط و نقاط با HTML/CSS
 
 
 
 
 
 
 
 
 
 
 
 
758
  scale_html = f"""
759
  <style>
760
  .likert-line {{
 
812
  }}
813
  }}
814
  </style>
815
+
816
+ <div class='likert-container'>
817
+ <div class='likert-labels'>
818
+ <span>{labels[1]}</span>
819
+ <span>{labels[0]}</span>
820
+ </div>
821
+ <div class='likert-line'>
822
  """
823
 
824
+ # اضافه کردن نقاط
825
+ for i in range(scale):
826
+ value = scale - i
827
+ is_selected = st.session_state.get(key) == value
828
+ scale_html += f"<div class='likert-dot {'selected' if is_selected else ''}' onclick='setLikertValue({value})'></div>"
829
+
830
+ scale_html += "</div>"
831
+
832
  # نمایش مقدار انتخاب شده
833
  if st.session_state.get(key):
834
+ scale_html += f"<div class='likert-value'>پاسخ شما: {st.session_state[key]}</div>"
835
 
836
  scale_html += "</div>"
837
+
838
+ # تزریق JavaScript برای مدیریت کلیک
839
+ components.html(scale_html + """
840
+ <script>
841
+ function setLikertValue(value) {
842
+ const streamlitDoc = window.parent.document;
843
+ const buttons = streamlitDoc.querySelectorAll('button[data-testid="stButton"]'); // جستجوی دکمه‌ها در DOM
844
+ buttons.forEach(btn => {
845
+ if (btn.textContent.trim() === String(value)) {
846
+ btn.click(); // کلیک روی دکمه مورد نظر برای انتخاب مقدار
847
+ }
848
+ });
849
+ }
850
+ </script>
851
+ """, height=80)
852
+
853
+ # دکمه‌های واقعی (مخفی و کوچک)
854
+ btn_cols = st.columns(scale)
855
+ for i in range(scale):
856
+ with btn_cols[i]:
857
+ value = scale - i
858
+ if st.button(
859
+ str(value),
860
+ key=f"{key}_btn_{value}",
861
+ type="primary" if st.session_state.get(key) == value else "secondary",
862
+ help="این دکمه‌ها مخفی هستند" # پیام راهنما
863
+ ):
864
+ st.session_state[key] = value
865
+ st.rerun()
866
+
867
  return st.session_state.get(key)
868
 
 
 
869
  def create_ride_map():
870
  """ایجاد نقشه سفر با Folium - نسخه اصلاح شده با مناطق عمومی"""
871
  # نقاط تقریبی برای مناطق عمومی جنوب و غرب تهران