GSMEthesis commited on
Commit
0f252c0
·
verified ·
1 Parent(s): e44f261

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +52 -63
app.py CHANGED
@@ -743,97 +743,86 @@ import streamlit as st
743
  import plotly.graph_objects as go
744
 
745
  def custom_likert_slider(question_data):
746
- """نمایش سوال لیکرت با طیف Plotly (فلیپ‌شده)"""
 
 
 
747
  question = question_data["question"]
748
  key = question_data["key"]
749
  points = question_data["scale"]
750
- labels = question_data.get("labels", ["کمترین", "بیشترین"]) # لیبل‌های دو طرف
751
- scale_labels = ["خیلی کم", "کم", "نسبتاً کم", "متوسط", "نسبتاً زیاد", "زیاد", "خیلی زیاد"] # لیبل‌های طیف
752
 
753
  # مقدار پیش‌فرض (وسط طیف)
754
- default_value = (points + 1) // 2 - 1 # برای مقیاس ۰ تا ۶
755
-
756
- # نمایش سوال
757
- st.markdown(f"<p style='font-size:16px; margin-bottom:5px; font-family:\"B Nazanin\"; direction:rtl;'>{question}</p>", unsafe_allow_html=True)
758
-
759
- # لیبل‌های دو طرف (فلیپ‌شده)
760
- st.markdown(
761
- f"""
762
- <div class="slider-labels" style='display:flex; justify-content:space-between; font-size:16px; font-weight:bold; margin-bottom:12px; color:#333333; font-family:"B Nazanin"; direction:rtl;'>
763
- <span>{labels[1]}</span> <!-- بیشترین (مثل کاملاً منصفانه) سمت راست -->
764
- <span>{labels[0]}</span> <!-- کمترین (مثل کاملاً نامنصفانه) سمت چپ -->
765
- </div>
766
- """,
767
- unsafe_allow_html=True
768
- )
769
-
770
- # انتخاب عددی از اسلایدر معمولی
771
- raw_value = st.slider(
772
- "",
773
  min_value=0,
774
  max_value=points-1,
775
- value=st.session_state.get(key, default_value),
776
  step=1,
777
- key=key,
778
- format="%d"
779
  )
780
-
781
- # معکوس کردن مقدار برای ذخیره‌سازی (۰ به ۷، ۱ به ۶، و غیره)
782
- flipped_value = points - raw_value
783
-
784
- # نمایش طیف با Plotly (فلیپ‌شده)
785
- positions = list(range(len(scale_labels)))
786
  fig = go.Figure()
787
-
 
788
  fig.add_trace(go.Scatter(
789
  x=positions,
790
- y=[0]*len(scale_labels),
791
  mode='markers+text',
792
  marker=dict(
793
- size=24, # دایره‌های بزرگ‌تر
794
- color=['#d8d2f3' if i != raw_value else '#6a0dad' for i in positions], # بنفش تیره برای انتخاب‌شده
795
- line=dict(width=2, color='#ffffff') # حاشیه سفید
796
  ),
797
- text=scale_labels,
798
  textposition="top center",
799
- textfont=dict(family="B Nazanin", size=16, color="#333333")
800
  ))
801
-
 
 
 
 
 
 
 
 
 
802
  fig.update_layout(
803
  xaxis=dict(
804
  tickmode='array',
805
  tickvals=positions,
806
- ticktext=scale_labels[::-1], # فلیپ کردن لیبل‌ها (خیلی زیاد سمت راست)
807
  showgrid=False,
808
  zeroline=False,
809
- tickfont=dict(family="B Nazanin", size=14),
810
- autorange="reversed" # فلیپ کردن محور x
811
  ),
812
- yaxis=dict(showticklabels=False, showgrid=False, zeroline=False),
813
  margin=dict(l=20, r=20, t=40, b=20),
814
- height=200,
815
  showlegend=False,
816
- paper_bgcolor="#f8f9fa", # پس‌زمینه هماهنگ
817
- plot_bgcolor="#f8f9fa"
818
  )
