본문으로 바로가기
 

파이큐티(PyQt5) 시작하기 - 구글 날씨 검색기 만들기 -3 : 결과 출력

파이큐티(PyQt5) 시작하기 - 구글 날씨 검색기 만들기 -2 : 모듈 연동과 이벤트 처리 파이큐티(PyQt5) 시작하기 - 구글 날씨 검색기 만들기 -1 : 디자이너 활용 디자인하기 먼저 MainWindow 를 하나 생성합

jvvp.tistory.com

더보기
import sys
from PyQt5 import QtCore, QtWidgets, uic
from PyQt5.QtWidgets import QMainWindow

from crawler import *

ui = uic.loadUiType('app.ui')[0]
class MainWindow(QMainWindow, ui):
    def __init__(self):
        super().__init__()
        self.setupUi(self)
        self.pushButton.clicked.connect(self.run)
        self.crawler = GoogleWeather()
        self.table_cols = ['지역명', '시간', '상태']
    
    def run(self):
        keyword = self.lineEdit.text()
        self.crawler.set_keyword(keyword + ' 날씨')
        self.crawler.run()
        r = self.crawler.get_result()
        self.set_table(r)

    def set_table(self, data):
        if data:
            row_idx = self.tableWidget.rowCount()
            self.tableWidget.insertRow(row_idx)
            col_idx = self.table_cols.index('지역명')
            table_item = QtWidgets.QTableWidgetItem(data['loc'])
            self.tableWidget.setItem(row_idx, col_idx, table_item)
            
            col_idx = self.table_cols.index('시간')
            table_item = QtWidgets.QTableWidgetItem(data['time'])
            self.tableWidget.setItem(row_idx, col_idx, table_item)
            
            col_idx = self.table_cols.index('상태')
            table_item = QtWidgets.QTableWidgetItem(data['status'])
            self.tableWidget.setItem(row_idx, col_idx, table_item)

if __name__ == "__main__":
    app = QtWidgets.QApplication(sys.argv)
    main_window = MainWindow()
    main_window.show()
    app.exec_()

 

재구성

솔직히 날씨 검색같은 것을 테이블에 하나씩 출력하는 것은 그렇게 의미있어 보이지 않습니다.

어거지로 의미부여합니다.

 

우선 상태라는 컬럼을 날씨로 고치고,

테이블 위에 날씨 "검색 히스토리"라고 라벨을 하나 배치합니다.

또 검색한 시간이라는 컬럼을 만들어서 테이블 맨 앞으로 배치합니다.

 

코드에서도 수정해야겠죠. 

self.table_cols = ['검색한 시간', '지역명', '시간', '날씨']
# self.table_cols = ['지역명', '시간', '상태']
col_idx = self.table_cols.index('날씨')
# col_idx = self.table_cols.index('상태')
table_item = QtWidgets.QTableWidgetItem(data['status'])
self.tableWidget.setItem(row_idx, col_idx, table_item)

 

실행한번.

 

다음은 검색한 시간 컬럼을 채워야겠죠.

크롤러 모듈에서 결과를 추가할 때 그 시각도 같이 넣고 싶습니다. 

'search_time' 이라는 key를 추가했습니다.

 

크롤러 코드의 일부분입니다.

def parse_html(self, text):
    html = bs(text, 'html.parser')
    loc = html.find('div', {'id': 'wob_loc'})
    loc = loc.string if loc else loc
    time = html.find('div', {'id': 'wob_dts'})
    time = time.string if time else time
    status = html.find('span', {'id': 'wob_dc'})
    status = status.string if status else status

    now = datetime.datetime.now().replace(microsecond=0)
    self.result.append({
        'search_time': str(now),
        'loc': loc,
        'time': time,
        'status': status
    })
    
def get_result(self):
    if self.result:
        return self.result[-1]
    else:
        return None

받는 쪽에서도 추가합니다.

col_idx = self.table_cols.index('검색한 시간')
table_item = QtWidgets.QTableWidgetItem(data['search_time'])
self.tableWidget.setItem(row_idx, col_idx, table_item)

