class MemScreen(Screen): BINDINGS = [ ("d", "toggle_dark", "改变色调"), ("q", "pop_screen", "返回主菜单"), ("v", "play_voice", "朗读"), # ("p", "precache_current", "预缓存当前单元集"), # 新增预缓存快捷键 ] if config.get("quick_pass"): BINDINGS.append(("k", "quick_pass", "快速通过[调试]")) btn = dict() def __init__( self, nucleon_file: pt.NucleonUnion, electron_file: pt.ElectronUnion, tasked_num, ): super().__init__(name=None, id=None, classes=None) self.nucleon_file = nucleon_file self.electron_file = electron_file self.reactor = Reactor(nucleon_file, electron_file, self, tasked_num) self.stage = 1 self.stage += self.reactor.set_round_templated(self.stage) first_forward = self.reactor.forward() print(first_forward) if first_forward == -1: self.stage = 3 self.reactor.set_round_templated(3) print(self.reactor.forward()) #self._forward_judge(first_forward) self.compo = next(self.reactor.current_appar) self.feedback_state = 0 # 默认状态 self.feedback_state_map = { 0: "", 255: "回答有误, 请重试. 或者重新学习此单元", } def compose(self) -> ComposeResult: if type(self.compo).__name__ == "Recognition": self.action_play_voice() yield Header(show_clock=True) with Center(): yield Static( f"当前进度: {len(self.reactor.procession) - self.reactor.index}/{len(self.reactor.procession)}" ) yield Label(self.feedback_state_map[self.feedback_state]) yield from self.compo.compose() if self.feedback_state == 255: yield Button("重新学习此单元", id="re-recognize", variant="warning") yield Footer() def on_mount(self): pass def on_button_pressed(self, event): try: if event.button.id == "re-recognize": return except: pass ret = self.compo.handler(event, "button") self._forward_judge(ret) def _forward_judge(self, ret): self.feedback_state = 0 if ret == -1: return if ret == 0: try: self.compo = next(self.reactor.current_appar) self.refresh_ui() except StopIteration: nxt = self.reactor.forward(1) try: self.compo = next(self.reactor.current_appar) except: pass if nxt == -1: if self.reactor.round_set == 0: if self.stage == 4: if config.get("save"): self.reactor.save() self.compo = compo.Finished( self, None, pt.Atom.placeholder() ) self.refresh_ui() else: self.reactor.set_round_templated(self.stage) self.reactor.forward(1) self.stage += 1 self.compo = next(self.reactor.current_appar) self.refresh_ui() return return else: self.refresh_ui() return if ret >= 1: if ret == 2: self.feedback_state = 255 # 表示错误 else: self.feedback_state = 0 self.refresh_ui() return def refresh_ui(self): self.call_later(self.recompose) print(type(self.compo).__name__) def action_play_voice(self): def play(): cache_dir = pathlib.Path(f"./cache/voice/") cache_dir.mkdir(parents=True, exist_ok=True) cache = cache_dir / f"{aux.get_md5(self.reactor.current_atom[1].content.replace('/',''))}.wav" if not cache.exists(): import edge_tts as tts communicate = tts.Communicate( self.reactor.current_atom[1].content.replace("/", ""), "zh-CN-XiaoxiaoNeural", ) communicate.save_sync( f"./cache/voice/{aux.get_md5(self.reactor.current_atom[1].content.replace('/',''))}.wav" ) playsound(str(cache)) threading.Thread(target=play).start() def action_precache_current(self): """预缓存当前单元集的音频""" precache_screen = PrecachingScreen(self.nucleon_file) self.app.push_screen(precache_screen) def action_quick_pass(self): self.reactor.report(self.reactor.current_atom, 5) self._forward_judge(0) def action_toggle_dark(self): self.app.action_toggle_dark() def action_pop_screen(self): self.app.pop_screen()