183 lines
7.8 KiB
Python
183 lines
7.8 KiB
Python
import sys
|
|
from PyQt5.QtWidgets import QApplication, QMessageBox, QSizePolicy, QWidget, QVBoxLayout, QHBoxLayout, QLabel, QLineEdit, QPushButton, QTextEdit, QGridLayout
|
|
from PyQt5.QtGui import QPixmap
|
|
from PyQt5.QtCore import Qt, QByteArray, QBuffer, QIODevice
|
|
from web_scraper import WebScraper
|
|
|
|
class MainApp(QWidget):
|
|
def __init__(self):
|
|
super().__init__()
|
|
self.initUI()
|
|
self.scraper = WebScraper()
|
|
self.scraper.setup_browser()
|
|
|
|
|
|
def initUI(self):
|
|
# 검색 레이아웃
|
|
searchLayout = QHBoxLayout()
|
|
self.searchLabel = QLabel('검색어 입력:', self)
|
|
self.searchLineEdit = QLineEdit(self)
|
|
self.searchLineEdit.returnPressed.connect(self.start_search)
|
|
self.searchButton = QPushButton('검색 실행', self)
|
|
self.searchButton.clicked.connect(self.start_search)
|
|
|
|
searchLayout.addWidget(self.searchLabel)
|
|
searchLayout.addWidget(self.searchLineEdit)
|
|
searchLayout.addWidget(self.searchButton)
|
|
|
|
# 로그 레이아웃
|
|
logLayout = QVBoxLayout()
|
|
self.logTextEdit = QTextEdit(self)
|
|
self.logTextEdit.setReadOnly(True)
|
|
|
|
logLayout.addWidget(self.logTextEdit)
|
|
|
|
# 메인 레이아웃
|
|
mainLayout = QVBoxLayout()
|
|
mainLayout.addLayout(searchLayout)
|
|
mainLayout.addLayout(logLayout)
|
|
|
|
self.setLayout(mainLayout)
|
|
self.setWindowTitle('Web Scraper')
|
|
self.setGeometry(300, 300, 300, 400)
|
|
|
|
def wrap_text(self, text, width=40):
|
|
"""주어진 너비에 맞게 텍스트를 줄바꿈합니다."""
|
|
words = text.split()
|
|
wrapped_text = ''
|
|
line_length = 0
|
|
|
|
for word in words:
|
|
if line_length + len(word) + 1 > width:
|
|
wrapped_text += '\n'
|
|
line_length = 0
|
|
wrapped_text += word + ' '
|
|
line_length += len(word) + 1
|
|
|
|
return wrapped_text.strip()
|
|
|
|
def start_search(self):
|
|
term = self.searchLineEdit.text()
|
|
if not term:
|
|
self.logTextEdit.append("검색어를 입력해주세요.")
|
|
return
|
|
|
|
self.logTextEdit.append("검색을 시작합니다...")
|
|
results = self.scraper.search_for_term(term)
|
|
if results:
|
|
self.logTextEdit.append("검색 완료. 결과를 처리합니다...")
|
|
self.show_results(results)
|
|
else:
|
|
self.logTextEdit.append("검색 결과가 없거나 오류가 발생했습니다.")
|
|
QMessageBox.information(self, "검색 결과 없음", "검색 결과가 없으므로 지재권에 안심하시면 됩니다.", QMessageBox.Ok)
|
|
|
|
|
|
def show_results(self, results):
|
|
|
|
try:
|
|
# 결과 위젯 생성
|
|
self.results_widget = QWidget()
|
|
layout = QVBoxLayout()
|
|
self.results_widget.setLayout(layout)
|
|
|
|
# 결과 갯수 확인 및 레이아웃 동적 생성
|
|
total_count = int(results['total_count'])
|
|
set_count = min(total_count, 10)
|
|
grid_layout = QGridLayout()
|
|
layout.addLayout(grid_layout)
|
|
grid_index = 0
|
|
grid_columns = 5
|
|
|
|
for i in range(1, set_count + 1):
|
|
result_key = f"result_{i}"
|
|
if result_key in results:
|
|
result = results[result_key]
|
|
|
|
# 테두리 설정
|
|
border_style = ''
|
|
if result['admin_status'] == '등록':
|
|
border_style = 'border: 4px solid red;'
|
|
elif result['admin_status'] == '공고':
|
|
border_style = 'border: 3px solid black;'
|
|
|
|
# 각 결과에 대한 레이아웃 생성
|
|
item_layout = QVBoxLayout()
|
|
item_widget = QWidget() # 위젯 생성
|
|
|
|
# item_layout의 크기 정책 설정
|
|
item_widget.setSizePolicy(QSizePolicy.Fixed, QSizePolicy.MinimumExpanding)
|
|
|
|
# 이미지 처리
|
|
image_label = QLabel()
|
|
image_label.setFixedSize(150, 150)
|
|
image_data = self.scraper.fetch_image_data(result['IDimageURL'])
|
|
pixmap = QPixmap()
|
|
pixmap.loadFromData(image_data)
|
|
# QLabel의 크기에 맞게 이미지 크기 조정
|
|
scaled_pixmap = pixmap.scaled(image_label.size(), Qt.KeepAspectRatio, Qt.SmoothTransformation)
|
|
image_label.setPixmap(scaled_pixmap)
|
|
# QLabel의 가로 세로 중앙에 이미지 표시
|
|
image_label.setAlignment(Qt.AlignCenter)
|
|
# 이미지 표시 위젯의 크기 조정 정책 설정
|
|
image_label.setScaledContents(True)
|
|
|
|
#이미지 중앙배치를 위해
|
|
horizontal_layout = QHBoxLayout()
|
|
horizontal_layout.addWidget(image_label)
|
|
horizontal_layout.setAlignment(Qt.AlignCenter)
|
|
item_layout.addLayout(horizontal_layout)
|
|
|
|
# item_layout.addWidget(image_label)
|
|
|
|
# 정보 텍스트
|
|
# info_text = f"상표권명: {result['title']}\n등록상태: {result['admin_status']}\nCategory: {result['product_category']}\nApplicant: {result['applicant']}\nPublication Date: {result['publication_date']}\nRegistration Date: {result['registration_date']}"
|
|
info_text = f"<span style='font-size: 11pt; font-weight: bold; text-decoration: underline;'>상표권명: {result['title']}</span><br>\n" \
|
|
f"<span style='font-size: 11pt; font-weight: bold; text-decoration: underline;'>등록상태: {result['admin_status']}</span><br>\n" \
|
|
f"<span style='font-size: 9pt;'>카테고리: {result['product_category']}</span><br>\n" \
|
|
f"<span style='font-size: 9pt;'>권리자: {result['applicant']}</span><br>\n" \
|
|
f"<span style='font-size: 9pt;'> {result['publication_date']}</span><br>\n" \
|
|
f"<span style='font-size: 9pt;'> {result['registration_date']}</span>"
|
|
|
|
info_label = QLabel(info_text)
|
|
info_label.setToolTip(self.wrap_text(result['category_description'], 50))
|
|
image_label.setToolTip(self.wrap_text(result['category_description'], 50))
|
|
item_layout.addWidget(info_label)
|
|
|
|
image_label.setStyleSheet(border_style)
|
|
info_label.setStyleSheet(border_style)
|
|
|
|
# 레이아웃에 위젯 추가
|
|
row = grid_index // grid_columns
|
|
col = grid_index % grid_columns
|
|
grid_layout.addLayout(item_layout, row, col)
|
|
grid_index += 1
|
|
|
|
# 결과 위젯에 닫기 버튼 추가
|
|
close_button = QPushButton("Close")
|
|
close_button.clicked.connect(self.close_results_widget)
|
|
layout.addWidget(close_button)
|
|
|
|
# 결과 위젯을 메인 윈도우에 추가
|
|
self.results_widget.setGeometry(300, 300, 600, 300) # 위치와 크기 설정
|
|
self.results_widget.setWindowTitle('Search Results') # 타이틀 설정
|
|
self.results_widget.show()
|
|
|
|
except Exception as e:
|
|
print(f"Error displaying results: {e}")
|
|
|
|
|
|
def close_results_widget(self):
|
|
# 결과 위젯닫기 함수를 호출할 때 사용하는 메서드
|
|
self.results_widget.close()
|
|
|
|
|
|
def closeEvent(self, event):
|
|
self.scraper.close_browser()
|
|
event.accept()
|
|
|
|
if __name__ == '__main__':
|
|
app = QApplication(sys.argv)
|
|
ex = MainApp()
|
|
ex.show()
|
|
sys.exit(app.exec_())
|