디시인사이드 갤러리

마이너 갤러리 이슈박스, 최근방문 갤러리

갤러리 본문 영역

[free] 1206, flash 1.5를 위한 코드를 수정했습니다

몬발켜갤로그로 이동합니다. 2025.02.01 05:31:31
조회 22 추천 0 댓글 0



프로그램을 처음 만들면 미처 예상하지 못한 여러 가지 현상이 발생합니다. 

그래서 알파 테스트, 베타 테스트를 하게 됩니다. 

그러고도 출시하고 나면 또 미처 발견하지 못한 현상이 발생하고 보고됩니다. ㅠ ㅠ 

그래서 버그를 잡고, 코드를 수정하게 됩니다. 

같은 기능을 하는 프로그램인데, 왜 자꾸 코드를 수정하느냐 하면 바로 이런 이유 때문입니다. 


이번에 발견한 현상은 이렇습니다. 

사용자가 ESC 키를 누르면 다음 html 파일이 열리고, 

전체 선택+복사하기가 진행되어야 합니다. 

그런데 실제로는 이전 html 파일이 전체 선택+복사하기가 되는 것 같습니다. 

그래서 프로그램이 분명히 정상적으로 작동하는데도 불구하고  

다음 html 파일이 붙여넣기가 안 되는 현상입니다. 


chatGPT에게 이 현상을 설명하고 코드를 수정하도록 요구했습니다. 

작업 중간 중간에 시간 지연 코드를 추가하게 되었습니다. 


(추가 시작 2월2일)

코드를 수정해도 같은 현상이 종종 발생했습니다. 발생 빈도는 줄어들었지만요.

그래서 다시 검토를 해 봤습니다. 

복사+붙여넣기 작업이 끝나고, Run 버튼을 클릭한 후에 바로 클립보드의 데이터를 삭제하도록 코드를 수정했습니다. 

그랬더니 아직까지는 에러가 발생하지 않고 있네요... ^ ^

(추가 끝 2월2일) 



어느 새 아홉 번째 수정이군요...

그래서 프로그램 이름도 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_())



추천 비추천

0

고정닉 0

0

댓글 영역

전체 댓글 0
본문 보기

하단 갤러리 리스트 영역

왼쪽 컨텐츠 영역

갤러리 리스트 영역

갤러리 리스트
번호 말머리 제목 글쓴이 작성일 조회 추천
- 설문 현역으로 군대 안 간게 의아한 스타는? 운영자 25/06/30 - -
1 공지 프로그램 소스 코드의 공유/수정/판매 [2] 몬발켜갤로그로 이동합니다. 24.12.24 279 2
20 fre 빨간 공 파란 공 랜덤으로 그리는 프로그램 몬발켜갤로그로 이동합니다. 05.15 20 0
19 fre textmovie -자막만 있는 동영상 [2] 몬발켜갤로그로 이동합니다. 04.10 23 0
18 fre novel 9을 또 수정했습니다 몬발켜갤로그로 이동합니다. 02.27 17 0
17 fre html 파일 분할 (장 나누기) 몬발켜갤로그로 이동합니다. 02.21 25 0
16 fre 제미나이 복붙 novel 9을 또 수정했습니다 몬발켜갤로그로 이동합니다. 02.13 40 0
15 fre 제미나이 Flash 2.0을 위한 코드를 수정하였습니다 [4] 몬발켜갤로그로 이동합니다. 02.06 49 0
fre 1206, flash 1.5를 위한 코드를 수정했습니다 몬발켜갤로그로 이동합니다. 02.01 22 0
13 fre 누락된 파일명 찾아내기 몬발켜갤로그로 이동합니다. 01.31 12 0
12 fre 순서가 뒤죽박죽인 html 파일 이름 바꾸기 코드 몬발켜갤로그로 이동합니다. 01.31 27 0
11 fre 순서가 뒤죽박죽인 html 파일들 해결하기 몬발켜갤로그로 이동합니다. 01.30 27 0
10 fre 1206, Flash 1.5를 위한 코드를 또 수정했습니다 몬발켜갤로그로 이동합니다. 01.28 23 0
9 fre 1206 복붙 코드를 수정하였습니다 몬발켜갤로그로 이동합니다. 01.17 23 0
8 fre 1206을 위한 복붙 [2] 몬발켜갤로그로 이동합니다. 01.13 81 0
7 일반 이런갤도 있네 프갤러(223.38) 01.10 17 0
6 일반 북스캔 코드에 관한 설명을 추가합니다 몬발켜갤로그로 이동합니다. 01.09 56 0
5 fre 북스캔 book scan 몬발켜갤로그로 이동합니다. 01.07 213 1
4 fre 검색어로 폴더와 그 하위 폴더 안의 파일을 찾아주는 프로그램 몬발켜갤로그로 이동합니다. 24.12.24 127 0
3 fre 검색어로 폴더 안의 파일을 찾아주는 프로그램 [2] 몬발켜갤로그로 이동합니다. 24.12.24 188 0
2 fre 파일명이 (1)로 끝나는 파일만 찾아주는 프로그램 몬발켜갤로그로 이동합니다. 24.12.24 123 1
뉴스 신유, '열린음악회' 빛낸 명품 무대…대체 불가 '트롯 프린스' 존재감 디시트렌드 10:00
1
갤러리 내부 검색
제목+내용게시물 정렬 옵션

오른쪽 컨텐츠 영역

실시간 베스트

1/8

뉴스

디시미디어

디시이슈

1/2