That's the same solution that didn't work. Here is the Gigapixel module code. if that helps? import os
from enum import Enum
from typing import Optional
from pathlib import Path

from .logging import log, Level
from .exceptions import NotFile, FileAlreadyExists, ElementNotFound

from pywinauto import ElementNotFoundError
import clipboard
from loguru import logger
from pywinauto.application import Application, ProcessNotFoundError
from pywinauto.keyboard import send\_keys
class Scale(Enum):
 X05 = "0.5x"
 X2 = "2x"
 X4 = "4x"
 X6 = "6x"
class Mode(Enum):
 STANDARD = "Standard"
 Lines = "Lines"
 ART\_AND\_CG = "Art & CG"
 LOW\_RESOLUTION = "Low Resolution"
 VERY\_COMPRESSED = "Very Compressed"
class Gigapixel:
 def \_\_init\_\_(self,
 executable\_path: Path,
 output\_suffix: str):
 self.\_executable\_path = executable\_path
 self.\_output\_suffix = output\_suffix

 instance = self.\_get\_gigapixel\_instance()
 self.\_app = self.App(instance)

 class App:
 def \_\_init\_\_(self, app: Application):
 self.\_app = app
 self.\_main\_window = self.\_app.window()

 self.scale: Optional[Scale] = None
 self.mode: Optional[Mode] = None

 @log("Opening photo: {}", "Photo opened", format=(1,), level=Level.DEBUG)
 def open\_photo(self, photo\_path: Path) -> None:
 while photo\_path.name not in self.\_main\_window.element\_info.name:
 logger.debug("Trying to open photo")
 self.\_main\_window.set\_focus()
 send\_keys('{ESC}^o')
 clipboard.copy(str(photo\_path))
 send\_keys('^v {ENTER}')

 @log("Saving photo", "Photo saved", level=Level.DEBUG)
 def save\_photo(self) -> None:
 send\_keys('^S {ENTER}')
 self.\_main\_window.child\_window(title="Cancel Processing", control\_type="Button").wait\_not('visible',
 timeout=60)

 @log("Setting processing options", "Processing options set", level=Level.DEBUG)
 def set\_processing\_options(self, scale: Optional[Scale] = None, mode: Optional[Mode] = None) -> None:
 if scale:
 self.\_set\_scale(scale)
 if mode:
 self.\_set\_mode(mode)

 def \_set\_scale(self, scale: Scale):
 if self.scale == scale:
 return

 try:
 self.\_main\_window.child\_window(title=scale.value).click\_input()
 except ElementNotFoundError:
 raise ElementNotFound(f"Scale button {scale.value} not found")
 self.scale = scale
 logger.debug(f"Scale set to {scale.value}")

 def \_set\_mode(self, mode: Mode) -> None:
 if self.mode == mode:
 return

 try:
 self.\_main\_window.child\_window(title=mode.value).click\_input()
 except ElementNotFoundError:
 raise ElementNotFound(f"Mode button {mode.value} not found")
 self.mode = mode
 logger.debug(f"Mode set to {mode.value}")

 def \_print\_elements(self):
 self.\_main\_window.print\_control\_identifiers()

 @log(start="Getting Gigapixel instance...")
 @log(end="Got Gigapixel instance: {}", format=(-1,), level=Level.SUCCESS)
 def \_get\_gigapixel\_instance(self) -> Application:
 try:
 instance = Application(backend="uia").connect(path=self.\_executable\_path)
 return instance
 except ProcessNotFoundError:
 logger.debug("Gigapixel instance not found.")
 instance = self.\_open\_topaz()
 return instance

 @log("Starting new Gigapixel instance...", "Started new Gigapixel instance: {}", format=(-1,), level=Level.DEBUG)
 def \_open\_topaz(self) -> Application:
 instance = Application(backend="uia").start(str(self.\_executable\_path)).connect(path=self.\_executable\_path)
 return instance

 @log("Checking path: {}", "Path is valid", format=(1,), level=Level.DEBUG)
 def \_check\_path(self, path: Path) -> None:
 if not path.is\_file():
 raise NotFile(f"Path is not a file: {path}")

 save\_path = self.\_get\_save\_path(path)
 if save\_path.name in os.listdir(path.parent):
 raise FileAlreadyExists(f"Output file already exists: {save\_path}")

 @staticmethod
 def \_remove\_suffix(input\_string: str, suffix: str) -> str:
 if suffix and input\_string.endswith(suffix):
 return input\_string[:-len(suffix)]
 return input\_string

 def \_get\_save\_path(self, path: Path) -> Path:
 return path.parent / (Gigapixel.\_remove\_suffix(path.name, path.suffix) + self.\_output\_suffix + path.suffix)

 @log(start="Starting processing: {}", format=(1,))
 @log(end="Finished processing: {}", format=(1,), level=Level.SUCCESS)
 def process(self, photo\_path: Path, scale: Scale = Scale.X2, mode: Mode = Mode.STANDARD) -> Path:
 self.\_check\_path(photo\_path)

 self.\_app.open\_photo(photo\_path)
 self.\_app.set\_processing\_options(scale, mode)
 self.\_app.save\_photo()

 return self.\_get\_save\_path(photo\_path)
