Spaces:
Sleeping
Sleeping
Update app.py
Browse files
app.py
CHANGED
|
@@ -674,36 +674,55 @@ h3 {
|
|
| 674 |
""", unsafe_allow_html=True)
|
| 675 |
|
| 676 |
# ========== توابع اصلی ==========
|
| 677 |
-
def custom_likert_slider(question, key, points=7
|
| 678 |
-
|
| 679 |
-
|
| 680 |
-
|
| 681 |
-
|
| 682 |
-
|
| 683 |
-
|
| 684 |
-
|
| 685 |
-
# نمایش
|
| 686 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 687 |
|
| 688 |
-
|
| 689 |
-
|
| 690 |
-
|
| 691 |
-
|
| 692 |
-
|
| 693 |
-
|
| 694 |
-
|
| 695 |
-
|
| 696 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 697 |
|
| 698 |
-
#
|
| 699 |
-
|
| 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 |
-
|
|
|
|
| 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 |
-
"
|
| 1110 |
-
"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1111 |
"questions": [
|
| 1112 |
-
{"key": "
|
| 1113 |
-
{"key": "distributive_2", "question": "قیم�� معقول است.", "scale": 7},
|
| 1114 |
]
|
| 1115 |
},
|
| 1116 |
{
|
| 1117 |
-
"title": "
|
| 1118 |
-
"
|
| 1119 |
-
"right_label": "خیلی زیاد",
|
| 1120 |
"questions": [
|
| 1121 |
-
{"key": "
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1122 |
]
|
| 1123 |
}
|
| 1124 |
]
|
| 1125 |
|
|
|
|
| 1126 |
if 'current_likert_group' not in st.session_state:
|
| 1127 |
st.session_state.current_likert_group = 0
|
| 1128 |
-
|
| 1129 |
-
|
| 1130 |
-
|
| 1131 |
current_group = question_groups[st.session_state.current_likert_group]
|
| 1132 |
-
|
| 1133 |
-
|
| 1134 |
-
|
| 1135 |
-
|
| 1136 |
-
|
| 1137 |
-
|
| 1138 |
-
|
| 1139 |
-
|
| 1140 |
-
|
| 1141 |
-
|
|
|
|
| 1142 |
)
|
| 1143 |
-
st.session_state.answers[
|
| 1144 |
|
| 1145 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 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("### 📋 سوالات تکمیلی")
|