GSMEthesis commited on
Commit
db756d4
·
verified ·
1 Parent(s): 0a638b7

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +96 -57
app.py CHANGED
@@ -674,36 +674,55 @@ h3 {
674
  """, unsafe_allow_html=True)
675
 
676
  # ========== توابع اصلی ==========
677
- def custom_likert_slider(question, key, points=7, left_label="کم", right_label="زیاد"):
678
- """
679
- اسلایدر لیکرت سفارشی با فقط لیبل چپ و راست
680
- """
681
-
682
- # مقدار پیش‌فرض
683
- default_value = st.session_state.get(key, (points + 1) // 2)
684
-
685
- # نمایش سوال
686
- st.markdown(f"<p style='font-size:16px; font-weight:bold; margin-bottom:8px;'>{question}</p>", unsafe_allow_html=True)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
687
 
688
- # اسلایدر
689
- value = st.slider(
690
- label="",
691
- min_value=1,
692
- max_value=points,
693
- value=default_value,
694
- step=1,
695
- key=key
696
- )
 
 
 
 
 
 
697
 
698
- # فقط لیبل چپ و راست
699
- st.markdown(f"""
700
- <div style='display: flex; justify-content: space-between; font-size: 13px; margin-top: -10px;'>
701
- <span>{left_label}</span>
702
- <span>{right_label}</span>
703
- </div>
704
- """, unsafe_allow_html=True)
705
 
706
- return value
 
707
 
708
  def create_ride_map():
709
  """ایجاد نقشه سفر با Folium - نسخه اصلاح شده با مناطق عمومی"""
@@ -1097,52 +1116,74 @@ def attention_check1():
1097
  st.rerun()
1098
  else:
1099
  st.warning("لطفاً یک گزینه را انتخاب کنید")
1100
-
1101
  def random_likert_questions():
1102
- """نمایش سوالات لیکرت به ترتیب گروهی با اسلایدرهای سفارشی"""
1103
-
1104
- def random_likert_questions():
1105
- """نمایش سوالات لیکرت به صورت مرحله‌ای"""
1106
  question_groups = [
1107
  {
1108
  "title": "عدالت توزیعی",
1109
- "left_label": "کاملاً مخالفم",
1110
- "right_label": "کاملاً موافقم",
 
 
 
 
 
 
 
 
1111
  "questions": [
1112
- {"key": "distributive_1", "question": "قیمت منصفانه است.", "scale": 7},
1113
- {"key": "distributive_2", "question": "قیم�� معقول است.", "scale": 7},
1114
  ]
1115
  },
1116
  {
1117
- "title": "شدت احساس",
1118
- "left_label": "خیلی کم",
1119
- "right_label": "خیلی زیاد",
1120
  "questions": [
1121
- {"key": "emotion_1", "question": "احساس رضایت داشتید؟", "scale": 7}
 
 
 
 
 
 
 
 
 
 
 
 
 
1122
  ]
1123
  }
1124
  ]
1125
 
 
1126
  if 'current_likert_group' not in st.session_state:
1127
  st.session_state.current_likert_group = 0
1128
- if 'answers' not in st.session_state:
1129
- st.session_state.answers = {}
1130
-
1131
  current_group = question_groups[st.session_state.current_likert_group]
1132
-
1133
- st.markdown(f"### {current_group['title']}")
1134
-
1135
- for q in current_group['questions']:
1136
- val = custom_likert_slider(
1137
- question=q["question"],
1138
- key=q["key"],
1139
- points=q["scale"],
1140
- left_label=current_group["left_label"],
1141
- right_label=current_group["right_label"]
 
1142
  )
1143
- st.session_state.answers[q["key"]] = val
1144
 
1145
- if st.button("ادامه"):
 
 
 
 
 
1146
  if st.session_state.current_likert_group < len(question_groups) - 1:
1147
  st.session_state.current_likert_group += 1
1148
  st.rerun()
@@ -1150,8 +1191,6 @@ def random_likert_questions():
1150
  st.session_state.current_page = "explanation_questions"
1151
  st.rerun()
1152
 
1153
-
1154
-
1155
  def explanation_questions():
1156
  """نمایش سوالات تکمیلی به صورت مرحله‌ای با دکمه ادامه"""
1157
  st.markdown("### 📋 سوالات تکمیلی")
 
674
  """, unsafe_allow_html=True)
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
+ # بررسی و تعیین مقدار پیش‌فرض
686
+ raw_value = st.session_state.get(key)
687
+ default_value = raw_value if isinstance(raw_value, int) else (points + 1) // 2
688
+
689
+ # HTML و JavaScript
690
+ html = f"""
691
+ <div id="container_{key}" style="direction: rtl; font-family: 'B Nazanin'; margin-bottom: 30px;">
692
+ <label style="font-size: 16px; font-weight: bold;">{question}</label>
693
+ <div style="display: flex; justify-content: space-between; font-size: 12px; margin-bottom: 5px;">
694
+ {''.join(f'<span style="flex: 1; text-align: center;">{label}</span>' for label in labels)}
695
+ </div>
696
+ <input type="range" id="{key}" min="1" max="{points}" step="1" value="{default_value}"
697
+ style="width: 100%; height: 10px; accent-color: #6a0dad; margin-bottom: 15px;"
698
+ oninput="updateSlider('{key}')">
699
+ <div style="text-align: center; margin-top: 10px;">
700
+ پاسخ انتخاب‌شده: <strong><span id="output_{key}">{default_value}</span></strong>
701
+ <span id="label_{key}" style="color: #6a0dad; margin-right: 5px;">({labels[default_value-1]})</span>
702
+ </div>
703
+ </div>
704
 
705
+ <script>
706
+ function updateSlider(key) {{
707
+ const value = parseInt(document.getElementById(key).value);
708
+ document.getElementById('output_' + key).innerText = value;
709
+ document.getElementById('label_' + key).innerText = '(' + {json.dumps(labels)}[value-1] + ')';
710
+
711
+ // ارسال مقدار به Streamlit
712
+ window.parent.postMessage({{
713
+ type: 'streamlit:setComponentValue',
714
+ key: key,
715
+ value: value
716
+ }}, '*');
717
+ }}
718
+ </script>
719
+ """
720
 
