GSMEthesis commited on
Commit
9294795
·
verified ·
1 Parent(s): bf1f364

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +99 -68
app.py CHANGED
@@ -888,26 +888,22 @@ def save_to_sheet(data):
888
  return False
889
 
890
  def create_likert_question(question, key, scale_type="5point"):
891
- """نمایش سوال لیکرت با اسلایدر نقطه‌ای 7 قسمتی"""
892
-
893
- # تعریف لیبل‌های دو طرف بر اساس نوع مقیاس
894
- if scale_type == "5point":
895
- left_label = "کاملاً مخالفم"
896
- right_label = "کاملاً موافقم"
897
- else: # 7-point scale
898
- left_label = "کاملاً مخالفم"
899
- right_label = "کاملاً موافقم"
900
 
901
- st.markdown(f"<p style='font-size:16px; margin-bottom:10px;'>{question}</p>", unsafe_allow_html=True)
902
 
903
- # ایجاد اسلایدر با 7 نقطه
 
904
  value = st.slider(
905
- label="",
906
  min_value=1,
907
- max_value=7,
908
- value=4, # مقدار پیش‌فرض وسط
909
  step=1,
910
- key=f"slider_{key}" # اضافه کردن پیشوند برای جلوگیری از تداخل کلید
911
  )
912
 
913
  # نمایش متن دو طرف اسلایدر
@@ -917,6 +913,9 @@ def create_likert_question(question, key, scale_type="5point"):
917
  <span>{left_label}</span>
918
  <span>{right_label}</span>
919
  </div>
 
 
 
920
  """,
921
  unsafe_allow_html=True
922
  )
@@ -1098,41 +1097,83 @@ def attention_check1():
1098
  st.warning("لطفاً یک گزینه را انتخاب کنید")
1099
 
1100
  def random_likert_questions():
1101
- """نمایش تصادفی سوالات لیکرت با اسلایدر جدید"""
1102
- if 'all_questions' not in st.session_state:
1103
- # تعریف تمام سوالات
1104
- questions = [
1105
- {"key": "informational_1", "question": "پلتفرم به صورت صادقانه دلایل تعیین قیمت را توضیح داد.", "scale": "5point"},
1106
- {"key": "informational_2", "question": "پلتفرم به طور کامل عوامل مؤثر بر تعیین قیمت را شرح داد.", "scale": "5point"},
1107
- # بقیه سوالات...
1108
- ]
1109
- st.session_state.all_questions = questions
1110
- st.session_state.current_question_index = 0
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1111
 
1112
- # نمایش سوال جاری
1113
- q = st.session_state.all_questions[st.session_state.current_question_index]
1114
 
1115
- if q["scale"] == "attention":
1116
- # سوال توجه
1117
- answer = st.radio(
1118
- q["question"],
1119
- ["1", "13", "15", "17", "دیگر"],
1120
- index=None
1121
- )
1122
- else:
1123
- # سوالات لیکرت
1124
  answer = create_likert_question(q["question"], q["key"], q["scale"])
1125
-
1126
- if st.button("ادامه", key=f"btn_{st.session_state.current_question_index}"):
1127
- if answer:
1128
- st.session_state[q["key"]] = answer
1129
- st.session_state.current_question_index += 1
 
 
 
 
 
 
 
 
 
 
 
 
1130
 
1131
- if st.session_state.current_question_index >= len(st.session_state.all_questions):
1132
- st.session_state.current_page = "explanation_questions"
1133
- st.rerun()
 
 
 
 
1134
  else:
1135
- st.warning("لطفاً به سوال پاسخ دهید")
 
 
1136
 
1137
  def explanation_questions():
1138
  """سوالات درباره توضیحات قیمت"""
@@ -1337,33 +1378,18 @@ def thank_you_page():
1337
  st.balloons()
1338
 
1339
  # ========== مدیریت وضعیت و صفحه‌بندی ==========
1340
- def main():
1341
- # تشخیص دستگاه
1342
- user_agent = st.query_params.get("user_agent", [""])[0]
1343
- st.session_state.is_desktop = "mobile" not in user_agent.lower()
1344
 
1345
- # مقداردهی اولیه تمام متغیرهای مورد نیاز
 
1346
  if 'current_page' not in st.session_state:
1347
  st.session_state.current_page = "welcome"
 
 
 
1348
  st.session_state.scenario_type = random.choice(["control", "input", "counterfactual"])
1349
  st.session_state.price = 200000
1350
- st.session_state.user_contact = None
1351
- st.session_state.demographic_data = None
1352
- st.session_state.price_accepted = 0
1353
- st.session_state.attention_check1 = None
1354
- st.session_state.attention_check2 = None
1355
- st.session_state.all_questions = []
1356
- st.session_state.current_question_index = 0
1357
-
1358
- # مقداردهی اولیه برای تمام سوالات لیکرت
1359
- likert_questions = [
1360
- "informational_1", "informational_2", "informational_3", "informational_4", "informational_5",
1361
- "distributive_1", "distributive_2", "distributive_3",
1362
- "procedural_1", "procedural_2", "procedural_3"
1363
- ]
1364
- for q in likert_questions:
1365
- st.session_state[q] = None
1366
 
 
1367
  pages = {
1368
  "welcome": welcome_page,
1369
  "scenario_explanation": scenario_explanation,
@@ -1377,8 +1403,13 @@ def main():
1377
  }
1378
 
1379
  # نمایش صفحه جاری
1380
- current_page = pages.get(st.session_state.current_page, welcome_page)
1381
- current_page()
 
 
 
 
 
1382
 
1383
  if __name__ == "__main__":
1384
  main()
 
888
  return False
889
 
890
  def create_likert_question(question, key, scale_type="5point"):
891
+ """نمایش سوال لیکرت با اسلایدر نقطه‌ای"""
892
+ # تعریف لیبل‌های دو طرف
893
+ left_label = "کاملاً مخالفم" if scale_type == "7point" else "کاملاً مخالفم"
894
+ right_label = "کاملاً موافقم" if scale_type == "7point" else "کاملاً موافقم"
 
 
 
 
 
895
 
896
+ st.markdown(f"<p style='font-size:16px; margin-bottom:5px;'>{question}</p>", unsafe_allow_html=True)
897
 
898
+ # ایجاد اسلایدر
899
+ max_value = 7 if scale_type == "7point" else 5
900
  value = st.slider(
901
+ "",
902
  min_value=1,
903
+ max_value=max_value,
904
+ value=(max_value+1)//2, # مقدار میانی
905
  step=1,
906
+ key=f"slider_{key}"
907
  )
908
 
909
  # نمایش متن دو طرف اسلایدر
 
913
  <span>{left_label}</span>
914
  <span>{right_label}</span>
915
  </div>
916
+ <p style='text-align:center; color:#6a0dad; font-weight:bold;'>
917
+ پاسخ شما: {value}
918
+ </p>
919
  """,
