이전에 pyqt로 생성한 GUI창의 크기를 변경하면 요소들이 잘리는 문제점이 있었다. 크기를 유동적으로 변경하기 위해 추가로 찾아보니 내가 작성한 코드는 "절대적 배치" 였다는 것.
절대적 배치
각 위젯의 위치와 크기를 픽셀 단위로 설정해 배치한다.
- 창의 크기를 조절해도 위젯의 크기와 위치는 변하지 않음
- 레이아웃을 바꾸고 싶다면 완전히 새로 고쳐야 함
아무튼.. 절대적 배치는 활용하기 굉장히 안 좋은 코드였다. 그래서 박스 레이아웃을 사용하여 다시 작성하였다.
위젯 배치에는 절대적 배치 이외에 박스와 그리드가 존재한다.
#### 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()
![]()
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_())
완성!

