From 445e15646b20b6f80cced8e2b8715b8a354925b0 Mon Sep 17 00:00:00 2001 From: david-ajax Date: Sat, 2 Aug 2025 17:48:42 +0800 Subject: [PATCH] =?UTF-8?q?=E6=94=B9=E8=BF=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- auxiliary.py | 2 +- compositions.py | 48 +++++++++++++++-- main.py | 51 +++++------------- particles.py | 2 +- puzzles.py | 44 +++++++++++++++ reactor.py | 30 ++++++----- webshare/__pycache__/__init__.cpython-313.pyc | Bin 152 -> 0 bytes .../_binary_encode.cpython-313.pyc | Bin 10649 -> 0 bytes .../__pycache__/app_service.cpython-313.pyc | Bin 14889 -> 0 bytes .../download_manager.cpython-313.pyc | Bin 7030 -> 0 bytes webshare/__pycache__/server.cpython-313.pyc | Bin 15792 -> 0 bytes 11 files changed, 122 insertions(+), 55 deletions(-) delete mode 100644 webshare/__pycache__/__init__.cpython-313.pyc delete mode 100644 webshare/__pycache__/_binary_encode.cpython-313.pyc delete mode 100644 webshare/__pycache__/app_service.cpython-313.pyc delete mode 100644 webshare/__pycache__/download_manager.cpython-313.pyc delete mode 100644 webshare/__pycache__/server.cpython-313.pyc diff --git a/auxiliary.py b/auxiliary.py index 2dc73a2..9894bd3 100644 --- a/auxiliary.py +++ b/auxiliary.py @@ -30,4 +30,4 @@ def get_daystamp() -> int: #print(f"TIME OVERRIDEED TO {time_override}") return int(time_override) - return int(time.time() // (24 * 3600)) + return int(time.time() // (24 * 3600)) \ No newline at end of file diff --git a/compositions.py b/compositions.py index 22e6f01..9edfa84 100644 --- a/compositions.py +++ b/compositions.py @@ -4,10 +4,11 @@ from textual.widgets import Header, Footer, ListView, ListItem, Label, Static, B from textual.containers import Container, Horizontal from textual.screen import Screen import pathlib +from typing import Tuple, Dict import particles as pt class Composition(): - def __init__(self, screen: Screen, atom): + def __init__(self, screen: Screen, atom: Tuple[pt.Electron, pt.Nucleon, Dict]): self.screen = screen self.atom = atom def compose(self): @@ -17,16 +18,55 @@ class Composition(): print(event.button.id) self.screen.query_one("#testlabel", Label).update("hi") +class Placeholder(Composition): + def __init__(self, screen: Screen): + self.screen = screen + def compose(self): + yield Label("示例标签", id="testlabel") + yield Button("示例按钮", id="testbtn") + def handler(self, event): + print(event.button.id) + self.screen.query_one("#testlabel", Label).update("hi") + class Recognition(Composition): - def __init__(self, screen: Screen, atom): - pass + def __init__(self, screen: Screen, atom: Tuple[pt.Electron, pt.Nucleon, Dict]): + super().__init__(screen, atom) + def compose(self): + yield Label(self.atom[1]["content"], id="sentence") + for i in self.atom[2]["testdata"]["additional_inf"]: + yield Label("[" + self.atom[2]["keydata"][i] + "] " + str(self.atom[1][i]), id=f"label_{i}") + yield Button("我已知晓", id="ok") + def handler(self, event): + if event.button.id == "ok": + return 1 + +class FillBlank(Composition): + def __init__(self, screen: Screen, atom: Tuple[pt.Electron, pt.Nucleon, Dict]): + super().__init__(screen, atom) + def compose(self): + yield Label(self.atom[1]["content"], id="sentence") + for i in self.atom[2]["testdata"]["additional_inf"]: + yield Label(f"{self.atom[2]["keydata"][i]}: {self.atom[1][i]}", id=f"label_{i}") + yield Button("我已知晓", id="ok") + def handler(self, event): + if event.button.id == "ok": + return 1 + + +registry = { + "sample": Composition, + "recognition": Recognition, + "fill_blank_test": FillBlank, + "draw_card_test": Composition, +} + # TEST class TestScreen(Screen): def __init__(self): super().__init__(name=None, id=None, classes=None) - self.comp = Composition(self, pt.Atom.advanced_placeholder()) + self.comp = Recognition(self, pt.Atom.advanced_placeholder()) def compose(self) -> ComposeResult: yield Header(show_clock=True) yield from self.comp.compose() diff --git a/main.py b/main.py index 8538e7e..c5e96b1 100644 --- a/main.py +++ b/main.py @@ -1,5 +1,5 @@ from textual.app import App, ComposeResult -from textual.widgets import Header, Footer, ListView, ListItem, Label, Static, Button +from textual.widgets import Header, Footer, ListView, DirectoryTree, ListItem, Label, Static, Button from textual.containers import Container, Horizontal from textual.screen import Screen import pathlib @@ -9,8 +9,9 @@ from playsound import playsound from textual.logging import TextualHandler import particles as pt -from reactor import Reactor +from reactor import Reactor, Apparatus import auxiliary as aux +import compositions as compo ver = '0.3.0' @@ -42,57 +43,32 @@ class MemScreen(Screen): tasked_num ): super().__init__(name=None, id=None, classes=None) - self.reactor = Reactor(nucleon_file, electron_file, tasked_num) + self.reactor = Reactor(nucleon_file, electron_file, self, tasked_num) self.stage = 1 self.stage += self.reactor.set_round_templated(self.stage) #print(self.reactor.procession) self.reactor.forward() + self.compo:compo.Composition = compo.Placeholder(self) def compose(self) -> ComposeResult: + self.compo = next(self.reactor.current_appar) yield Header(show_clock=True) with Container(id="main_container"): - yield Label(self.reactor.round_title, id="round_title") - yield Label("记住了吗?", id="question") - yield Static(self.reactor.current_atom[1].content, id="sentence") - yield Static("", id="feedback") # 用于显示反馈 - yield Label(self._get_progress_text(), id="progress") - with Container(id="button_container"): - if 1: - self.btn['5'] = Button("完美回想", variant="success", id="q5", classes="choice") - self.btn['4'] = Button("犹豫后正确", variant="success", id="q4", classes="choice") - self.btn['3'] = Button("困难地正确", variant="warning", id="q3", classes="choice") - self.btn['2'] = Button("错误但熟悉", variant="warning", id="q2", classes="choice") - self.btn['1'] = Button("错误且不熟", variant="error", id="q1", classes="choice") - self.btn['0'] = Button("完全空白", variant="error", id="q0", classes="choice") - yield Horizontal(self.btn['5'], self.btn['4']) - yield Horizontal(self.btn['3'], self.btn['2']) - yield Horizontal(self.btn['1'], self.btn['0']) + yield from self.compo.compose() yield Footer() - + """ def _get_progress_text(self): return f"{len(self.reactor.procession) - self.reactor.index}/{len(self.reactor.procession)}" + """ def on_mount(self): # 首次挂载时调用 - self._update_ui() - - def _update_ui(self): - self.query_one("#round_title", Label).update(self.reactor.round_title) - self.query_one("#sentence", Static).update(self.reactor.current_atom[1].content) - self.query_one("#progress", Label).update(self._get_progress_text()) - self.query_one("#feedback", Static).update("") # 清除任何之前的反馈消息 - - def _show_finished_screen(self, message): - self.query_one("#question", Label).update(message) - self.query_one("#sentence", Static).update("已经完成记忆任务") - self.query_one("#round_title").display = False - self.query_one("#progress").display = False - for i in range(6): - self.query_one(f"#q{i}", Button).display = False + pass def on_button_pressed(self, event): - feedback_label = self.query_one("#feedback", Static) + self.compo.handler(event) + """feedback_label = self.query_one("#feedback", Static) if type(event) == str: btnid = event else: @@ -119,7 +95,8 @@ class MemScreen(Screen): self.stage += 1 return #feedback_label.update("") # 清除反馈消息 - self._update_ui() + self._update_ui()""" + def action_press(self, btnid): self.on_button_pressed(btnid) diff --git a/particles.py b/particles.py index 6380d09..4e7bb50 100644 --- a/particles.py +++ b/particles.py @@ -258,7 +258,7 @@ class Atom(): "keyword_note": "关键词翻译", "translation": "语句翻译"}, "testdata":{ - "additional_inf": ["translation", "note"], + "additional_inf": ["translation", "note", "keyword_note"], "fill_blank_test": ["translation"], "draw_card_test": ["keyword_note"] }, diff --git a/puzzles.py b/puzzles.py index e69de29..36df324 100644 --- a/puzzles.py +++ b/puzzles.py @@ -0,0 +1,44 @@ +import random + +class Puzzle(): + pass + +class BlankPuzzle(Puzzle): + """填空题谜题生成器 + + Args: + text: 原始字符串(需要 "/" 分割句子, 末尾应有 "/") + min_denominator: 最小概率倒数(如占所有可生成填空数的 1/7 中的 7, 若期望值小于 1, 则取 1) + """ + def __init__(self, text, min_denominator): + self.text = text + self.min_denominator = min_denominator + self.wording = "填空题 - 尚未刷新谜题" + self.answer = ["填空题 - 尚未刷新谜题"] + + def refresh(self): # 刷新谜题 + placeholder = "___SLASH___" + tmp_text = self.text.replace("/", placeholder) + words = tmp_text.split(placeholder) + if not words: + return "" + words = [word for word in words if word] + num_blanks = min(max(1, len(words) // self.min_denominator), len(words)) + indices_to_blank = random.sample(range(len(words)), num_blanks) + indices_to_blank.sort() + blanked_words = list(words) + answer = list() + for index in indices_to_blank: + blanked_words[index] = "__" * len(words[index]) + answer.append(words[index]) + result = [] + for word in blanked_words: + result.append(word) + self.answer = answer + self.wording = "".join(result) + + def __str__(self): + return f"{self.wording}\n{str(self.answer)}" + +class SelectionPuzzle(Puzzle): + "选择题谜题生成器" \ No newline at end of file diff --git a/reactor.py b/reactor.py index df387e9..a27461f 100644 --- a/reactor.py +++ b/reactor.py @@ -2,30 +2,35 @@ import typing import particles as pt import pathlib import auxiliary as aux -import compositions +import compositions as comps +import random class Apparatus(): - """反应器对象, 处理一个原子的记忆工作, 并反馈到布局""" - def __init__(self, atom): + """反应器对象, 决策一个原子的不同记忆方式, 并反馈到布局""" + def __init__(self, screen, atom): self.electron: pt.Electron = atom[0] self.nucleon: pt.Nucleon = atom[1] self.positron: dict = atom[2] self.testdata = self.positron["testdata"] - - def iterator(self): - pass - - def composer(self): + self.procession: typing.List[comps.Composition] = list() if self.positron["is_new_activation"] == 1: self.positron["is_new_activation"] = 0 + self.procession.append(comps.registry["recognition"](screen, atom)) + return + for i in self.positron["testdata"].keys(): + if i == "additional_inf": + continue + self.procession.append(comps.registry[i](screen, atom)) + # self.procession.reverse() + random.shuffle(self.procession) - def updater(self): - pass + def iterator(self): + yield from self.procession class Reactor(): """反应堆对象, 处理和分配一次文件记忆流程的资源与策略""" - def __init__(self, nucleon_file: pt.NucleonUnion, electron_file: pt.ElectronUnion, tasked_num): + def __init__(self, nucleon_file: pt.NucleonUnion, electron_file: pt.ElectronUnion, screen, tasked_num): # 导入原子对象 self.reported = set() self.nucleon_file = nucleon_file @@ -34,7 +39,7 @@ class Reactor(): self.atoms_new = list() self.atoms_review = list() counter = self.tasked_num - + self.screen = screen self.electron_dict = electron_file.electrons_dict def electron_dict_get_fallback(key) -> pt.Electron: @@ -113,6 +118,7 @@ class Reactor(): return -1 # 此轮已完成 self.index += step self.current_atom = self.procession[self.index] + self.current_appar = Apparatus(self.screen, self.current_atom).iterator() return 0 def save(self): diff --git a/webshare/__pycache__/__init__.cpython-313.pyc b/webshare/__pycache__/__init__.cpython-313.pyc deleted file mode 100644 index 9d3fd2891d7f59e81ecc3c21eaa818555160567e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 152 zcmey&%ge<81glQ}O9#=9K?DpiLK&Y~fQ+dO=?t2Tek&P@n1H;`AgNpC`WgATsrrdo zi52=T`N^fZsd**E`o5{TE}3PiMfxSF6(yyKIq}7*MP;e_@$s2?nI-Y@dIgoYIBatB bQ%ZAE?TT1|=78)e1~EP|Gcqz3F#}lujm9OU diff --git a/webshare/__pycache__/_binary_encode.cpython-313.pyc b/webshare/__pycache__/_binary_encode.cpython-313.pyc deleted file mode 100644 index d2867482c8130aeffb3c27e1dbe6d7ff32c1c02c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10649 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 diff --git a/webshare/__pycache__/app_service.cpython-313.pyc b/webshare/__pycache__/app_service.cpython-313.pyc deleted file mode 100644 index b012df1344ce04af7d76029fc46c93c2e5e2ad1d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14889 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 diff --git a/webshare/__pycache__/server.cpython-313.pyc b/webshare/__pycache__/server.cpython-313.pyc deleted file mode 100644 index 4309205efee1875728c6373f61bce8927e33f870..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15792 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