GSMEthesis commited on
Commit
080f323
·
verified ·
1 Parent(s): ed52941

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +55 -124
app.py CHANGED
@@ -738,8 +738,8 @@ h3 {
738
  """, unsafe_allow_html=True)
739
 
740
  # ========== توابع اصلی ==========
741
- def custom_likert_slider(question_data):
742
- """Custom Likert-style question that correctly captures user selection"""
743
  question = question_data["question"]
744
  key = question_data["key"]
745
  scale = question_data["scale"]
@@ -748,56 +748,50 @@ def custom_likert_slider(question_data):
748
  # مقدار پیش‌فرض از session_state یا وسط مقیاس
749
  default_value = st.session_state.get(key, (scale + 1) // 2)
750
 
751
- # مقدار انتخاب شده کاربر (اگر وجود دارد)
752
- selected_value = st.session_state.get(f"selected_{key}", default_value)
753
-
754
- # HTML و JavaScript برای کامپوننت سفارشی
755
- html = f"""
756
- <div style="direction: ltr; font-family: 'B Nazanin'; margin-bottom: 30px;">
757
- <label style="font-size: 16px; font-weight: bold; display: block; text-align: center;">{question}</label>
758
- <div style="display: flex; justify-content: center; align-items: center; gap: 10px; margin: 10px 0;">
759
- <span>{labels[0]}</span>
760
- <div style="display: flex; gap: 10px;">
761
- {"".join([
762
- f'<input type="radio" id="radio_{key}_{i}" name="{key}" value="{i}" style="width: 30px; height: 30px;" '
763
- f'{"checked" if selected_value == i else ""} '
764
- f'onclick="updateSelection({i}, \'{key}\')">'
765
- for i in range(1, scale + 1)
766
- ])}
767
- </div>
768
- <span>{labels[1]}</span>
769
- </div>
770
- <p id="display_{key}" style='text-align:center; color:#6a0dad; font-weight:bold;'>
771
- پاسخ شما: {selected_value}
772
- </p>
773
  </div>
774
-
775
- <script>
776
- function updateSelection(value, key) {{
777
- // نمایش مقدار انتخاب شده
778
- document.getElementById("display_" + key).innerHTML = "پاسخ شما: " + value;
779
-
780
- // ارسال مقدار به Streamlit
781
- window.parent.postMessage({{
782
- type: 'streamlit:setComponentValue',
783
- key: key,
784
- value: value
785
- }}, '*');
786
-
787
- // ذخیره در session
788
- window.parent.postMessage({{
789
- type: 'streamlit:setSessionState',
790
- key: "selected_" + key,
791
- value: value
792
- }}, '*');
793
- }}
794
- </script>
795
- """
796
 
797
- components.html(html, height=200)
 
 
 
 
 
798
 
799
- # بازگرداندن مقدار انتخاب شده کاربر
800
- return selected_value
801
 
802
  def create_ride_map():
803
  """ایجاد نقشه سفر با Folium - نسخه اصلاح شده با مناطق عمومی"""
@@ -1208,105 +1202,42 @@ def attention_check1():
1208
  st.warning("لطفاً یک گزینه را انتخاب کنید")
1209
 
1210
  def random_likert_questions():
1211
- """نمایش سوالات لیکرت به ترتیب مشخص با اسلایدر سفارشی"""
1212
- # تعریف گروه‌های سوالات با لیبل‌های سفارشی
1213
  question_groups = [
1214
  {
1215
  "title": "عدالت توزیعی",
1216
  "key": "distributive",
1217
  "questions": [
1218
- {
1219
- "key": "distributive_1",
1220
- "question": "قیمتی که به شما ارائه شد، چگونه بود؟",
1221
- "scale": 7,
1222
- "labels": ["کاملاً نامنصفانه", "کاملاً منصفانه"] # لیبل‌های سفارشی برای این سوال
1223
- },
1224
- {
1225
- "key": "distributive_2",
1226
- "question": "قیمتی که به شما ارائه شد، چگونه بود؟",
1227
- "scale": 7,
1228
- "labels": ["کاملاً غیرمعقول", "کاملاً معقول"]
1229
- },
1230
- {
1231
- "key": "distributive_3",
1232
- "question": "قیمتی که به شما ارائه شد، چگونه بود؟",
1233
- "scale": 7,
1234
- "labels": ["کاملاً غیرقابل قبول", "کاملاً قابل قبول"]
1235
- }
1236
- ]
1237
- },
1238
- {
1239
- "title": "سوال توجه",
1240
- "key": "attention_check",
1241
- "questions": [
1242
- {"key": "attention_check2", "question": "تا چه مقدار با دقت به سوالات پاسخ می‌دهید؟", "scale": 7,"labels": ["خیلی کم", "خیلی زیاد"]}
1243
  ]
1244
  },
1245
  {
1246
  "title": "عدالت رویه‌ای",
1247
  "key": "procedural",
1248
  "questions": [
1249
- {"key": "procedural_1", "question": "رآیند و رویه قیمت‌گذاری پلتفرم قابل قبول است", "scale": 7, "labels": ["کاملاً مخالفم", "کاملاً موافقم"]},
1250
- {"key": "procedural_2", "question": "رآیند و رویه قیمت‌گذاری پلتفرم منصفانه است", "scale": 7, "labels": ["کاملاً مخالفم", "کاملاً موافقم"]},
1251
- {"key": "procedural_3", "question": ".فرآیند و رویه قیمت‌گذاری پلتفرم معقول است", "scale": 7, "labels": ["کاملاً مخالفم", "کاملاً موافقم"]}
1252
- ]
1253
- },
1254
- {
1255
- "title": "عدالت اطلاعاتی",
1256
- "key": "informational",
1257
- "questions": [
1258
- {"key": "informational_1", "question": "تا چه حد رهیار دلایل تعیین قیمت را به صورت صادقانه توضیح داد؟", "scale": 7, "labels": ["هیچ", "خیلی زیاد"]},
1259
- {"key": "informational_2", "question": "تا چه حد رهیار عوامل مؤثر بر تعیین قیمت را به طور کامل شرح داد؟", "scale": 7, "labels": ["هیچ", "خیلی زیاد"]},
1260
- {"key": "informational_3", "question": "تا چه حد دلایل ارائه‌شده توسط رهیار برای تعیین قیمت منطقی و قابل قبول بود؟", "scale": 7, "labels": ["هیچ", "خیلی زیاد"]},
1261
- {"key": "informational_4", "question": "تا چه حد توضیحات درباره تعیین قیمت بلافاصله و در زمان مناسب نمایش داده شد؟", "scale": 7, "labels": ["هیچ", "خیلی زیاد"]},
1262
- {"key": "informational_5", "question": "تا چه حد توضیحات رهیار درباره تعیین قیمت، متناسب با شرایط سفر شما بود؟", "scale": 7, "labels": ["هیچ", "خیلی زیاد"]}
1263
  ]
1264
  }
1265
  ]
1266
 
1267
-
1268
  # مقداردهی اولیه
1269
  if 'current_likert_group' not in st.session_state:
1270
  st.session_state.current_likert_group = 0
1271
 
1272
- # دریافت گروه جاری
1273
  current_group = question_groups[st.session_state.current_likert_group]
1274
 
1275
- # نمایش عنوان گروه
1276
- st.markdown("""
1277
- <style>
1278
- .guide-text p {
1279
- font-size: 14px !important;
1280
- }
1281
- </style>
1282
- """, unsafe_allow_html=True)
1283
- st.markdown("""
1284
- <div class="guide-text" style="display: flex; flex-direction: column; align-items: center; background-color: #f0f2f6; border-radius: 10px; padding: 20px; gap: 15px;">
1285
- <div style="flex: 1;">
1286
- <h3>راهنمای پاسخ:</h3>
1287
- <p>برای پاسخ به سوالات، با یک طیف کشویی مواجه خواهید شد.</p>
1288
- <p>در این طیف 7 نقطه وجود دارد:
1289
- <br>- سمت چپ: کمترین مقدار
1290
- <br>- سمت راست: بیشترین مقدار
1291
- </p>
1292
- <p>نقطه روی کشو را جابجا کنید و در مقداری که پاسخ شماست متوقف شوید.</p>
1293
- <p>پاسخ شما زیر طیف نمایش داده خواهد شد.</p>
1294
- <p>اگر از پاسخ‌هایتان مطمئن هستید، روی دکمه «ادامه» کلیک کنید.</p>
1295
- </div>
1296
- </div>
1297
- """, unsafe_allow_html=True)
1298
 
1299
- # نمایش تمام سوالات این گروه در یک صفحه
1300
  for question in current_group['questions']:
1301
- answer = custom_likert_slider(question)
1302
- st.session_state.answers[question["key"]] = answer
1303
-
1304
-
1305
  # دکمه ادامه/اتمام
1306
- button_label = "ادامه به گروه بعدی" if st.session_state.current_likert_group < len(question_groups)-1 else "اتمام پرسشنامه"
1307
-
1308
- if st.button(button_label):
1309
- # رفتن به گروه بعدی یا صفحه پایانی
1310
  if st.session_state.current_likert_group < len(question_groups) - 1:
1311
  st.session_state.current_likert_group += 1
1312
  st.rerun()
 
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"]
 
748
  # مقدار پیش‌فرض از session_state یا وسط مقیاس
749
  default_value = st.session_state.get(key, (scale + 1) // 2)
750
 
751
+ # استایل‌دهی
752
+ st.markdown(f"""
753
+ <style>
754
+ .likert-btn {{
755
+ width: 40px !important;
756
+ height: 40px !important;
757
+ border-radius: 50% !important;
758
+ padding: 0 !important;
759
+ margin: 0 5px !important;
760
+ min-width: 40px !important;
761
+ }}
762
+ .likert-selected {{
763
+ background-color: #6a0dad !important;
764
+ color: white !important;
765
+ }}
766
+ </style>
767
+ <p style="font-size:16px; font-weight:bold; text-align:center; margin-bottom:10px;">{question}</p>
768
+ <div style="display:flex; justify-content:space-between; margin-bottom:5px;">
769
+ <span>{labels[0]}</span>
770
+ <span>{labels[1]}</span>
 
 
771
  </div>
772
+ """, unsafe_allow_html=True)
773
+
774
+ # ایجاد دکمه‌های دایره‌ای
775
+ cols = st.columns(scale)
776
+ selected = default_value
777
+
778
+ for i in range(scale):
779
+ with cols[i]:
780
+ if st.button(
781
+ str(i+1),
782
+ key=f"{key}_btn_{i+1}",
783
+ on_click=lambda v=i+1: st.session_state.update({key: v})
784
+ ):
785
+ selected = i+1
 
 
 
 
 
 
 
 
786
 
787
+ # نمایش مقدار انتخاب شده
788
+ st.markdown(f"""
789
+ <p style='text-align:center; color:#6a0dad; font-weight:bold; margin-top:10px;'>
790
+ پاسخ شما: {st.session_state.get(key, selected)}
791
+ </p>
792
+ """, unsafe_allow_html=True)
793
 
794
+ return st.session_state.get(key, selected)
 
795
 
796
  def create_ride_map():
797
  """ایجاد نقشه سفر با Folium - نسخه اصلاح شده با مناطق عمومی"""
 
1202
  st.warning("لطفاً یک گزینه را انتخاب کنید")
1203
 
1204
  def random_likert_questions():
1205
+ """نمایش سوالات لیکرت با تابع پیشرفته"""
 
1206
  question_groups = [
1207
  {
1208
  "title": "عدالت توزیعی",
1209
  "key": "distributive",
1210
  "questions": [
1211
+ {"key": "distributive_1", "question": "قیمت ارائه شده چقدر منصفانه بود؟", "scale": 5, "labels": ["کاملاً نامنصفانه", "کاملاً منصفانه"]},
1212
+ {"key": "distributive_2", "question": "قیمت ارائه شده چقدر معقول بود؟", "scale": 5, "labels": ["کاملاً غیرمعقول", "کاملاً معقول"]},
1213
+ {"key": "distributive_3", "question": "قیمت ارائه شده چقدر قابل قبول بود؟", "scale": 5, "labels": ["کاملاً غیرقابل قبول", "کاملاً قابل قبول"]}
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1214
  ]
1215
  },
1216
  {
1217
  "title": "عدالت رویه‌ای",
1218
  "key": "procedural",
1219
  "questions": [
1220
+ {"key": "procedural_1", "question": "رویه قیمت‌گذاری چقدر قابل قبول است؟", "scale": 5, "labels": ["کاملاً غیرقابل قبول", "کاملاً قابل قبول"]},
1221
+ {"key": "procedural_2", "question": "رویه قیمت‌گذاری چقدر منصفانه است؟", "scale": 5, "labels": ["کاملاً نامنصفانه", "کاملاً منصفانه"]}
 
 
 
 
 
 
 
 
 
 
 
 
1222
  ]
1223
  }
1224
  ]
1225
 
 
1226
  # مقداردهی اولیه
1227
  if 'current_likert_group' not in st.session_state:
1228
  st.session_state.current_likert_group = 0
1229
 
 
1230
  current_group = question_groups[st.session_state.current_likert_group]
1231
 
1232
+ st.markdown(f"### {current_group['title']}")
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1233
 
1234
+ # نمایش همه سوالات گروه جاری
1235
  for question in current_group['questions']:
1236
+ answer = enhanced_likert_scale(question)
1237
+ st.session_state[question["key"]] = answer # ذخیره پاسخ با کلید اصلی
1238
+
 
1239
  # دکمه ادامه/اتمام
1240
+ if st.button("ادامه" if st.session_state.current_likert_group < len(question_groups)-1 else "اتمام"):
 
 
 
1241
  if st.session_state.current_likert_group < len(question_groups) - 1:
1242
  st.session_state.current_likert_group += 1
1243
  st.rerun()