920
  unsafe_allow_html=True
921
  )
 
1097
  st.warning("لطفاً یک گزینه را انتخاب کنید")
1098
 
1099
  def random_likert_questions():
1100
+ """نمایش سوالات لیکرت به ترتیب مشخص"""
1101
+ # تعریف گروه‌های سوالات
1102
+ question_groups = [
1103
+ {
1104
+ "title": "سوالات عدالت توزیعی",
1105
+ "questions": [
1106
+ {"key": "distributive_1", "question": "قیمتی که به شما ارائه شد، منصفانه است.", "scale": "7point"},
1107
+ {"key": "distributive_2", "question": "قیمتی که به شما ارائه شد، معقول است.", "scale": "7point"},
1108
+ {"key": "distributive_3", "question": "قیمتی که به شما ارائه شد، قابل قبول است.", "scale": "7point"}
1109
+ ],
1110
+ "attention_check": "من با دقت به این سوالات پاسخ می‌دهم."
1111
+ },
1112
+ {
1113
+ "title": "سوالات عدالت رویه‌ای",
1114
+ "questions": [
1115
+ {"key": "procedural_1", "question": "فرآیند و رویه قیمت‌گذاری پلتفرم قابل قبول است.", "scale": "7point"},
1116
+ {"key": "procedural_2", "question": "فرآیند و رویه قیمت‌گذاری پلتفرم منصفانه است.", "scale": "7point"},
1117
+ {"key": "procedural_3", "question": "فرآیند و رویه قیمت‌گذاری پلتفرم معقول است.", "scale": "7point"}
1118
+ ],
1119
+ "attention_check": "من با دقت به این سوالات پاسخ می‌دهم."
1120
+ },
1121
+ {
1122
+ "title": "سوالات اطلاعاتی",
1123
+ "questions": [
1124
+ {"key": "informational_1", "question": "پلتفرم به صورت صادقانه دلایل تعیین قیمت را توضیح داد.", "scale": "5point"},
1125
+ {"key": "informational_2", "question": "پلتفرم به طور کامل عوامل مؤثر بر تعیین قیمت را شرح داد.", "scale": "5point"},
1126
+ {"key": "informational_3", "question": "دلایل ارائه‌شده برای تعیین قیمت منطقی و قابل قبول بود.", "scale": "5point"},
1127
+ {"key": "informational_4", "question": "توضیحات درباره تعیین قیمت بلافاصله و در زمان مناسب نمایش داده شد.", "scale": "5point"},
1128
+ {"key": "informational_5", "question": "توضیحات پلتفرم درباره تعیین قیمت، متناسب با شرایط سفر من بود.", "scale": "5point"}
1129
+ ]
1130
+ }
1131
+ ]
1132
+
1133
+ # مقداردهی اولیه
1134
+ if 'current_group' not in st.session_state:
1135
+ st.session_state.current_group = 0
1136
+ st.session_state.current_question = 0
1137
+ st.session_state.answers = {}
1138
+
1139
+ current_group = question_groups[st.session_state.current_group]
1140
 