721
+ # نمایش کامپوننت
722
+ components.html(html, height=180)
 
 
 
 
 
723
 
724
+ # مقدار نهایی (از session_state)
725
+ return st.session_state.get(key, default_value)
726
 
727
  def create_ride_map():
728
  """ایجاد نقشه سفر با Folium - نسخه اصلاح شده با مناطق عمومی"""
 
1116
  st.rerun()
1117
  else:
1118
  st.warning("لطفاً یک گزینه را انتخاب کنید")
 
1119
  def random_likert_questions():
1120
+ """نمایش سوالات لیکرت به ترتیب مشخص با اسلایدر سفارشی"""
1121
+ # تعریف گروه‌های سوالات
 
 
1122
  question_groups = [
1123
  {
1124
  "title": "عدالت توزیعی",
1125
+ "key": "distributive",
1126
+ "questions": [
1127
+ {"key": "distributive_1", "question": "قیمتی که به شما ارائه شد، منصفانه است.", "scale": 7},
1128
+ {"key": "distributive_2", "question": "قیمتی که به شما ارائه شد، معقول است.", "scale": 7},
1129
+ {"key": "distributive_3", "question": "قیمتی که به شما ارائه شد، قابل قبول است.", "scale": 7}
1130
+ ]
1131
+ },
1132
+ {
1133
+ "title": "سوال توجه",
1134
+ "key": "attention_check",
1135
  "questions": [
1136
+ {"key": "attention_check2", "question": "لطفاً برای اطمینان از دقت پاسخ‌هایتان، گزینه 'کاملاً موافقم' را انتخاب کنید.", "scale": 7}
 
1137
  ]
1138
  },
1139
  {
1140
+ "title": "عدالت رویه‌ای",
1141
+ "key": "procedural",
 
1142
  "questions": [
1143
+ {"key": "procedural_1", "question": "فرآیند و رویه قیمت‌گذاری پلتفرم قابل قبول است.", "scale": 7},
1144
+ {"key": "procedural_2", "question": "فرآیند و رویه قیمت‌گذاری پلتفرم منصفانه است.", "scale": 7},
1145
+ {"key": "procedural_3", "question": "فرآیند و رویه قیمت‌گذاری پلتفرم معقول است.", "scale": 7}
1146
+ ]
1147
+ },
1148
+ {
1149
+ "title": "عدالت اطلاعاتی",
1150
+ "key": "informational",
1151
+ "questions": [
1152
+ {"key": "informational_1", "question": "پلتفرم به صورت صادقانه دلایل تعیین قیمت را توضیح داد.", "scale": 5},
1153
+ {"key": "informational_2", "question": "پلتفرم به طور کامل عوامل مؤثر بر تعیین قیمت را شرح داد.", "scale": 5},
1154
+ {"key": "informational_3", "question": "دلایل ارائه‌شده برای تعیین قیمت منطقی و قابل قبول بود.", "scale": 5},
1155
+ {"key": "informational_4", "question": "توضیحات درباره تعیین قیمت بلافاصله و در زمان مناسب نمایش داده شد.", "scale": 5},
1156
+ {"key": "informational_5", "question": "توضیحات پلتفرم درباره تعیین قیمت، متناسب با شرایط سفر من بود.", "scale": 5}
1157
  ]
1158
  }
1159
  ]
1160
 
1161
+ # مقداردهی اولیه
1162
  if 'current_likert_group' not in st.session_state:
1163
  st.session_state.current_likert_group = 0
1164
+
1165
+ # دریافت گروه جاری
 
1166
  current_group = question_groups[st.session_state.current_likert_group]
1167
+
1168
+ # نمایش عنوان گروه
1169
+ st.markdown(f"## {current_group['title']}")
1170
+ st.markdown("---")
1171
+
1172
+ # نمایش تمام سوالات این گروه در یک صفحه
1173
+ for question in current_group['questions']:
1174
+ answer = custom_likert_slider(
1175
+ question=question["question"],
1176
+ key=question["key"],
1177
+ points=question["scale"]
1178
  )
1179
+ st.session_state.answers[question["key"]] = answer
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()
 
1191
  st.session_state.current_page = "explanation_questions"
1192
  st.rerun()
1193
 
 
 
1194
  def explanation_questions():
1195
  """نمایش سوالات تکمیلی به صورت مرحله‌ای با دکمه ادامه"""
1196
  st.markdown("### 📋 سوالات تکمیلی")