그러고도 출시하고 나면 또 미처 발견하지 못한 현상이 발생하고 보고됩니다. ㅠ ㅠ
코드를 수정해도 같은 현상이 종종 발생했습니다. 발생 빈도는 줄어들었지만요.
그랬더니 아직까지는 에러가 발생하지 않고 있네요... ^ ^
어느 새 아홉 번째 수정이군요...
그래서 프로그램 이름도 novel9입니다. ^ ^
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('Novel9')
# 창의 크기를 가로 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)
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)
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):
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):
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))
try:
self.browser.page().loadFinished.disconnect()
except TypeError:
pass
url = QUrl.fromLocalFile(file_path)
self.browser.setUrl(url)
self.browser.page().loadFinished.connect(self.select_and_copy)
def select_and_copy(self, load_ok):
if load_ok:
select_all_js = "document.execCommand('selectAll');"
self.browser.page().runJavaScript(select_all_js, self.copy_to_clipboard)
else:
print("Page failed to load.")
def copy_to_clipboard(self, result):
self.browser.page().toPlainText(self.store_to_clipboard)
def store_to_clipboard(self, text):
if text:
pyperclip.copy(text)
print("Content copied to clipboard.")
self.perform_chrome_actions()
else:
print("No content selected.")
def clear_clipboard(self):
ctypes.windll.user32.OpenClipboard(0)
ctypes.windll.user32.EmptyClipboard()
ctypes.windll.user32.CloseClipboard()
def perform_chrome_actions(self):
time.sleep(1)
pyautogui.moveTo(317, 992)
pyautogui.click()
time.sleep(0.5)
pyautogui.hotkey('ctrl', 'v')
time.sleep(0.5)
pyautogui.moveTo(1060, 992)
pyautogui.click()
# 클립보드를 클리어하는 작업을 마지막에 추가
self.clear_clipboard()
def next_html(self):
# 클립보드를 먼저 지우고 0.5초 대기
self.clear_clipboard()
time.sleep(0.5)
# 인덱스를 1 증가시켜 다음 파일 로드
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):
# 클립보드를 먼저 지우고 0.5을 대기
self.clear_clipboard()
time.sleep(0.5)
# 인덱스를 1 감소시켜 이전 파일 로드
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를 구매하면 한 달 동안 사용할 수 있습니다. (구매 시마다 갱신)
사용법
디시콘에서지갑연결시 바로 사용 가능합니다.