Open AutumnSun1996 opened 6 days ago
使用 python gui.py 运行时,出现报错 UnidentifiedImageError. 回退到 bc5e6ed86a7e004141fdaf80636d3e164163a856 版本后可以正常执行,因此推测问题来自PR #4374
预期可以正常运行
╭───────────────────────────────────────── Traceback (most recent call last) ─────────────────────────────────────────╮ │ │ │ E:\Documents\Projects\Entertainment\Reference\AzurLaneAutoScript\alas.py:69 in run │ │ │ │ 66 │ │ try: │ │ 67 │ │ │ if not skip_first_screenshot: │ │ 68 │ │ │ │ self.device.screenshot() │ │ ❱ 69 │ │ │ self.__getattribute__(command)() │ │ 70 │ │ │ return True │ │ 71 │ │ except TaskEnd: │ │ 72 │ │ │ return True │ │ │ │ ╭──────────────────────────────────── locals ────────────────────────────────────╮ │ │ │ command = 'tactical' │ │ │ │ self = <alas.AzurLaneAutoScript object at 0x000001C19FB47608> │ │ │ │ skip_first_screenshot = False │ │ │ ╰────────────────────────────────────────────────────────────────────────────────╯ │ │ E:\Documents\Projects\Entertainment\Reference\AzurLaneAutoScript\alas.py:194 in tactical │ │ │ │ 191 │ │ │ 192 │ def tactical(self): │ │ 193 │ │ from module.tactical.tactical_class import RewardTacticalClass │ │ ❱ 194 │ │ RewardTacticalClass(config=self.config, device=self.device).run() │ │ 195 │ │ │ 196 │ def dorm(self): │ │ 197 │ │ from module.dorm.dorm import RewardDorm │ │ │ │ ╭────────────────────────────────────── locals ──────────────────────────────────────╮ │ │ │ RewardTacticalClass = <class 'module.tactical.tactical_class.RewardTacticalClass'> │ │ │ │ self = <alas.AzurLaneAutoScript object at 0x000001C19FB47608> │ │ │ ╰────────────────────────────────────────────────────────────────────────────────────╯ │ │ │ │ E:\Documents\Projects\Entertainment\Reference\AzurLaneAutoScript\module\tactical\tactical_class.py:706 in run │ │ │ │ 703 │ │ │ in: Any │ │ 704 │ │ │ out: page_tactical │ │ 705 │ │ """ │ │ ❱ 706 │ │ self.ui_ensure(page_reward) │ │ 707 │ │ │ │ 708 │ │ self.tactical_class_receive() │ │ 709 │ │ │ │ ╭───────────────────────────────────────── locals ─────────────────────────────────────────╮ │ │ │ self = <module.tactical.tactical_class.RewardTacticalClass object at 0x000001C1D103A788> │ │ │ ╰──────────────────────────────────────────────────────────────────────────────────────────╯ │ │ │ │ E:\Documents\Projects\Entertainment\Reference\AzurLaneAutoScript\module\ui\ui.py:280 in ui_ensure │ │ │ │ 277 │ │ │ bool: If UI switched. │ │ 278 │ │ """ │ │ 279 │ │ logger.hr("UI ensure") │ │ ❱ 280 │ │ self.ui_get_current_page(skip_first_screenshot=skip_first_screenshot) │ │ 281 │ │ if self.ui_current == destination: │ │ 282 │ │ │ logger.info("Already at %s" % destination) │ │ 283 │ │ │ return False │ │ │ │ ╭───────────────────────────────────────────────── locals ──────────────────────────────────────────────────╮ │ │ │ destination = <module.ui.page.Page object at 0x000001C1D128B9C8> │ │ │ │ self = <module.tactical.tactical_class.RewardTacticalClass object at 0x000001C1D103A788> │ │ │ │ skip_first_screenshot = True │ │ │ ╰───────────────────────────────────────────────────────────────────────────────────────────────────────────╯ │ │ │ │ E:\Documents\Projects\Entertainment\Reference\AzurLaneAutoScript\module\ui\ui.py:189 in ui_get_current_page │ │ │ │ 186 │ │ │ for page in Page.iter_pages(): │ │ 187 │ │ │ │ if page.check_button is None: │ │ 188 │ │ │ │ │ continue │ │ ❱ 189 │ │ │ │ if self.ui_page_appear(page=page): │ │ 190 │ │ │ │ │ logger.attr("UI", page.name) │ │ 191 │ │ │ │ │ self.ui_current = page │ │ 192 │ │ │ │ │ return page │ │ │ │ ╭───────────────────────────────────────────────── locals ──────────────────────────────────────────────────╮ │ │ │ app_check = <function run_once.<locals>.wrapper at 0x000001C1D1729798> │ │ │ │ minicap_check = <function run_once.<locals>.wrapper at 0x000001C1D1738168> │ │ │ │ page = <module.ui.page.Page object at 0x000001C1D123DE88> │ │ │ │ rotation_check = <function run_once.<locals>.wrapper at 0x000001C1D1738288> │ │ │ │ self = <module.tactical.tactical_class.RewardTacticalClass object at 0x000001C1D103A788> │ │ │ │ skip_first_screenshot = False │ │ │ │ timeout = Timer(limit=4.832/10, count=1/20) │ │ │ ╰───────────────────────────────────────────────────────────────────────────────────────────────────────────╯ │ │ │ │ E:\Documents\Projects\Entertainment\Reference\AzurLaneAutoScript\module\ui\ui.py:36 in ui_page_appear │ │ │ │ 33 │ │ │ interval: │ │ 34 │ │ """ │ │ 35 │ │ if page == page_main: │ │ ❱ 36 │ │ │ if self.appear(page_main_white.check_button, offset=offset, │ │ interval=interval): │ │ 37 │ │ │ │ return True │ │ 38 │ │ │ if self.appear(page_main.check_button, offset=(5, 5), interval=interval): │ │ 39 │ │ │ │ return True │ │ │ │ ╭─────────────────────────────────────────── locals ───────────────────────────────────────────╮ │ │ │ interval = 0 │ │ │ │ offset = (30, 30) │ │ │ │ page = <module.ui.page.Page object at 0x000001C1D123DE88> │ │ │ │ self = <module.tactical.tactical_class.RewardTacticalClass object at 0x000001C1D103A788> │ │ │ ╰──────────────────────────────────────────────────────────────────────────────────────────────╯ │ │ │ │ E:\Documents\Projects\Entertainment\Reference\AzurLaneAutoScript\module\base\base.py:171 in appear │ │ │ │ 168 │ │ │ if isinstance(offset, bool): │ │ 169 │ │ │ │ offset = self.config.BUTTON_OFFSET │ │ 170 │ │ │ appear = button.match(self.device.image, offset=offset, │ │ ❱ 171 │ │ │ │ │ │ │ │ threshold=self.config.BUTTON_MATCH_SIMILARITY if │ │ threshold is None else threshold) │ │ 172 │ │ else: │ │ 173 │ │ │ appear = button.appear_on(self.device.image, │ │ 174 │ │ │ │ │ │ │ │ │ threshold=self.config.COLOR_SIMILAR_THRESHOLD if │ │ threshold is None else threshold) │ │ │ │ ╭─────────────────────────────────────────── locals ────────────────────────────────────────────╮ │ │ │ button = MAIN_GOTO_CAMPAIGN_WHITE │ │ │ │ interval = 0 │ │ │ │ offset = (30, 30) │ │ │ │ self = <module.tactical.tactical_class.RewardTacticalClass object at 0x000001C1D103A788> │ │ │ │ threshold = None │ │ │ ╰───────────────────────────────────────────────────────────────────────────────────────────────╯ │ │ │ │ E:\Documents\Projects\Entertainment\Reference\AzurLaneAutoScript\module\base\button.py:212 in match │ │ │ │ 209 │ │ Returns: │ │ 210 │ │ │ bool. │ │ 211 │ │ """ │ │ ❱ 212 │ │ self.ensure_template() │ │ 213 │ │ │ │ 214 │ │ if isinstance(offset, tuple): │ │ 215 │ │ │ if len(offset) == 2: │ │ │ │ ╭────────────────────── locals ───────────────────────╮ │ │ │ image = array([[[214, 158, 182], │ │ │ │ │ │ [214, 158, 182], │ │ │ │ │ │ [214, 158, 182], │ │ │ │ │ │ ..., │ │ │ │ │ │ [214, 211, 231], │ │ │ │ │ │ [214, 211, 239], │ │ │ │ │ │ [198, 203, 231]], │ │ │ │ │ │ │ │ │ │ [[214, 158, 182], │ │ │ │ │ │ [214, 158, 182], │ │ │ │ │ │ [214, 158, 182], │ │ │ │ │ │ ..., │ │ │ │ │ │ [214, 211, 231], │ │ │ │ │ │ [214, 215, 239], │ │ │ │ │ │ [198, 203, 231]], │ │ │ │ │ │ │ │ │ │ [[214, 158, 182], │ │ │ │ │ │ [214, 158, 182], │ │ │ │ │ │ [214, 158, 182], │ │ │ │ │ │ ..., │ │ │ │ │ │ [214, 211, 231], │ │ │ │ │ │ [214, 211, 231], │ │ │ │ │ │ [198, 203, 231]], │ │ │ │ │ │ │ │ │ │ ..., │ │ │ │ │ │ │ │ │ │ [[ 58, 57, 50], │ │ │ │ │ │ [ 58, 53, 50], │ │ │ │ │ │ [ 66, 57, 50], │ │ │ │ │ │ ..., │ │ │ │ │ │ [ 50, 49, 50], │ │ │ │ │ │ [ 50, 53, 50], │ │ │ │ │ │ [ 50, 49, 50]], │ │ │ │ │ │ │ │ │ │ [[ 58, 53, 58], │ │ │ │ │ │ [ 58, 53, 58], │ │ │ │ │ │ [ 58, 53, 58], │ │ │ │ │ │ ..., │ │ │ │ │ │ [ 50, 49, 50], │ │ │ │ │ │ [ 50, 49, 50], │ │ │ │ │ │ [ 50, 49, 50]], │ │ │ │ │ │ │ │ │ │ [[ 66, 61, 66], │ │ │ │ │ │ [ 58, 57, 58], │ │ │ │ │ │ [ 58, 61, 58], │ │ │ │ │ │ ..., │ │ │ │ │ │ [ 50, 49, 58], │ │ │ │ │ │ [ 50, 53, 58], │ │ │ │ │ │ [ 50, 49, 58]]], dtype=uint8) │ │ │ │ offset = (30, 30) │ │ │ │ self = MAIN_GOTO_CAMPAIGN_WHITE │ │ │ │ threshold = 0.85 │ │ │ ╰─────────────────────────────────────────────────────╯ │ │ │ │ E:\Documents\Projects\Entertainment\Reference\AzurLaneAutoScript\module\base\button.py:161 in ensure_template │ │ │ │ 158 │ │ │ │ │ image = crop(image, self.area) │ │ 159 │ │ │ │ │ self.image.append(image) │ │ 160 │ │ │ else: │ │ ❱ 161 │ │ │ │ self.image = load_image(self.file, self.area) │ │ 162 │ │ │ self._match_init = True │ │ 163 │ │ │ 164 │ def ensure_binary_template(self): │ │ │ │ ╭──────────── locals ─────────────╮ │ │ │ self = MAIN_GOTO_CAMPAIGN_WHITE │ │ │ ╰─────────────────────────────────╯ │ │ │ │ E:\Documents\Projects\Entertainment\Reference\AzurLaneAutoScript\module\base\utils.py:511 in load_image │ │ │ │ 508 │ Returns: │ │ 509 │ │ np.ndarray: │ │ 510 │ """ │ │ ❱ 511 │ image = Image.open(file) │ │ 512 │ if area is not None: │ │ 513 │ │ image = image.crop(area) │ │ 514 │ image = np.array(image) │ │ │ │ ╭────────────────────────── locals ──────────────────────────╮ │ │ │ area = (1132, 529, 1187, 557) │ │ │ │ file = './assets/cn/ui_white/MAIN_GOTO_CAMPAIGN_WHITE.png' │ │ │ ╰────────────────────────────────────────────────────────────╯ │ │ │ │ D:\Software\anaconda3\envs\alas\lib\site-packages\PIL\Image.py:3024 in open │ │ │ │ 3021 │ for message in accept_warnings: │ │ 3022 │ │ warnings.warn(message) │ │ 3023 │ raise UnidentifiedImageError( │ │ ❱ 3024 │ │ "cannot identify image file %r" % (filename if filename else fp) │ │ 3025 │ ) │ │ 3026 │ │ 3027 │ │ │ │ ╭──────────────────────────────────────────── locals ─────────────────────────────────────────────╮ │ │ │ _open_core = <function open.<locals>._open_core at 0x000001C1D17820D8> │ │ │ │ accept_warnings = [] │ │ │ │ exclusive_fp = True │ │ │ │ filename = './assets/cn/ui_white/MAIN_GOTO_CAMPAIGN_WHITE.png' │ │ │ │ formats = [] │ │ │ │ fp = <_io.BufferedReader name='./assets/cn/ui_white/MAIN_GOTO_CAMPAIGN_WHITE.png'> │ │ │ │ im = None │ │ │ │ mode = 'r' │ │ │ │ prefix = b'\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR' │ │ │ ╰─────────────────────────────────────────────────────────────────────────────────────────────────╯ │ ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ UnidentifiedImageError: cannot identify image file './assets/cn/ui_white/MAIN_GOTO_CAMPAIGN_WHITE.png' During handling of the above exception, another exception occurred: ╭───────────────────────────────────────── Traceback (most recent call last) ─────────────────────────────────────────╮ │ │ │ E:\Documents\Projects\Entertainment\Reference\AzurLaneAutoScript\module\webui\process_manager.py:162 in run_process │ │ │ │ 159 │ │ │ │ │ │ 160 │ │ │ │ if e is not None: │ │ 161 │ │ │ │ │ AzurLaneAutoScript.stop_event = e │ │ ❱ 162 │ │ │ │ AzurLaneAutoScript(config_name=config_name).loop() │ │ 163 │ │ │ elif func in get_available_func(): │ │ 164 │ │ │ │ from alas import AzurLaneAutoScript │ │ 165 │ │ │ │ ╭──────────────────────────────────────────────────── locals ─────────────────────────────────────────────────────╮ │ │ │ _ = [] │ │ │ │ args = Namespace(electron=False) │ │ │ │ AzurLaneAutoScript = <class 'alas.AzurLaneAutoScript'> │ │ │ │ AzurLaneConfig = <class 'module.config.config.AzurLaneConfig'> │ │ │ │ config_name = 'alas' │ │ │ │ e = UnidentifiedImageError("cannot identify image file './assets/cn/ui/PLAYER_CHECK.png'") │ │ │ │ func = 'alas' │ │ │ │ parser = ArgumentParser(prog='patcher.py', usage=None, description=None, formatter_class=<class │ │ │ │ 'argparse.HelpFormatter'>, conflict_handler='error', add_help=True) │ │ │ │ q = <AutoProxy[Queue] object, typeid 'Queue' at 0x1c1d15cf348> │ │ │ ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ │ │ E:\Documents\Projects\Entertainment\Reference\AzurLaneAutoScript\alas.py:537 in loop │ │ │ │ 534 │ │ │ self.device.stuck_record_clear() │ │ 535 │ │ │ self.device.click_record_clear() │ │ 536 │ │ │ logger.hr(task, level=0) │ │ ❱ 537 │ │ │ success = self.run(inflection.underscore(task)) │ │ 538 │ │ │ logger.info(f'Scheduler: End task `{task}`') │ │ 539 │ │ │ self.is_first_task = False │ │ 540 │ │ │ │ ╭───────────────────────────── locals ──────────────────────────────╮ │ │ │ _ = <module.device.device.Device object at 0x000001C1D16584C8> │ │ │ │ self = <alas.AzurLaneAutoScript object at 0x000001C19FB47608> │ │ │ │ task = 'Tactical' │ │ │ ╰───────────────────────────────────────────────────────────────────╯ │ │ │ │ E:\Documents\Projects\Entertainment\Reference\AzurLaneAutoScript\alas.py:127 in run │
No response
State.deploy_config.EnableReload 为True, 因此gui.py中会使用multiprocessing方式运行,可能和问题相关
我也有相同的问题
似乎和import顺序有关,试了下将module.xxx的import全部移动到func内部之后可以正常运行了
func
在提问之前...
描述你的问题
使用 python gui.py 运行时,出现报错 UnidentifiedImageError. 回退到 bc5e6ed86a7e004141fdaf80636d3e164163a856 版本后可以正常执行,因此推测问题来自PR #4374
如何复现
预期行为
预期可以正常运行
相关 Logs
截图
No response
还有别的吗?
State.deploy_config.EnableReload 为True, 因此gui.py中会使用multiprocessing方式运行,可能和问题相关