[QT][Python] ν¨μμ QT μ°κ²°νκΈ° (4)
#1. νμΌ μ°Ύμ보기 λ²νΌ - fl_btn
#2. νμΌ κ²½λ‘ λνλλ λ²νΌ - fl_lbl
#3. λΆμ κΈ°λ₯ μ§μ λλ‘λ€μ΄ λ²νΌ - fun_cb
# μ¬μ©μλ³ λν λΉλ
# μ¬μ©μλ³ μ΄λͺ¨ν°μ½ μ¬μ© λΉλ
# μ¬μ©μλ³ νλ μκ°λ
# μ¬μ©μλ³ νκ· λ΅λ³ μκ°
#4. μκ°λλ³ νλ λΉλ λΆμ μ°Έμ¬μ μ ν ν μ€νΈ μ λ ₯ λ°μ€ - filter_te
#5. λΆμ κ²°κ³Ό μ΄λ―Έμ§ λ€μ΄λ‘λ λ²νΌ - down_btn
#6. λΆμ(Start) Run λ²νΌ - st_btn
#7. μ΄κΈ°ν(Reset) Run λ²νΌ - rst_btn
#8. κ²°κ³Ό νλ©΄ - ptr_lbl
μ΄μ λ§μ§λ§μΌλ‘ λ¨μ λ²νΌμ 4λ²κ³Ό 5λ²μ΄λ€.
μ무λλ ν μ€νΈλ₯Ό μ λ ₯νκ³ μ΄λ―Έμ§λ₯Ό λ€μ΄λ‘λ νλ λ²νΌμ΄ κ°μ₯ μ΄λ ΅λ€κ³ λκ»΄μ‘κΈ° λλ¬Έμ λ§μ§λ§μΌλ‘ μμ μ νλ κ² κ°λ€. (νμ§λ§ κ°μ₯ μ΄λ €μ΄ μμ μ μλμλ κ² κ°λ€.)
#4. μκ°λλ³ νλ λΉλ λΆμ μ°Έμ¬μ μ ν ν μ€νΈ μ λ ₯ λ°μ€ - filter_te

