๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿ’ก Data Analysis/๐Ÿ“‚ Project - Analysis of KakaoTalk (end)

[QT][Python] ํ•จ์ˆ˜์™€ QT ์—ฐ๊ฒฐํ•˜๊ธฐ (2)

by Sun A 2024. 8. 1.

๋ฉ”์ธ์„ ์„ ์–ธํ•˜๊ณ  ํด๋ž˜์Šค๋„ ์ •์˜ํ–ˆ์œผ๋‹ˆ ํด๋ž˜์Šค ์•ˆ์— ๋ฒ„ํŠผ๋“ค์„ ์ •์˜ํ•ด์ฃผ๋Š” ์ž‘์—…์„ ์ง„ํ–‰ํ•ด์•ผ ํ•œ๋‹ค.

#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

 

์šฐ์„  ํ•ด๋‹น ๋ฒ„ํŠผ๋“ค ์ค‘์—์„œ #1, #2,  #7 ๋ฒ„ํŠผ ๋จผ์ € ์ž‘์„ฑํ•˜์˜€๋‹ค. (์‰ฌ์šด ๋ฒ„ํŠผ ์šฐ์„ )

์•„๋ฌด๋ž˜๋„ ๋‚˜๋จธ์ง€ ๋ฒ„ํŠผ๋“ค์ด ์ „๋ถ€ Start ๋ฒ„ํŠผ์„ ํด๋ฆญํ•˜๊ธฐ ์ „์— ์ž‘๋™ํ•˜๋Š” ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ€์žฅ ์‰ฌ์šด ๋ถ„์„ ๋ฒ„ํŠผ ๋จผ์ € ๋™์ž‘ํ•˜๋„๋ก ์—ฐ๊ฒฐํ•˜์˜€๋‹ค.

 

#1. ํŒŒ์ผ [์ฐพ์•„๋ณด๊ธฐ] ๋ฒ„ํŠผ - fl_btn / #2. ๊ฒฝ๋กœ ์ง€์ • - fl_lbl

์—ฌ๊ธฐ์„œ ์ฐพ์•„๋ณด๊ธฐ ๋ฒ„ํŠผ์„ ํด๋ฆญํ•˜๋ฉด ํŒŒ์ผ ๊ฒฝ๋กœ๊ฐ€ ๋‚˜์˜ฌ ์ˆ˜ ์žˆ๋Š” ํ•จ์ˆ˜๊นŒ์ง€ ์ž‘์„ฑํ•ด์•ผ ํ•œ๋‹ค.

์šฐ์„  ํŒŒ์ผ์„ ์ฐพ์•„์˜ฌ ์ˆ˜ ์žˆ๋Š” ํ•จ์ˆ˜๋ถ€ํ„ฐ ์ •์˜ํ•œ๋‹ค.

def upload_txt_file(self):

 

ํŒŒ์ผ ํƒ์ƒ‰ ๋Œ€ํ™” ์ƒ์ž์— ์‚ฌ์šฉํ•  ์˜ต์…˜์„ ์„ค์ •ํ•œ๋‹ค.

        options = QFileDialog.Options()

 

ํŒŒ์ผ ํƒ์ƒ‰ ๋Œ€ํ™” ์ƒ์ž๋ฅผ ์—ด๊ณ  ํŒŒ์ผ์„ ์„ ํƒํ•  ์ˆ˜ ์žˆ๋„๋ก ์ง€์ •ํ•˜๊ณ  ๊ฒฝ๋กœ๋ฅผ ๋ณ€์ˆ˜(self.file_path)์— ์ €์žฅํ•œ๋‹ค

        self.file_path,_ =  QFileDialog.getOpenFileName(self, "ํŒŒ์ผ ์„ ํƒ", "", "All Files (*);;Text Files (*.txt)", options=options)
  • self : ๋Œ€ํ™” ์ƒ์ž์˜ ๋ถ€๋ชจ ์œ„์ ฏ
  • "ํŒŒ์ผ ์„ ํƒ" : ๋Œ€ํ™” ์ƒ์ž์˜ ์ œ๋ชฉ
  • "" : ๊ธฐ๋ณธ ์‹œ์ž‘ ๋””๋ ‰ํ† ๋ฆฌ (๋น„์›Œ๋’€๊ธฐ ๋•Œ๋ฌธ์— ํ˜„์žฌ ๋””๋ ‰ํ† ๋ฆฌ์—์„œ ์‹œ์ž‘ํ•œ๋‹ค.)
  • "All Files (*);;Text Files (*.txt)" : ํŒŒ์ผ ํ•„ํ„ฐ๋ฅผ ์ง€์ •ํ•œ๋‹ค. ์‚ฌ์šฉ์ž๋Š” ๋ชจ๋“  ํŒŒ์ผ๊ณผ ํ…์ŠคํŠธ ํŒŒ์ผ ์ค‘์— ์„ ํƒํ•  ์ˆ˜ ์žˆ๋‹ค.
  • options = options : ์•ž์— ์ง€์ •ํ•œ ์˜ต์…˜์„ ์‚ฌ์šฉ

 

