From 47c14e520bf859d587b5e78c59e9e280690c8fe1 Mon Sep 17 00:00:00 2001 From: david-ajax Date: Tue, 6 Jan 2026 20:32:27 +0800 Subject: [PATCH] =?UTF-8?q?feat(interface):=20=E5=AE=8C=E6=88=90=E9=98=9F?= =?UTF-8?q?=E5=88=97=E5=BC=8F=E8=AE=B0=E5=BF=86=E6=A8=A1=E5=9D=97=E6=9B=B4?= =?UTF-8?q?=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/heurams/interface/screens/memoqueue.py | 22 ++++++++++++++++++-- src/heurams/interface/screens/preparation.py | 4 +++- src/heurams/interface/widgets/finished.py | 3 +++ src/heurams/interface/widgets/recognition.py | 10 --------- src/heurams/kernel/reactor/phaser.py | 4 ++++ src/heurams/kernel/repolib/repo.py | 4 ++-- 6 files changed, 32 insertions(+), 15 deletions(-) diff --git a/src/heurams/interface/screens/memoqueue.py b/src/heurams/interface/screens/memoqueue.py index 148c873..9ec5a38 100644 --- a/src/heurams/interface/screens/memoqueue.py +++ b/src/heurams/interface/screens/memoqueue.py @@ -1,6 +1,7 @@ """队列式记忆工作界面""" from enum import Enum, auto +from typing import Callable from textual.app import ComposeResult from textual.containers import Center, ScrollableContainer @@ -42,14 +43,17 @@ class MemScreen(Screen): def __init__( self, phaser: Phaser, + save_func: Callable, name=None, id=None, classes=None, ) -> None: super().__init__(name, id, classes) self.phaser = phaser + self.save_func = save_func self.update_state() self.fission: Fission + def compose(self) -> ComposeResult: yield Header(show_clock=True) @@ -125,8 +129,9 @@ class MemScreen(Screen): for i in container.children: i.remove() from heurams.interface.widgets.finished import Finished - - container.mount(Finished()) + if config_var.get().get("persist_to_file", 0): + self.save_func() + container.mount(Finished(is_saved=config_var.get().get("persist_to_file", 0))) def on_button_pressed(self, event): event.stop() @@ -173,8 +178,21 @@ class MemScreen(Screen): self.mount_puzzle() self.update_display() + def atom_reporter(self, quality): + if not self.atom.registry["runtime"]["locked"]: + if not self.atom.registry["electron"].is_activated(): + self.atom.registry["electron"].activate() + logger.debug(f"激活原子 {self.atom}") + self.atom.lock(1) + self.atom.minimize(5) + else: + self.atom.minimize(quality) + else: + pass + def forward_atom(self, quality): logger.debug(f"Quality: {quality}") + self.atom_reporter(quality) if quality <= 3: self.procession.append() self.update_state() # 刷新状态 diff --git a/src/heurams/interface/screens/preparation.py b/src/heurams/interface/screens/preparation.py index 17bd421..ee36806 100644 --- a/src/heurams/interface/screens/preparation.py +++ b/src/heurams/interface/screens/preparation.py @@ -130,8 +130,10 @@ class PreparationScreen(Screen): import heurams.kernel.reactor as rt pheser = rt.Phaser(atoms_to_provide) - memscreen = MemScreen(pheser) + save_func = self.repo.persist_to_repodir + memscreen = MemScreen(pheser, save_func) self.app.push_screen(memscreen) + elif event.button.id == "precache_button": self.action_precache() diff --git a/src/heurams/interface/widgets/finished.py b/src/heurams/interface/widgets/finished.py index 1110f6a..bb25739 100644 --- a/src/heurams/interface/widgets/finished.py +++ b/src/heurams/interface/widgets/finished.py @@ -7,6 +7,7 @@ class Finished(Widget): self, *children: Widget, alia="", + is_saved = 0, name: str | None = None, id: str | None = None, classes: str | None = None, @@ -14,6 +15,7 @@ class Finished(Widget): markup: bool = True ) -> None: self.alia = alia + self.is_saved = is_saved super().__init__( *children, name=name, @@ -25,6 +27,7 @@ class Finished(Widget): def compose(self): yield Label("本次记忆进程结束", id="finished_msg") + yield Label(f"算法数据{'已保存' if self.is_saved else "未能保存"}") yield Button("返回上一级", id="back-to-menu") def on_button_pressed(self, event): diff --git a/src/heurams/interface/widgets/recognition.py b/src/heurams/interface/widgets/recognition.py index 5192940..233dc80 100644 --- a/src/heurams/interface/widgets/recognition.py +++ b/src/heurams/interface/widgets/recognition.py @@ -107,13 +107,3 @@ class Recognition(BasePuzzleWidget): if event.button.id == "ok": self.screen.rating = 5 # type: ignore self.handler(5) - - def handler(self, rating): - if not self.atom.registry["runtime"]["locked"]: - if not self.atom.registry["electron"].is_activated(): - self.atom.registry["electron"].activate() - logger.debug(f"激活原子 {self.atom}") - self.atom.lock(1) - self.atom.minimize(5) - else: - pass diff --git a/src/heurams/kernel/reactor/phaser.py b/src/heurams/kernel/reactor/phaser.py index a903bc8..9afdccd 100644 --- a/src/heurams/kernel/reactor/phaser.py +++ b/src/heurams/kernel/reactor/phaser.py @@ -16,6 +16,7 @@ class Phaser(Machine): def __init__(self, atoms: list[pt.Atom]) -> None: logger.debug("Phaser.__init__: 原子数量=%d", len(atoms)) + self.atoms = atoms new_atoms = list() old_atoms = list() @@ -105,6 +106,9 @@ class Phaser(Machine): def on_finished(self): """进入FINISHED状态时的回调""" + for i in self.atoms: + i.lock(1) + i.revise() logger.debug("Phaser 进入 FINISHED 状态") def current_procession(self): diff --git a/src/heurams/kernel/repolib/repo.py b/src/heurams/kernel/repolib/repo.py index d492d67..ec5cbbc 100644 --- a/src/heurams/kernel/repolib/repo.py +++ b/src/heurams/kernel/repolib/repo.py @@ -101,7 +101,7 @@ class Repo: source = self.source if source == None: raise FileNotFoundError("不存在仓库到文件的映射") - source.mkdir(parents=True, exist_ok=False) + source.mkdir(parents=True, exist_ok=True) for keyname in save_list: filename = self.file_mapping[keyname] with open(source / filename, "w") as f: @@ -112,7 +112,7 @@ class Repo: if filename.endswith("toml"): toml.dump(dict_data, f) elif filename.endswith("json"): - json.dump(dict_data, f) + json.dump(dict_data, f, ensure_ascii=False, indent=4) else: raise ValueError(f"不支持的文件类型: {filename}")