import sys
import os
import pyperclip
import ctypes
import pyautogui
import time
from PyQt5.QtWidgets import QApplication, QWidget, QVBoxLayout, QPushButton, QFileDialog, QLabel, QHBoxLayout
from PyQt5.QtWebEngineWidgets import QWebEngineView
from PyQt5.QtCore import QUrl, QSettings
from PyQt5.QtGui import QKeySequence
from PyQt5.QtWidgets import QShortcut, QSizePolicy
class HtmlViewer(QWidget):
def __init__(self):
super().__init__()
self.settings = QSettings("MyCompany", "HtmlViewer") # 설정 파일 관리를 위한 QSettings 인스턴스 생성
# 윈도우 제목 설정
self.setWindowTitle('Novel 8')
# 창의 크기를 가로 500, 세로 1080으로 설정
self.setFixedSize(500, 1080)
# FHD 해상도의 오른쪽에 붙도록 창의 위치를 조정 (x: 1920 - 500 = 1420, y: 0)
self.move(1420, 0)
# 전체 레이아웃 설정 (세로 방향)
self.layout = QVBoxLayout()
# 상단에 폴더 버튼과 파일 이름을 표시할 레이아웃 (가로 방향)
self.top_layout = QHBoxLayout()
# 폴더 버튼 추가
self.folder_button = QPushButton('폴더 선택', self)
self.folder_button.setFixedSize(150, 30) # 가로 150, 세로 30으로 버튼 크기 설정
self.folder_button.clicked.connect(self.select_folder)
self.top_layout.addWidget(self.folder_button)
# 파일 이름을 표시할 QLabel 추가
self.file_name_label = QLabel('파일 이름이 여기에 표시됩니다.', self)
self.top_layout.addWidget(self.file_name_label)
# 이전 파일 버튼 추가
self.prev_button = QPushButton('이전 파일', self)
self.prev_button.setFixedSize(80, 30)
self.prev_button.clicked.connect(self.prev_html) # 이전 파일 버튼 클릭 시 동작 설정
self.top_layout.addWidget(self.prev_button)
# 폴더 버튼과 파일 이름 부분의 배경 크기를 줄이기 위해 고정된 높이 설정
self.top_widget = QWidget()
self.top_widget.setFixedHeight(40) # 폴더 버튼과 파일 이름 부분의 전체 높이를 40픽셀로 설정
self.top_widget.setLayout(self.top_layout)
self.layout.addWidget(self.top_widget)
# 웹뷰 추가 (HTML 파일 표시)
self.browser = QWebEngineView()
# 웹뷰가 나머지 공간을 모두 차지하도록 설정
self.browser.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding)
self.layout.addWidget(self.browser)
# 파일 목록과 인덱스 변수 초기화
self.file_list = []
self.index = 0
# ESC 키에 대한 단축키 설정
self.shortcut = QShortcut(QKeySequence('Esc'), self)
self.shortcut.activated.connect(self.next_html)
self.setLayout(self.layout)
# 프로그램 시작 시 default folder 로드
self.load_default_folder()
def select_folder(self):
# 폴더 선택 대화상자 열기
folder_path = QFileDialog.getExistingDirectory(self, '폴더 선택', os.getenv('HOME'))
if folder_path:
self.settings.setValue("defaultFolder", folder_path) # 선택된 폴더 경로 저장
self.load_folder(folder_path)
def load_folder(self, folder_path):
# 폴더에서 HTML 파일 목록 가져오기
self.file_list = [f for f in os.listdir(folder_path) if f.endswith('.html')]
self.file_list = [os.path.join(folder_path, f) for f in self.file_list]
# 인덱스 초기화
self.index = 0
# 첫 번째 파일 열기
if self.file_list:
self.load_html(self.file_list[self.index])
def load_default_folder(self):
# 설정에서 저장된 default folder 경로 읽기
folder_path = self.settings.value("defaultFolder")
if folder_path:
self.load_folder(folder_path)
def load_html(self, file_path):
# 현재 파일 이름을 라벨에 표시
self.file_name_label.setText(os.path.basename(file_path))
# 페이지가 이미 로드된 상태에서 다시 호출되는 것을 방지
self.browser.page().loadFinished.disconnect()
# HTML 파일을 웹뷰에 로드
url = QUrl.fromLocalFile(file_path)
self.browser.setUrl(url)
# 페이지가 로드되면 전체 선택 및 클립보드 복사 수행
self.browser.page().loadFinished.connect(self.select_and_copy)
def select_and_copy(self):
# JavaScript로 웹 페이지의 모든 텍스트를 선택
select_all_js = """
document.execCommand('selectAll');
"""
# JavaScript 실행 후 클립보드에 복사
self.browser.page().runJavaScript(select_all_js, self.copy_to_clipboard)
def copy_to_clipboard(self, result):
# 선택된 텍스트를 가져와서 클립보드에 복사
self.browser.page().toPlainText(self.store_to_clipboard)
def store_to_clipboard(self, text):
# pyperclip을 사용하여 텍스트를 클립보드에 복사
if text:
pyperclip.copy(text)
print("Content copied to clipboard.")
# 복사 후 크롬에서 붙여넣기 작업 시작
self.perform_chrome_actions()
else:
print("No content selected.")
def clear_clipboard(self):
# 윈도우의 클립보드를 비우기 위해 ctypes 사용
ctypes.windll.user32.OpenClipboard(0)
ctypes.windll.user32.EmptyClipboard()
ctypes.windll.user32.CloseClipboard()
def perform_chrome_actions(self):
"""크롬 브라우저에서 지정된 작업 수행"""
time.sleep(1) # 시스템이 준비될 시간을 잠시 대기
# 작업 1: 크롬 브라우저로 이동 후 좌표에 클릭
pyautogui.moveTo(317, 992)
pyautogui.click()
time.sleep(0.5)
# 작업 2: Ctrl+V로 붙여넣기
pyautogui.hotkey('ctrl', 'v')
time.sleep(0.5)
# 작업 3: 좌표로 이동 후 클릭
time.sleep(0.5)
pyautogui.moveTo(1060, 992)
time.sleep(0.5)
pyautogui.click()
def next_html(self):
# 클립보드를 먼저 지움
self.clear_clipboard()
# 인덱스를 1 증가시켜 다음 파일 로드
if self.file_list:
self.index += 1
if self.index >= len(self.file_list):
self.index = 0 # 마지막 파일을 지나면 첫 번째 파일로 돌아감
self.load_html(self.file_list[self.index])
def prev_html(self):
# 클립보드를 먼저 지움
self.clear_clipboard()
# 인덱스를 1 감소시켜 이전 파일 로드
if self.file_list:
self.index -= 1
if self.index < 0:
self.index = len(self.file_list) - 1 # 첫 번째 파일을 지나면 마지막 파일로 돌아감
self.load_html(self.file_list[self.index])
# 애플리케이션 실행
if __name__ == '__main__':
app = QApplication(sys.argv)
viewer = HtmlViewer()
viewer.show()
sys.exit(app.exec_())
댓글 영역
획득법
① NFT 발행
작성한 게시물을 NFT로 발행하면 일주일 동안 사용할 수 있습니다. (최초 1회)
② NFT 구매
다른 이용자의 NFT를 구매하면 한 달 동안 사용할 수 있습니다. (구매 시마다 갱신)
사용법
디시콘에서지갑연결시 바로 사용 가능합니다.