그것은 작동하지 않은 것과 동일한 솔루션입니다. 기가픽셀 모듈 코드는 다음과 같습니다. 도움이 되시나요?열거형에서 열거형 가져 오기에서 가져 오기 옵션from pathlib import Path.logging에서 로그, Level.exceptions에서 NotFile, FileAlreadyExists, ElementNotFound를 임포트합니다.pywinauto에서 ElementNotFoundError를 임포트합니다.클립보드 가져오기loguru에서 logger를 가져옵니다.pywinauto.application에서 Application, ProcessNotFoundError를 임포트합니다.pywinauto.keyboard에서 send\_keys를 가져옵니다.Scale(Enum) 클래스: X05 = "0.5배" X2 = "2배" X4 = "4x" X6 = "6배"모드(열거형) 클래스: STANDARD = "표준" Lines = "라인" ART\_AND\_CG = "아트 및 CG" LOW\_RESOLUTION = "저해상도" VERY\_COMPRESSED = "매우 압축"클래스 기가픽셀: def \_\_init\_\_(self, EXECUTABLE\_PATH: Path, 출력\_접미사: str): self.\_executable\_path = 실행 파일\_경로 self.\_output\_suffix = output\_suffix instance = self.\_get\_gigapixel\_instance() self.\_app = self.App(instance) 클래스 App: def \_\_init\_\_(self, app: Application): self.\_app = app self.\_main\_window = self.\_app.window() self.scale: Optional[Scale] = None self.mode: Optional[Mode] = None log("사진 열기: {}", "사진 열렸습니다", format=(1,), level=Level.DEBUG) def open\_photo(self, photo\_path: 경로) -> None: 사진\_경로 이름이 self.\_main\_window.element\_info.name에 없는 동안: logger.debug("사진을 열려고 합니다") self.\_main\_window.set\_focus() send\_keys('{ESC}^o') clipboard.copy(str(사진\_경로)) send\_keys('^v {ENTER}') log("사진 저장 중", "사진 저장됨", level=Level.DEBUG) def save\_photo(self) -> None: send\_keys('^S {ENTER}') self.\_main\_window.child\_window(title="처리 취소", control\_type="Button").wait\_not('visible', timeout=60) log("처리 옵션 설정", "처리 옵션 설정", level=Level.DEBUG) def set\_processing\_options(self, scale: Optional[Scale] = None, mode: Optional[Mode] = None) -> None: if scale: self.\_set\_scale(scale) if mode: self.\_set\_mode(mode) def \_set\_scale(self, scale: Scale): if self.scale == scale: 반환 try: self.\_main\_window.child\_window(title=scale.value).click\_input() 엘리먼트를 찾을 수 없음 에러를 제외합니다: raise ElementNotFound(f"스케일 버튼 {scale.value}을 찾을 수 없습니다") self.scale = scale logger.debug(f"{scale.value}로 스케일 설정") def \_set\_mode(self, mode: Mode) -> None: if self.mode == mode: return try: self.\_main\_window.child\_window(title=mode.value).click\_input() 엘리먼트를 찾을 수 없음 에러를 제외합니다: raise ElementNotFound(f"모드 버튼 {mode.value}를 찾을 수 없습니다") self.mode = mode logger.debug(f"모드가 {mode.value}로 설정됨") def \_print\_elements(self): self.\_main\_window.print\_control\_identifiers() @log(start="기가픽셀 인스턴스 가져오는 중...") log(end="기가픽셀 인스턴스를 가져왔습니다: {}", format=(-1,), level=Level.SUCCESS) def \_get\_gigapixel\_instance(self) -> Application: try: instance = Application(backend="uia").connect(path=self.\_executable\_path) 반환 인스턴스 ProcessNotFoundError를 제외하고: logger.debug("기가픽셀 인스턴스를 찾을 수 없습니다.") instance = self.\_open\_topaz() 인스턴스 반환 @log("새 기가픽셀 인스턴스 시작 중...","새 기가픽셀 인스턴스를 시작했습니다: {}", format=(-1,), level=Level.DEBUG) def \_open\_topaz(self) -> Application: instance = Application(backend="uia").start(str(self.\_executable\_path)).connect(path=self.\_executable\_path) 인스턴스 반환 @log("경로 확인 중: {}", "경로가 유효합니다", format=(1,), level=Level.DEBUG) def \_check\_path(self, path: Path) -> None: if not path.is\_file(): raise NotFile(f"경로가 파일이 아닙니다: {path}") save\_path = self.\_get\_save\_path(경로) if save\_path.name in os.listdir(path.parent): raise FileAlreadyExists(f"출력 파일이 이미 존재합니다: {save\_path}") 정적 메서드 def \_remove\_suffix(입력\_string: str, 접미사: str) -> str: if 접미사 및 입력\_string.endswith(접미사): 반환 입력\_string[:-len(접미사)] 반환 입력\_string def \_get\_save\_path(self, path: Path) -> Path: return path.parent / (Gigapixel.\_remove\_suffix(경로.이름, 경로.접미사) + self.\_output\_suffix + 경로.접미사) log(start="처리 시작: {}", format=(1,)) log(end="처리 완료: {}", format=(1,), level=Level.SUCCESS) def process(self, photo\_path: 경로, 스케일: Scale = Scale.X2, mode: 모드 = 모드.표준) -> 경로: self.\_check\_path(photo\_path) self.\_app.open\_photo(사진\_경로) self.\_app.set\_processing\_옵션(스케일, 모드) self.\_app.save\_photo() 반환 self.\_get\_save\_path(사진\_경로)