from textual.app import App, ComposeResult from textual.events import Event from textual.widgets import ( Collapsible, Header, Footer, Markdown, ListView, ListItem, Label, Static, Button, ) from textual.containers import Container, Horizontal, Center from textual.screen import Screen from textual.widget import Widget import uuid from typing import Tuple, Dict import heurams.kernel.particles as pt import heurams.kernel.puzzles as pz import re import random import copy class FillBlank(Composition): def __init__(self, screen: Screen, reactor, atom: Tuple[pt.Electron, pt.Nucleon, Dict], extra:Dict = {}): super().__init__(screen, reactor, atom) self.extra = extra self.inputlist = [] self.hashtable = {} self._work() def _work(self): self.puzzle = pz.BlankPuzzle(self.atom[1]["content"], 2) self.puzzle.refresh() self.ans = copy.copy(self.puzzle.answer) random.shuffle(self.ans) def compose(self): if self.extra.get("feedback_msg"): yield Label("反馈提示:" + self.extra["feedback_msg"]) yield Label(self.puzzle.wording, id=self.regid("sentence")) yield Label(f"当前输入: {self.inputlist}", id=self.regid("inputpreview")) for i in self.ans: self.hashtable[str(hash(i))] = i yield Button(i, id=self.regid(f"select{hash(i)}")) yield Button("退格", id=self.regid(f"delete")) def handler(self, event, type_): # TODO: 改动:在线错误纠正 if type_ == "button": if self.recid(event.button.id) == "delete": if len(self.inputlist) > 0: self.inputlist.pop() else: return 1 else: self.inputlist.append(self.hashtable[self.recid(event.button.id)[6:]]) if len(self.inputlist) < len(self.puzzle.answer): return 1 else: if self.inputlist == self.puzzle.answer: self.reactor.report(self.atom, 4) return 0 else: self.inputlist = [] self.reactor.report(self.atom, 2) return 2