autoTrans/gui.py

266 lines
11 KiB
Python

from PyQt5.QtWidgets import QWidget, QPushButton, QVBoxLayout, QTextEdit, QLabel, QLineEdit, QHBoxLayout
from PyQt5.QtCore import Qt, QRect, QSettings
from toggleSwitch import ToggleSwitch
from browser_control import BrowserController
from whale_translator import WhaleTranslator
from base64_to_image import base64TOImage
class TranslationApp(QWidget):
def __init__(self, logger=None):
super().__init__()
self.initUI()
self.logger = logger
self.settings = QSettings("WhenRideMycar", "TranslationApp") # QSettings 초기화
self.browser_controller = BrowserController(self, self.logger)
self.whale_translator = WhaleTranslator(self, self.logger, debug_mode=True) # 디버그 모드 켜기
self.base64TOImage = base64TOImage(self, logger, self.browser_controller)
self.running = False
# 이전에 저장된 설정 불러오기
self.load_settings()
def initUI(self):
self.setWindowFlags(Qt.WindowStaysOnTopHint)
self.setGeometry(QRect(1740, 500, 180, 400))
self.setWindowTitle('이미지 번역 도구')
# 로그
self.log = QTextEdit(self)
self.log.setReadOnly(True)
# 관리자 토글
self.admin_toggle = ToggleSwitch(self)
self.admin_toggle.clicked.connect(self.on_toggle_clicked)
# 관리자 ID 및 PW
self.admin_id_label = QLabel("관리자 ID:", self)
self.admin_id_input = QLineEdit(self)
self.admin_pw_label = QLabel("관리자 PW:", self)
self.admin_pw_input = QLineEdit(self)
self.admin_pw_input.setEchoMode(QLineEdit.Password)
# 직원 ID 및 PW
self.user_id_label = QLabel("직원 ID:", self)
self.user_id_input = QLineEdit(self)
self.user_pw_label = QLabel("직원 PW:", self)
self.user_pw_input = QLineEdit(self)
self.user_pw_input.setEchoMode(QLineEdit.Password)
# 크롬 실행 버튼 및 번역 버튼
self.start_chrome_button = QPushButton('크롬 실행', self)
self.translate_button = QPushButton('번역 시작', self)
self.pause_button = QPushButton('일시정지', self)
self.exit_button = QPushButton('종료', self)
# 레이아웃 설정
layout = QVBoxLayout()
# 관리자 토글 버튼 및 로그인 관련 필드 추가
toggle_layout = QHBoxLayout()
toggle_layout.addWidget(QLabel("관리자 여부:", self))
toggle_layout.addWidget(self.admin_toggle)
layout.addLayout(toggle_layout)
# 관리자 ID/PW
layout.addWidget(self.admin_id_label)
layout.addWidget(self.admin_id_input)
layout.addWidget(self.admin_pw_label)
layout.addWidget(self.admin_pw_input)
# 직원 ID/PW
layout.addWidget(self.user_id_label)
layout.addWidget(self.user_id_input)
layout.addWidget(self.user_pw_label)
layout.addWidget(self.user_pw_input)
# 크롬 및 번역 관련 버튼
layout.addWidget(self.start_chrome_button)
layout.addWidget(self.translate_button)
layout.addWidget(self.pause_button)
layout.addWidget(self.exit_button)
self.setLayout(layout)
layout.addWidget(self.log)
# 기본 상태 설정
self.on_toggle_clicked(False)
# 버튼 이벤트 연결
self.start_chrome_button.clicked.connect(self.start_browser)
self.translate_button.clicked.connect(self.start_translation)
self.pause_button.clicked.connect(self.pause_translation)
self.exit_button.clicked.connect(self.close)
def on_toggle_clicked(self, is_checked):
"""관리자 토글 상태에 따라 필드 활성화/비활성화"""
if is_checked:
# 관리자 모드
# self.admin_id_label.setVisible(True)
# self.admin_id_input.setVisible(True)
self.admin_pw_label.setVisible(True)
self.admin_pw_input.setVisible(True)
self.user_id_label.setVisible(False)
self.user_id_input.setVisible(False)
self.user_pw_label.setVisible(False)
self.user_pw_input.setVisible(False)
else:
# 직원 모드
# self.admin_id_label.setVisible(False)
# self.admin_id_input.setVisible(False)
self.admin_pw_label.setVisible(False)
self.admin_pw_input.setVisible(False)
self.user_id_label.setVisible(True)
self.user_id_input.setVisible(True)
self.user_pw_label.setVisible(True)
self.user_pw_input.setVisible(True)
def start_browser(self):
"""크롬 브라우저 실행 후 로그인"""
self.logger.debug('크롬 브라우저를 실행합니다...')
self.browser_controller.start_browser()
# 관리자 토글 상태에 따라 로그인
if self.admin_toggle.isChecked():
admin_id = self.admin_id_input.text()
admin_pw = self.admin_pw_input.text()
user_id = self.user_id_input.text()
user_pw = self.user_pw_input.text()
self.browser_controller.login(admin_id, user_id, admin_pw, user_pw, is_admin=True)
else:
admin_id = self.admin_id_input.text()
admin_pw = self.admin_pw_input.text()
user_id = self.user_id_input.text()
user_pw = self.user_pw_input.text()
self.browser_controller.login(admin_id, user_id, admin_pw, user_pw, is_admin=False)
# 로그인 정보 저장
self.save_settings()
def save_settings(self):
"""QSettings에 사용자 정보 저장"""
self.settings.setValue("admin/id", self.admin_id_input.text())
self.settings.setValue("admin/pw", self.admin_pw_input.text())
self.settings.setValue("user/id", self.user_id_input.text())
self.settings.setValue("user/pw", self.user_pw_input.text())
self.settings.setValue("admin/toggle", self.admin_toggle.isChecked())
def load_settings(self):
"""QSettings에서 사용자 정보 불러오기"""
self.admin_id_input.setText(self.settings.value("admin/id", ""))
self.admin_pw_input.setText(self.settings.value("admin/pw", ""))
self.user_id_input.setText(self.settings.value("user/id", ""))
self.user_pw_input.setText(self.settings.value("user/pw", ""))
admin_toggle_state = self.settings.value("admin/toggle", "false") == "true"
self.admin_toggle.setChecked(admin_toggle_state)
self.on_toggle_clicked(admin_toggle_state)
def start_translation(self):
self.logger.debug('번역 작업을 시작합니다...')
self.running = True # 번역 작업이 시작됨
try:
# # 1. 광고 다이얼로그가 나타날 경우 닫기 처리
# self.logger.debug('광고 다이얼로그 닫기 처리 중...')
# self.browser_controller.close_ad_dialog_if_present()
# 2. "신규 상품 등록" 페이지로 이동
self.logger.debug('신규 상품 등록 페이지로 이동 중...')
self.browser_controller.go_to_new_product_page()
# # Playwright에서 페이지 스크롤 후 "세부사항 수정 및 업로드" 버튼 수집
# self.browser_controller.scroll_page_to_bottom()
# 3. 각 상품에 대해 "세부사항 수정 및 업로드" 작업을 수행
page_number = 1
while self.running:
self.logger.debug(f'현재 페이지: {page_number}')
# 4. 현재 페이지의 모든 "세부사항 수정 및 업로드" 버튼 찾기
product_buttons = self.browser_controller.get_product_edit_buttons()
if not product_buttons:
self.logger.debug('수정할 상품이 없습니다. 번역 작업을 종료합니다.')
break
# 5. 각 상품에 대해 번역 작업 수행
for index, button in enumerate(product_buttons, start=1):
if not self.running:
self.logger.debug('번역 작업이 중단되었습니다.')
break
self.logger.debug(f'{index}/{len(product_buttons)}: 세부사항 수정 작업 중...')
# 상품 수정 다이얼로그 열기
self.browser_controller.open_product_edit_dialog(button)
# 상세페이지 탭 클릭
self.browser_controller.click_detail_tab()
# 이미지 URL 추출
image_urls = self.browser_controller.extract_image_urls()
# 이미지 번역 작업 진행
for url in image_urls:
if not self.running:
self.logger.debug('번역 작업이 중단되었습니다.')
break
self.whale_translator.translate_image(url)
self.browser_controller.paste_image_in_chrome(self.base64TOImage, url)
# 수정 후 저장
self.logger.debug('상품 세부사항 저장 중...')
self.browser_controller.save_product_edit()
self.logger.debug('상품 수정 완료.')
# 6. 다음 페이지로 이동 (있으면)
if not self.browser_controller.go_to_next_page():
self.logger.debug('더 이상 페이지가 없습니다. 작업을 종료합니다.')
break
page_number += 1
if self.running:
self.logger.debug('모든 상품 번역 및 저장 완료.')
self.running = False # 작업 종료 후 상태를 False로 전환
except Exception as e:
self.logger.debug(f'번역 작업 중 오류 발생: {str(e)}')
self.running = False
def start_translation_by_one(self):
self.logger.debug('번역 작업을 시작합니다...')
self.running = True # 번역 작업이 시작됨
# Playwright에서 이미지 URL 추출
image_urls = self.browser_controller.extract_image_urls()
# 추출된 URL을 WhaleTranslator에 전달하여 번역 진행
for url in image_urls:
if not self.running: # 작업이 중단되었는지 확인
self.logger.debug('번역 작업이 중단되었습니다.')
break
self.whale_translator.translate_image(url)
# 번역 후 크롬으로 포커스를 옮기고 이미지를 붙여넣기
self.browser_controller.paste_image_in_chrome(self.base64TOImage)
page = BrowserController.get_page()
page.click('button:has-text("저장하기")') # 모든 이미지 번역 완료 후 저장하기 클릭
if self.running:
self.logger.debug('모든 이미지 번역 및 붙여넣기 완료.')
self.running = False # 작업 종료 후 상태를 False로 전환
def pause_translation(self):
self.logger.debug('번역 작업을 중단합니다...')
self.running = False # 번역 작업 중단
def close(self):
self.logger.debug('프로그램을 종료합니다...')
self.save_settings()
self.browser_controller.close_browser() # 브라우저 종료
self.whale_translator.close_all_virtual_desktops()
super().close()