Pyqt5 와 크롤러(2)

newin·2022년 11월 14일

개발

목록 보기
2/4

이전에 pyqt로 생성한 GUI창의 크기를 변경하면 요소들이 잘리는 문제점이 있었다. 크기를 유동적으로 변경하기 위해 추가로 찾아보니 내가 작성한 코드는 "절대적 배치" 였다는 것.

절대적 배치

각 위젯의 위치와 크기를 픽셀 단위로 설정해 배치한다.

  • 창의 크기를 조절해도 위젯의 크기와 위치는 변하지 않음
  • 레이아웃을 바꾸고 싶다면 완전히 새로 고쳐야 함

아무튼.. 절대적 배치는 활용하기 굉장히 안 좋은 코드였다. 그래서 박스 레이아웃을 사용하여 다시 작성하였다.

위젯 배치에는 절대적 배치 이외에 박스와 그리드가 존재한다.

박스 레이아웃

  • QHBoxLayout, QVBoxLayout은 여러 위젯을 수평으로 정렬하는 레아이웃
  • 수평, 수직의 박스를 만드는데, 다른 레이아웃 박스를 넣을 수도 있고 위젯을 배치할 수도 있음

그리드 레이아웃

  • 말 그대로 격자형태로 위젯을 쪼개 나타내는 것
  • 위젯의 공간을 행(row)과 열(column)으로 구분한다.

#### Box Layout를 사용한 수정 코드

import sys
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
import Crawler
import time

class craw(QWidget):
    
    def __init__(self):
        super().__init__()
        self.setupUI()

    def setupUI(self):
        self.setWindowTitle('Crawler 프로그램') 
        #main Layout 생성
        main_layout = QVBoxLayout()

        #레이아웃 정의
        layout_input = QFormLayout() #url을 입력하는부분
        layout_gettext = QHBoxLayout()
        layout_quit = QHBoxLayout()
    
        #URL 입력을 위한 LineEdit 위젯을 생성
        text_labelA = QLabel("URL을 입력") #그냥 text부분
        self.labelA = QLineEdit("")


        #layout_intput 레이아웃에 입력 위젯을 추가 
        layout_input.addRow(text_labelA, self.labelA)


        # url입력과 나가기 버튼을 생성
        button_get = QPushButton("Get result.txt")
        button_quit = QPushButton("Quit")

        #버튼 클릭 시 행위 추가
        button_get.clicked.connect(self.button_event)
        button_quit.clicked.connect(self.button_end)

        #버튼을 생성된 레이아웃에 추가
        layout_gettext.addWidget(button_get)
        layout_quit.addWidget(button_quit)

        #각 레이아웃을 main 레이아웃에 추가
        main_layout.addLayout(layout_input)
        main_layout.addLayout(layout_gettext)
        main_layout.addLayout(layout_quit)

        self.setLayout(main_layout)
        self.show()

    def button_end(self):
        QCoreApplication.instance().quit() 

    # Get Text 버튼 행위 정의
    def button_event(self):
        text = self.line_edit.text()
        try:
            Crawler.parser(text) #크롤러 모듈을 통해 크롤링 수행
            text = "make result.txt"
            self.text_label.setText(text)
            self.text_label.adjustSize()
        except:
            text = "Error!"
            self.text_label.setText(text)

    #화면 중앙에 오도록 설정
    def center(self):
        qr = self.frameGeometry()
        cp = QDesktopWidget().availableGeometry().center() 
        qr.moveCenter(cp)
        self.move(qr.topLeft()) 

if __name__ == '__main__':
    app = QApplication(sys.argv)
    ex = craw()
    sys.exit(app.exec_())

참고

main_layout = QHBoxLayout()

main_layout = QVBoxLayout()

2022-11-15 수정

  • button_event 부분에서 수정이 덜 되어 변경된 변수에 맞게 수정
  • 결과 출력 부분 QLabel로 변경
  • 크기 변경 유동적이도록 사이즈 정책 변경 class 추가

Crawler_GUI.py

import sys
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
import Crawler

## 사이즈 정책에 대한 새로운 class 생성
class QPushButton(QPushButton):
    def __init__(self, parent=None):
        super().__init__(parent)
        self.setSizePolicy(QSizePolicy.Expanding,QSizePolicy.Expanding)
class QLabel(QLabel):
    def __init__(self, parent=None):
        super().__init__(parent)
        self.setSizePolicy(QSizePolicy.Expanding,QSizePolicy.Expanding)
class QLineEdit(QLineEdit):
    def __init__(self, parent=None):
        super().__init__(parent)
        self.setSizePolicy(QSizePolicy.Expanding,QSizePolicy.Expanding)
        
class craw(QWidget):
    def __init__(self):
        super().__init__()
        self.setupUI()

    def setupUI(self):
        self.setWindowTitle('Crawler 프로그램') 
        #main Layout 생성
        main_layout = QVBoxLayout()

        #레이아웃 정의
        layout_input = QFormLayout() #url을 입력하는부분
        layout_output = QFormLayout() #결과가 출력될 부분 
        layout_gettext = QHBoxLayout()
        layout_quit = QHBoxLayout()
    
        #URL 입력을 위한 LineEdit 위젯을 생성
        text_labelA = QLabel("URL을 입력")
        self.labelA = QLineEdit("")
        text_labelB = QLabel("결과 : ")
        self.labelB = QLabel("")


        #layout_intput 레이아웃에 입력 위젯을 추가 
        layout_input.addRow(text_labelA, self.labelA)
        layout_output.addRow(text_labelB, self.labelB)

        # url입력과 나가기 버튼을 생성
        button_get = QPushButton("Get result.txt")
        button_quit = QPushButton("Quit")


        #버튼 클릭 시 행위 추가
        button_get.clicked.connect(self.button_event)
        button_quit.clicked.connect(self.button_end)

        #버튼을 생성된 레이아웃에 추가
        layout_gettext.addWidget(button_get)
        layout_quit.addWidget(button_quit)

        #각 레이아웃을 main 레이아웃에 추가
        main_layout.addLayout(layout_input)
        main_layout.addLayout(layout_output)
        main_layout.addLayout(layout_gettext)
        main_layout.addLayout(layout_quit)

        self.setLayout(main_layout)
        self.show()
    
    def button_end(self):
        QCoreApplication.instance().quit() 
    
    # Get Text 버튼 행위 정의
    def button_event(self):
        URL = self.labelA.text() # labelA로 입력된 데이터 가져오기 
        try:
            self.labelB.setText(text)
            Crawler.parser(URL) #크롤러 모듈을 통해 크롤링 수행
            text = "Success make result.txt !"
            self.labelB.setText(text) 
        except:
            text = "Error!"
            self.labelB.setText(text)


    #화면 중앙에 오도록하는것
    def center(self):
        qr = self.frameGeometry()
        cp = QDesktopWidget().availableGeometry().center() 
        qr.moveCenter(cp)
        self.move(qr.topLeft()) 


if __name__ == '__main__':
    app = QApplication(sys.argv)
    ex = craw()
    sys.exit(app.exec_())

참고

완성!

profile
개발

0개의 댓글