96 lines
3.7 KiB
Python
96 lines
3.7 KiB
Python
from textual.widgets import (
|
|
Label,
|
|
Static,
|
|
Button,
|
|
)
|
|
from textual.containers import Container, Horizontal
|
|
from textual.widget import Widget
|
|
import heurams.kernel.particles as pt
|
|
from .base_puzzle_widget import BasePuzzleWidget
|
|
from textual.message import Message
|
|
|
|
class BasicEvaluation(BasePuzzleWidget):
|
|
def __init__(self, *children: Widget, atom: pt.Atom, alia: str = "", name: str | None = None, id: str | None = None, classes: str | None = None, disabled: bool = False, markup: bool = True) -> None:
|
|
super().__init__(*children, atom=atom, name=name, id=id, classes=classes, disabled=disabled, markup=markup)
|
|
|
|
class RatingChanged(Message):
|
|
def __init__(self, rating: int) -> None:
|
|
self.rating = rating # 评分值 (0-5)
|
|
super().__init__()
|
|
|
|
# 反馈映射表
|
|
feedback_mapping = {
|
|
"feedback_5": {"rating": 5, "text": "完美回想"},
|
|
"feedback_4": {"rating": 4, "text": "犹豫后正确"},
|
|
"feedback_3": {"rating": 3, "text": "困难地正确"},
|
|
"feedback_2": {"rating": 2, "text": "错误但熟悉"},
|
|
"feedback_1": {"rating": 1, "text": "错误且不熟"},
|
|
"feedback_0": {"rating": 0, "text": "完全空白"},
|
|
}
|
|
|
|
def compose(self):
|
|
# 显示主要内容
|
|
yield Label(self.atom.registry["nucleon"]["content"], id="main")
|
|
|
|
# 显示评估说明(可选)
|
|
yield Static("请评估你对这个内容的记忆程度:", classes="instruction")
|
|
|
|
# 按钮容器
|
|
with Container(id="button_container"):
|
|
btn = {}
|
|
btn["5"] = Button(
|
|
"完美回想", variant="success", id="feedback_5", classes="choice"
|
|
)
|
|
btn["4"] = Button(
|
|
"犹豫后正确", variant="success", id="feedback_4", classes="choice"
|
|
)
|
|
btn["3"] = Button(
|
|
"困难地正确", variant="warning", id="feedback_3", classes="choice"
|
|
)
|
|
btn["2"] = Button(
|
|
"错误但熟悉", variant="warning", id="feedback_2", classes="choice"
|
|
)
|
|
btn["1"] = Button(
|
|
"错误且不熟", variant="error", id="feedback_1", classes="choice"
|
|
)
|
|
btn["0"] = Button(
|
|
"完全空白", variant="error", id="feedback_0", classes="choice"
|
|
)
|
|
|
|
# 布局按钮
|
|
yield Horizontal(btn["5"], btn["4"])
|
|
yield Horizontal(btn["3"], btn["2"])
|
|
yield Horizontal(btn["1"], btn["0"])
|
|
|
|
def on_button_pressed(self, event: Button.Pressed) -> None:
|
|
"""处理按钮点击事件"""
|
|
button_id = event.button.id
|
|
|
|
if button_id in self.feedback_mapping:
|
|
feedback_info = self.feedback_mapping[button_id]
|
|
|
|
self.post_message(self.RatingChanged(
|
|
rating=feedback_info["rating"],
|
|
))
|
|
|
|
event.button.add_class("selected")
|
|
|
|
self.disable_other_buttons(button_id)
|
|
|
|
def disable_other_buttons(self, selected_button_id: str) -> None:
|
|
for button in self.query("Button.choice"):
|
|
if button.id != selected_button_id:
|
|
button.disabled = True
|
|
|
|
def enable_all_buttons(self) -> None:
|
|
for button in self.query("Button.choice"):
|
|
button.disabled = False
|
|
|
|
def on_key(self, event) -> None:
|
|
if event.key in ["0", "1", "2", "3", "4", "5"]:
|
|
button_id = f"feedback_{event.key}"
|
|
if button_id in self.feedback_mapping:
|
|
# 模拟按钮点击
|
|
self.post_message(self.RatingChanged(
|
|
rating=self.feedback_mapping[button_id]["rating"],
|
|
)) |