1141
+ # نمایش عنوان گروه
1142
+ st.markdown(f"## {current_group['title']}")
1143
 
1144
+ # نمایش سوالات گروه جاری
1145
+ if st.session_state.current_question < len(current_group['questions']):
1146
+ q = current_group['questions'][st.session_state.current_question]
 
 
 
 
 
 
1147
  answer = create_likert_question(q["question"], q["key"], q["scale"])
1148
+
1149
+ if st.button("ادامه", key=f"btn_{q['key']}"):
1150
+ if answer:
1151
+ st.session_state.answers[q["key"]] = answer
1152
+ st.session_state.current_question += 1
1153
+ st.rerun()
1154
+ else:
1155
+ st.warning("لطفاً پاسخ خود را مشخص کنید")
1156
+ else:
1157
+ # بررسی سوال توجه بین گروه‌ها
1158
+ if 'attention_check' in current_group and st.session_state.current_group < len(question_groups) - 1:
1159
+ st.markdown("### سوال توجه")
1160
+ attention = st.radio(
1161
+ current_group['attention_check'],
1162
+ ["کاملاً موافقم", "موافقم", "نظری ندارم", "مخالفم", "کاملاً مخالفم"],
1163
+ index=None
1164
+ )
1165
 
1166
+ if st.button("تأیید و ادامه", key="attention_btn"):
1167
+ if attention:
1168
+ st.session_state.current_group += 1
1169
+ st.session_state.current_question = 0
1170
+ st.rerun()
1171
+ else:
1172
+ st.warning("لطفاً به سوال توجه پاسخ دهید")
1173
  else:
1174
+ # اتمام همه سوالات
1175
+ st.session_state.current_page = "explanation_questions"
1176
+ st.rerun()
1177
 
1178
  def explanation_questions():
1179
  """سوالات درباره توضیحات قیمت"""
 
1378
  st.balloons()
1379
 
1380
  # ========== مدیریت وضعیت و صفحه‌بندی ==========
 
 
 
 
1381
 
1382
+ def main():
1383
+ # مقداردهی اولیه session_state
1384
  if 'current_page' not in st.session_state:
1385
  st.session_state.current_page = "welcome"
1386
+ st.session_state.current_group = 0
1387
+ st.session_state.current_question = 0
1388
+ st.session_state.answers = {}
1389
  st.session_state.scenario_type = random.choice(["control", "input", "counterfactual"])
1390
  st.session_state.price = 200000
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1391
 
1392
+ # تعریف صفحات
1393
  pages = {
1394
  "welcome": welcome_page,
1395
  "scenario_explanation": scenario_explanation,
 
1403
  }
1404
 
1405
  # نمایش صفحه جاری
1406
+ try:
1407
+ current_page = pages.get(st.session_state.current_page, welcome_page)
1408
+ current_page()
1409
+ except Exception as e:
1410
+ st.error(f"خطای سیستمی: {str(e)}")
1411
+ st.session_state.current_page = "welcome"
1412
+ st.rerun()
1413
 
1414
  if __name__ == "__main__":
1415
  main()