GSMEthesis commited on
Commit
6357d7a
·
verified ·
1 Parent(s): 6f01817

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +64 -46
app.py CHANGED
@@ -675,36 +675,56 @@ h3 {
675
 
676
  # ========== توابع اصلی ==========
677
  def custom_likert_slider(question, key, points=7):
 
678
  options = {
679
  5: ["کاملاً مخالفم", "مخالفم", "خنثی", "موافقم", "کاملاً موافقم"],
680
  7: ["کاملاً مخالفم", "نسبتاً مخالفم", "کمی مخالفم", "خنثی", "کمی موافقم", "نسبتاً موافقم", "کاملاً موافقم"]
681
  }
682
- labels = options.get(points)
683
- default_value = (points + 1) // 2
684
-
685
- st.markdown(f"<div style='font-family: B Nazanin; direction: rtl; font-size: 16px; font-weight: bold;'>{question}</div>", unsafe_allow_html=True)
686
-
687
- st.markdown(
688
- f"""
689
- <div style='display: flex; justify-content: space-between; font-size: 12px; direction: rtl; margin-bottom: -10px;'>
690
- {''.join(f"<span>{label}</span>" for label in labels)}
 
 
691
  </div>
692
- """, unsafe_allow_html=True
693
- )
694
-
695
- # اسلایدر واقعی Streamlit (قابل ذخیره‌سازی)
696
- value = st.slider(
697
- label=" ",
698
- min_value=1,
699
- max_value=points,
700
- value=default_value,
701
- step=1,
702
- key=key
703
- )
704
-
705
- st.markdown(f"<p style='text-align: center; color: #6a0dad;'>پاسخ شما: <strong>{value}</strong></p>", unsafe_allow_html=True)
706
-
707
- return value
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
708
 
709
  def create_ride_map():
710
  """ایجاد نقشه سفر با Folium - نسخه اصلاح شده با مناطق عمومی"""
@@ -1099,7 +1119,8 @@ def attention_check1():
1099
  st.warning("لطفاً یک گزینه را انتخاب کنید")
1100
 
1101
  def random_likert_questions():
1102
- """نمایش سوالات لیکرت با استایل زیبا و مقدار قابل ذخیره‌سازی"""
 
1103
  question_groups = [
1104
  {
1105
  "title": "عدالت توزیعی",
@@ -1139,39 +1160,36 @@ def random_likert_questions():
1139
  }
1140
  ]
1141
 
 
1142
  if 'current_likert_group' not in st.session_state:
1143
  st.session_state.current_likert_group = 0
1144
- st.session_state.answers = st.session_state.get('answers', {})
1145
-
1146
  current_group = question_groups[st.session_state.current_likert_group]
1147
-
 
1148
  st.markdown(f"## {current_group['title']}")
1149
  st.markdown("---")
1150
-
1151
- all_answered = True
1152
  for question in current_group['questions']:
1153
- value = custom_likert_slider(
1154
  question=question["question"],
1155
  key=question["key"],
1156
  points=question["scale"]
1157
  )
1158
- if value:
1159
- st.session_state.answers[question["key"]] = value
1160
- else:
1161
- all_answered = False
1162
-
1163
- button_label = "ادامه به گروه بعدی" if st.session_state.current_likert_group < len(question_groups) - 1 else "اتمام پرسشنامه"
1164
 
1165
  if st.button(button_label):
1166
- if all_answered:
1167
- if st.session_state.current_likert_group < len(question_groups) - 1:
1168
- st.session_state.current_likert_group += 1
1169
- st.rerun()
1170
- else:
1171
- st.session_state.current_page = "explanation_questions"
1172
- st.rerun()
1173
  else:
1174
- st.warning("لطفاً به تمام سوالات این بخش پاسخ دهید.")
 
1175
 
1176
 
1177
  def explanation_questions():
 
675
 
676
  # ========== توابع اصلی ==========
677
  def custom_likert_slider(question, key, points=7):
678
+ # تعریف گزینه‌ها
679
  options = {
680
  5: ["کاملاً مخالفم", "مخالفم", "خنثی", "موافقم", "کاملاً موافقم"],
681
  7: ["کاملاً مخالفم", "نسبتاً مخالفم", "کمی مخالفم", "خنثی", "کمی موافقم", "نسبتاً موافقم", "کاملاً موافقم"]
682
  }
683
+ labels = options.get(points, options[7])
684
+
685
+ # مقدار پیش‌فرض از session_state یا نقطه میانی
686
+ default_value = st.session_state.get(key, (points + 1) // 2)
687
+
688
+ # HTML و JavaScript
689
+ html = f"""
690
+ <div id="container_{key}" style="direction: rtl; font-family: 'B Nazanin'; margin-bottom: 30px;">
691
+ <label style="font-size: 16px; font-weight: bold;">{question}</label>
692
+ <div style="display: flex; justify-content: space-between; font-size: 12px; margin-bottom: 5px;">
693
+ {''.join(f'<span style="flex: 1; text-align: center;">{label}</span>' for label in labels)}
694
  </div>
695
+ <input type="range" id="{key}" min="1" max="{points}" step="1" value="{default_value}"
696
+ style="width: 100%; height: 10px; accent-color: #6a0dad; margin-bottom: 15px;"
697
+ oninput="updateSlider('{key}')">
698
+ <div style="text-align: center; margin-top: 10px;">
699
+ پاسخ انتخاب‌شده: <strong><span id="output_{key}">{default_value}</span></strong>
700
+ <span id="label_{key}" style="color: #6a0dad; margin-right: 5px;">({labels[default_value-1]})</span>
701
+ </div>
702
+ </div>
703
+
704
+ <script>
705
+ function updateSlider(key) {{
706
+ const value = parseInt(document.getElementById(key).value);
707
+ document.getElementById('output_' + key).innerText = value;
708
+ document.getElementById('label_' + key).innerText = '(' + {json.dumps(labels)}[value-1] + ')';
709
+
710
+ // ارسال مقدار به Streamlit
711
+ window.parent.postMessage({{
712
+ type: 'streamlit:setComponentValue',
713
+ key: key,
714
+ value: value
715
+ }}, '*');
716
+ }}
717
+ </script>
718
+ """
719
+
720
+ # نمایش کامپوننت و دریافت مقدار
721
+ selected_value = components.html(html, height=180, key=key)
722
+
723
+ # ذخیره مقدار در session_state
724
+ if selected_value is not None:
725
+ st.session_state[key] = selected_value
726
+
727
+ return selected_value
728
 
729
  def create_ride_map():
730
  """ایجاد نقشه سفر با Folium - نسخه اصلاح شده با مناطق عمومی"""
 
1119
  st.warning("لطفاً یک گزینه را انتخاب کنید")
1120
 
1121
  def random_likert_questions():
1122
+ """نمایش سوالات لیکرت به ترتیب مشخص با اسلایدر سفارشی"""
1123
+ # تعریف گروه‌های سوالات
1124
  question_groups = [
1125
  {
1126
  "title": "عدالت توزیعی",
 
1160
  }
1161
  ]
1162
 
1163
+ # مقداردهی اولیه
1164
  if 'current_likert_group' not in st.session_state:
1165
  st.session_state.current_likert_group = 0
1166
+
1167
+ # دریافت گروه جاری
1168
  current_group = question_groups[st.session_state.current_likert_group]
1169
+
1170
+ # نمایش عنوان گروه
1171
  st.markdown(f"## {current_group['title']}")
1172
  st.markdown("---")
1173
+
1174
+ # نمایش تمام سوالات این گروه در یک صفحه
1175
  for question in current_group['questions']:
1176
+ answer = custom_likert_slider(
1177
  question=question["question"],
1178
  key=question["key"],
1179
  points=question["scale"]
1180
  )
1181
+
1182
+ # دکمه ادامه/اتمام
1183
+ button_label = "ادامه به گروه بعدی" if st.session_state.current_likert_group < len(question_groups)-1 else "اتمام پرسشنامه"
 
 
 
1184
 
1185
  if st.button(button_label):
1186
+ # رفتن به گروه بعدی یا صفحه پایانی
1187
+ if st.session_state.current_likert_group < len(question_groups) - 1:
1188
+ st.session_state.current_likert_group += 1
1189
+ st.rerun()
 
 
 
1190
  else:
1191
+ st.session_state.current_page = "explanation_questions"
1192
+ st.rerun()
1193
 
1194
 
1195
  def explanation_questions():