결과.

 

디테일

잘리는 부분들 마지막 짤리는 부분들은 코드상에서 해결해야 합니다.

 

옵션이 적용되는 절차가 있어서, 다음과 같이 적용해야 깔끔합니다.

테이블 아이템을 추가하는 함수 마지막에 다음 코드를 추가합니다.

self.tableWidget.horizontalHeader().setStretchLastSection(False)
self.tableWidget.resizeColumnsToContents()
self.tableWidget.horizontalHeader().setStretchLastSection(True)

 

정렬은 item에 설정해야합니다.

테이블 아이템을 추가하는 함수 마지막에 다음 코드를 추가합니다.

for col_idx in range(self.tableWidget.columnCount()):
    self.tableWidget.item(row_idx, col_idx).setTextAlignment(Qt.AlignCenter)

 

statusbar 도 사용해보겠습니다.

self.statusbar.showMessage('문자열') 로 설정할 수 있습니다.

 

그리고 보니 윈도우창 타이틀을 설정하지 않았네요.

__init__() 함수에 추가합니다.

self.setWindowTitle('구글 날씨 검색기')

 

아이콘도 넣어봅니다.

from PyQt5.QtGui import QIcon
self.setWindowIcon(QIcon('icon.png'))

 

전체코드

import sys
from PyQt5 import QtCore, QtWidgets, uic
from PyQt5.QtGui import QIcon
from PyQt5.QtCore import Qt
from PyQt5.QtWidgets import QMainWindow

from crawler import *

ui = uic.loadUiType('app.ui')[0]
class MainWindow(QMainWindow, ui):
    def __init__(self):
        super().__init__()
        self.setupUi(self)
        self.setWindowTitle('구글 날씨 검색기')
        self.setWindowIcon(QIcon('icon.png'))
        self.pushButton.clicked.connect(self.run)
        self.crawler = GoogleWeather()
        self.table_cols = ['검색한 시간', '지역명', '시간', '날씨']
        self.tableWidget.horizontalHeader().setStretchLastSection(True)

        # self.table_cols = ['지역명', '시간', '상태']
    
    def run(self):
        keyword = self.lineEdit.text()
        self.crawler.set_keyword(keyword + ' 날씨')
        self.crawler.run()
        r = self.crawler.get_result()
        self.set_table(r)

    def set_table(self, data):
        if data:
            row_idx = self.tableWidget.rowCount()
            self.tableWidget.insertRow(row_idx)

            col_idx = self.table_cols.index('검색한 시간')
            table_item = QtWidgets.QTableWidgetItem(data['search_time'])
            self.tableWidget.setItem(row_idx, col_idx, table_item)
            
            col_idx = self.table_cols.index('지역명')
            table_item = QtWidgets.QTableWidgetItem(data['loc'])
            self.tableWidget.setItem(row_idx, col_idx, table_item)
            
            col_idx = self.table_cols.index('시간')
            table_item = QtWidgets.QTableWidgetItem(data['time'])
            self.tableWidget.setItem(row_idx, col_idx, table_item)
            
            col_idx = self.table_cols.index('날씨')
            # col_idx = self.table_cols.index('상태')
            table_item = QtWidgets.QTableWidgetItem(data['status'])
            self.tableWidget.setItem(row_idx, col_idx, table_item)

            self.tableWidget.horizontalHeader().setStretchLastSection(False)
            self.tableWidget.resizeColumnsToContents()
            # self.tableWidget.resizeRowsToContents()
            self.tableWidget.horizontalHeader().setStretchLastSection(True)

            for col_idx in range(self.tableWidget.columnCount()):
                self.tableWidget.item(row_idx, col_idx).setTextAlignment(Qt.AlignCenter)

            self.statusbar.showMessage(f'{data["loc"]} 의 날씨 정보입니다.')

if __name__ == "__main__":
    app = QtWidgets.QApplication(sys.argv)
    main_window = MainWindow()
    main_window.show()
    app.exec_()