819
-
820
- st.plotly_chart(fig, use_container_width=True)
821
-
822
- # نمایش پاسخ انتخاب‌شده (مقدار فلیپ‌شده)
823
- st.markdown(
824
- f"""
825
- <p class="slider-response" style='text-align:center; color:#6a0dad; font-weight:bold; font-size:18px; margin-top:15px; font-family:"B Nazanin"; direction:rtl; background:#f0e6ff; padding:8px; border-radius:6px;'>
826
- پاسخ انتخاب‌شده: {scale_labels[raw_value]} ({flipped_value})
827
- </p>
828
- """,
829
- unsafe_allow_html=True
830
- )
831
-
832
- # دیباگ
833
- st.write(f"Debug: مقدار خام: {raw_value}, مقدار فلیپ‌شده ذخیره‌شده برای {key}: {flipped_value}")
834
 
835
- # ذخیره مقدار فلیپ‌شده
836
- return flipped_value
 
 
 
 
 
 
837
 
838
  def create_ride_map():
839
  """ایجاد نقشه سفر با Folium - نسخه اصلاح شده با مناطق عمومی"""
 
743
  import plotly.graph_objects as go
744
 
745
  def custom_likert_slider(question_data):
746
+ import plotly.graph_objects as go
747
+
748
+ def custom_likert_slider(question_data):
749
+ """نمایش سوال لیکرت با اسلایدر و طیف رنگی Plotly"""
750
  question = question_data["question"]
751
  key = question_data["key"]
752
  points = question_data["scale"]
753
+ labels = question_data.get("labels", ["کاملاً مخالفم", "کاملاً موافقم"])
 
754
 
755
  # مقدار پیش‌فرض (وسط طیف)
756
+ default_value = st.session_state.answers.get(key, (points - 1) // 2)
757
+
758
+ st.markdown(f"**{question}**")
759
+
760
+ # ایجاد اسلایدر عددی
761
+ selected = st.slider(
762
+ "انتخاب شدت",
 
 
 
 
 
 
 
 
 
 
 
 
763
  min_value=0,
764
  max_value=points-1,
765
+ value=default_value,
766
  step=1,
767
+ key=f"slider_{key}",
768
+ label_visibility="collapsed"
769
  )
770
+
771
+ # ذخیره فوری مقدار در session_state
772
+ st.session_state.answers[key] = selected
773
+ st.session_state[key] = selected
774
+
775
+ # نمایش طیف با رنگ بنفش روی گزینه انتخاب‌شده
776
  fig = go.Figure()
777
+
778
+ positions = list(range(points))
779
  fig.add_trace(go.Scatter(
780
  x=positions,
781
+ y=[0]*points,
782
  mode='markers+text',
783
  marker=dict(
784
+ size=25,
785
+ color=['#d1c4e9' if i != selected else '#6a0dad' for i in positions],
786
+ line=dict(width=2, color='#6a0dad')
787
  ),
788
+ text=labels if len(labels) == points else positions,
789
  textposition="top center",
790
+ textfont=dict(size=14)
791
  ))
792
+
793
+ # خط اتصال نقاط
794
+ fig.add_trace(go.Scatter(
795
+ x=positions,
796
+ y=[0]*points,
797
+ mode='lines',
798
+ line=dict(color='#d1c4e9', width=2),
799
+ hoverinfo='none'
800
+ ))
801
+
802
  fig.update_layout(
803
  xaxis=dict(
804
  tickmode='array',
805
  tickvals=positions,
806
+ ticktext=labels if len(labels) == points else positions,
807
  showgrid=False,
808
  zeroline=False,
809
+ range=[-0.5, points-0.5]
 
810
  ),
811
+ yaxis=dict(showticklabels=False, showgrid=False, zeroline=False, range=[-0.1, 0.1]),
812
  margin=dict(l=20, r=20, t=40, b=20),
813
+ height=150,
814
  showlegend=False,
815
+ hovermode=False
 
816
  )
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
817
 
818
+ st.plotly_chart(fig, use_container_width=True, config={'staticPlot': True})
819
+
820
+ # نمایش انتخاب
821
+ selected_label = labels[selected] if len(labels) > selected else str(selected+1)
822
+ st.markdown(f"<p style='text-align:center; color:#6a0dad; font-weight:bold;'>پاسخ شما: <strong>{selected_label}</strong></p>",
823
+ unsafe_allow_html=True)
824
+
825
+ return selected
826
 
827
  def create_ride_map():
828
  """ایجاد نقشه سفر با Folium - نسخه اصلاح شده با مناطق عمومی"""