์ด์ œ ํŒŒ์ผ ๊ฒฝ๋กœ๋ฅผ ๊ฒฝ๋กœ๊ฐ€ ๋‚˜ํƒ€๋‚˜๋Š” #2 fl_lbl์— ํ‘œ์‹œ๋˜๋„๋ก ์—ฐ๊ฒฐํ•œ๋‹ค.

    self.fl_lbl.setText(self.file_path)

 

๋‹ค์Œ์œผ๋กœ ํŒ๋‹ค์Šค ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ด์šฉํ•ด์„œ ์‚ฌ์šฉ์ž๊ฐ€ ์ง€์ •ํ•œ file_path ์—์„œ ํ…์ŠคํŠธ๋ฅผ ์ฝ๋Š”๋‹ค.

    self.data = pd.read_table(f'{self.file_path}')

 

๊ทธ๋ฆฌ๊ณ  ์ฝ์–ด์˜จ ํŒŒ์ผ์„ ์ด์ „ ๋ชจ๋“ˆ์—์„œ ์ „์ฒ˜๋ฆฌ๊ฐ€ ๊ฐ€๋Šฅํ•œ ํ•จ์ˆ˜๋ฅผ ๋ถˆ๋Ÿฌ์™€์„œ ์ „์ฒ˜๋ฆฌํ•œ๋‹ค.

    self.refined_data = generate_dataframe(self.data)

 

๊ทธ๋Ÿผ ์ด์ œ ์ด ๋ฒ„ํŠผ์„ ์œ„์— ์ •์˜ํ•œ ํ•จ์ˆ˜์™€ ์—ฐ๊ฒฐํ•ด์•ผ ํ•œ๋‹ค.

__init__ ๋กœ ์ •์˜ํ•œ ํ•จ์ˆ˜ ์•ˆ์— ๋ฒ„ํŠผ์„ ์—ฐ๊ฒฐํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ์ž…๋ ฅํ•ด์ฃผ๋ฉด ๋œ๋‹ค.

    self.fl_btn.clicked.connect(self.upload_txt_file)

 

#7. ์ดˆ๊ธฐํ™”(Reset) Run ๋ฒ„ํŠผ - rst_btn

๊ฒฐ๊ณผ ํ™”๋ฉด์ด ๋‚˜์˜ค๊ณ  ๋‚˜์„œ ๋‹ค๋ฅธ ๋ถ„์„์„ ์ง„ํ–‰ํ•˜๊ณ  ์‹ถ์„ ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ๋ฆฌ์…‹ ํ•จ์ˆ˜๊ฐ€ ํ•„์š”ํ•˜๋‹ค.

 

def reset_canvas(self):

 

์—ฌ๊ธฐ์„œ ์ดˆ๊ธฐํ™” ๋˜์–ด์•ผ ํ•˜๋Š” ํ•ญ๋ชฉ์€ ์‹œ๊ฐํ™” ๊ฒฐ๊ณผ ์ถœ๋ ฅ ๋ ˆ์ด๋ธ”(ptr_lbl), ์ €์žฅ ์œ„์น˜ ๋ฐ ํŒŒ์ผ๋ช…(fl_lbl), ํ•„ํ„ฐ๋ง ๊ธฐ๋Šฅ(filter_te) ์„ธ ๊ฐ€์ง€์ด๋‹ค.QT์— ์ง€์ •ํ•ด๋‘” ๊ฐ์ฒด๋ช…์œผ๋กœ ๋ฏธ๋ฆฌ clear() ์ฝ”๋“œ๋ฅผ ์ž…๋ ฅํ•ด๋‘”๋‹ค.

    self.ptr_lbl.clear()
    self.fl_lbl.clear()
    self.filter_te.clear()

 

์ด๋ฅผ ์ดˆ๊ธฐํ™” ๋ฒ„ํŠผ ๊ฐ์ฒด์— ์—ฐ๊ฒฐํ•œ๋‹ค.

    self.rst_btn.clicked.connect(self.reset_canvas)

 


์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ํŒŒ์ผ ๊ฒฝ๋กœ ์ง€์ • ๋ฐ ์ดˆ๊ธฐํ™” ๋ฒ„ํŠผ์„ ์™„์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.