ν μ€νΈ λ°μ€μ μ΄λ¦μ μ λ ₯νμ¬ μ°Έμ¬μλ³λ‘ μκ°λλ³ νλ λΉλ μκ°μ λν νμ΄μ°¨νΈλ₯Ό μΆλ ₯νλ κ²μ νλμ κΈ°λ₯μλ§ ν΄λΉλλ κ²μ΄λ€.
κ·Έλμ λ€μν λ°©λ²μ κ³ λ―Όνλ€κ° κ·Έλ₯ λ€λ₯Έ κΈ°λ₯λ€μ μ ννκ³ λΆμ λ²νΌμ λλ₯Ό λ μ°Έμ¬μ νν°λ§μ μ λ ₯κ°μ΄ μλ μλ μκ΄μμ΄ μλ κ°μ΄ μΆλ ₯λλλ‘ νλ€.
νμ§λ§ 'μκ°λλ³ νλ λΉλ' κΈ°λ₯μ μ ννκ³ μ΄λ¦κ°μ μ ννκ² μ λ ₯νλ©΄ μ λλ‘λ νν°λ§μ΄ λλλ‘ μ½λλ₯Ό μ§λ κ²μΌλ‘ κ³ννλ€.
λμ μ΄λ¦μ΄ ν리거λ λΉμΉΈμΌλ‘ [λΆμ] λ²νΌμ ν΄λ¦νλ©΄ μ 체 νμ΄κ°μ΄ μΆλ ₯λλλ‘ μ€μ νλ€.
κΈ°μ‘΄μ ν¨μλ₯Ό μ μν pyνμΌμμλ μ 체 μΆλ ₯κ³Ό κ°λ³ μΆλ ₯ κ°μ΄ λͺ¨λ λμ€λλ‘ μ€μ λμ΄μκΈ° λλ¬Έμ ν΄λΉ ν¨μλ₯Ό κ·Έλλ‘ νμ©νλ©΄ λλ€.
μ°μ κΈ°μ‘΄μ μμ±νλ "μ¬μ©μλ³ κ° μκ°λ νλ λΉλ λΆμ"μ ν¨μμμ name νν°λ§ λ€μμ νμ΄ μ°¨νΈλ₯Ό μΆλ ₯νλ κ°μ΄ μ‘°κΈ λ³κ²½λμλ€.
# νμ΄ μ°¨νΈ μμ±
if not pivot_table.empty:
fig, ax = plt.subplots()
pivot_table.iloc[0].plot(kind='pie', ax=ax, autopct='%1.1f%%', startangle=90, legend=False)
ax.set_title(f"{names[0]}μ μκ°λλ³ νλ λΉλ")
ax.set_ylabel('')
plt.tight_layout()
else:
pivot_table = activity_by_time.pivot(index='Name', columns='Time_Parts', values='Count_Messages').fillna(0)
fig, axes = plt.subplots(nrows=1, ncols=len(pivot_table), figsize=(15, 5))
for i, (names, data) in enumerate(pivot_table.iterrows()):
data.plot(kind='pie', ax=axes[i], autopct='%1.1f%%', startangle=90, legend=False)
axes[i].set_title(names)
axes[i].set_ylabel('')
plt.tight_layout()
μλλ if not κ°κ³Ό else κ°μ μμκ° λ¬λλ€.
pivot_table κ°μ μλμ κ°μλ°
pivot_table = user_data.pivot(index='Name', columns='Time_Parts', values='Count_Messages').fillna(0)
μμ μ λ ₯λ names κ°μ΄ μΈλ±μ€λ‘ λ€μ΄κ°μ κ°μ μΆλ ₯νλ κ²μ pivot_tableμ λ£μ κ²μ΄λ€.
λ§μ½ pivot_table κ°μ΄ λΉμ΄μμ§ μλ€λ©΄ Name κ°μ΄ μ λ ₯λ κ²μ΄κΈ° λλ¬Έμ κ°λ³λ‘ μΆλ ₯λλ μ½λλ₯Ό μμ±νμ§λ§ λΉμ΄μκ±°λ μ λλ‘ μ λ ₯λμ§ μμλ€λ©΄ λ€μ pivot_tableμ μ μνμ¬ λ°λ³΅λ¬Έμ μν΄ λͺ¨λ κ°μ΄ μΆλ ₯λλλ‘ μμ±νμλ€.
μ΄ ν¨μλ₯Ό νμ©νλ μ½λλ λ°λ‘ qt νμΌμμ μΆκ°ν 건 μκ³ μ½λ λͺ μ€λ§ μΆκ°νλ©΄ λλ€.
μ°μ μλ‘ μ€νν λλ§λ€ κ°μ²΄κ° μ΄κΈ°νλμ΄μΌ νκΈ° λλ¬Έμ __init__ ν¨μμ μλμ μ½λλ₯Ό μΆκ°νλ€.
self.filter_te = self.findChild(QTextEdit, 'filter_te')
κ·Έλ¦¬κ³ λΆμμ μ€ννλ λ²νΌμΈ [st_btn]μ μν΄ μμ±ν ν¨μ start_analyze_dataμ filter_teμ μμ±λ ν μ€νΈλ₯Ό κ°μ Έμμ μ λ ₯νλ μ½λλ₯Ό μμ±ν΄μ€λ€.
names = self.filter_te.toPlainText()
names = names.split()
ν΄λΉ μ½λλ₯Ό μΆκ°ν΄μ£Όλ©΄ start_analyze_data ν¨μμμ μμ±λλ μ½λ κ°μ μλμ κ°λ€.
if self.selected_value == 'μ¬μ©μλ³ λν λΉλ':
self.fig = count_messages_by_name(self.refined_data)
self.plot_pixmap()
elif self.selected_value == 'μ¬μ©μλ³ μ΄λͺ¨ν°μ½ μ¬μ© λΉλ':
self.fig = count_emoticon_usage(self.refined_data, 'μ΄λͺ¨ν°μ½')
self.plot_pixmap()
elif self.selected_value == 'μ¬μ©μλ³ νκ· λ΅λ³ μκ°':
self.fig = calculate_response_time(self.refined_data)
self.plot_pixmap()
elif self.selected_value == 'μ¬μ©μλ³ νλ μκ°λ':
self.fig = analyze_activity_by_time(self.refined_data, names)
self.plot_pixmap()
names κ°μ μ μν΄μ€¬κΈ° λλ¬Έμ 'μ¬μ©μλ³ νλ μκ°λ' ν¨μμμ names λ₯Ό νμ©ν μ μλ€.
κ·Έλ¦¬κ³ λ€λ₯Έ κΈ°λ₯ κ°μμλ μ μ μλμ΄μκΈ° λλ¬Έμ names κ°μ μν₯μ λ°μ§ μλλ€.
λ§μ§λ§μΌλ‘ κ²°κ³Ό νλ©΄μ 리μ ν λ filter_teμ μμ±λ κ°λ ν¨κ» 리μ λμ΄μΌ νκΈ° λλ¬Έμ reset_canvas ν¨μμ
self.filter_te.clear()
ν΄λΉ μ½λλ₯Ό μΆκ°ν΄μ€λ€.
μ΄λ κ²νλ©΄ νν°λ§ κΈ°λ₯μ λν ν¨μ μ°κ²°μ μμ±λλ€.
#5. λΆμ κ²°κ³Ό μ΄λ―Έμ§ λ€μ΄λ‘λ λ²νΌ - down_btn

μΆλ ₯ κ²°κ³Ό κ°μ GUIμμ νμΈνκ³ μ΄λ―Έμ§λ‘λ λ€μ΄λ°μ μ μλ ν¨μλ₯Ό μμ±νλ€.ν¨μλͺ μ download_image μΈλ° μ¬μ€ ν΄λΉ λΆλΆμ μμ±μ μμ λͺ°λΌμ gptκ° μμ±ν΄μ€λλ‘ μ μ©νλλ λμλ€.
def download_image(self):
file_path, _ = QFileDialog.getSaveFileName(self, "μ΄λ―Έμ§ μ μ₯", "", "PNG Files (*.png);;All Files (*)")
if file_path:
self.fig.savefig(file_path, format='png')
- QFileDialog.getSaveFileNameμ μ¬μ©μκ° νμΌμ μ μ₯ν μμΉμ μ΄λ¦μ μ νν μ μλλ‘ νμΌ μ μ₯ λν μμλ₯Ό νμνλ€.
- "μ΄λ―Έμ§ μ μ₯" : νμΌ λν μμ μ λͺ©μΌλ‘ μ¬μ©λλ€.
- " PNG Files (*.png);;All Files (*)" : νμΌ νμ νν°λ₯Ό μ§μ νλ€. μ¬κΈ°μλ PNG νμΌλ§ μ νν μ μλλ‘ νκ³ , λͺ¨λ νμΌ νμλ μ νν μ μκ² νλ€.
- if file_pathλ₯Ό μμ±νμ¬ μ¬μ©μκ° νμΌ κ²½λ‘λ₯Ό μ ννλ€λ©΄ μ‘°κ±΄λ¬Έμ΄ μ€νλλλ‘ μ€μ νλ€.
- file_pathλ‘ μ§μ λ κ²½λ‘μ μ΄λ―Έμ§λ₯Ό PNG νμμΌλ‘ μ μ₯νλ€.
κ·Έλ¦¬κ³ λ§μ§λ§μΌλ‘ ν΄λΉ ν¨μλ₯Ό qtμ κ°μ²΄μΈ down_btn μμ ―μ μ°κ²°ν΄μ€λ€.
(__init__ μμ)
self.down_btn.clicked.connect(self.download_image)
μ΄λ κ²νλ©΄ λͺ¨λ ν¨μ μ λ ₯μ λλλ€.
μ λ ₯ν ν¨μμ λ©μΈ μ μΈ ν¨μλ₯Ό ν¨κ» μ€ννλ©΄ λμνλ GUIλ₯Ό νμΈν μ μλ€.
λ§μ§λ§ κ²μκΈμ λμνλ κ²°κ³Όλ¬Ό μμμ 첨λΆν μμ μ΄λ€.