|
|
# input_handler/input_processor.py
|
|
|
from PyQt5.QtCore import QObject, pyqtSignal
|
|
|
from typing import Optional
|
|
|
|
|
|
class InputProcessor(QObject):
|
|
|
# 定义信号
|
|
|
text_changed = pyqtSignal(str) # 文本变化信号
|
|
|
key_pressed = pyqtSignal(str) # 按键按下信号
|
|
|
input_completed = pyqtSignal() # 输入完成信号
|
|
|
|
|
|
def __init__(self):
|
|
|
|
|
|
super().__init__()
|
|
|
# 实现构造函数逻辑
|
|
|
# 1. 初始化输入缓冲区
|
|
|
self.input_buffer = ""
|
|
|
# 2. 设置初始状态
|
|
|
self.is_input_active = False
|
|
|
# 3. 初始化相关属性
|
|
|
self.expected_text = ""
|
|
|
self.current_position = 0
|
|
|
|
|
|
def process_key_event(self, key: str) -> bool:
|
|
|
|
|
|
# 实现按键事件处理逻辑
|
|
|
# 1. 检查按键是否有效
|
|
|
if not key:
|
|
|
return False
|
|
|
|
|
|
# 2. 根据按键类型处理(字符、功能键等)
|
|
|
# 3. 更新输入缓冲区
|
|
|
self.input_buffer += key
|
|
|
self.current_position += 1
|
|
|
|
|
|
# 4. 发送text_changed信号
|
|
|
self.text_changed.emit(key)
|
|
|
|
|
|
# 5. 检查是否完成输入,如是则发送input_completed信号
|
|
|
if self.expected_text and self.input_buffer == self.expected_text:
|
|
|
self.input_completed.emit()
|
|
|
|
|
|
# 6. 返回处理结果
|
|
|
return True
|
|
|
|
|
|
def get_current_input(self) -> str:
|
|
|
|
|
|
# 实现获取当前输入逻辑
|
|
|
# 1. 返回输入缓冲区内容
|
|
|
return self.input_buffer
|
|
|
|
|
|
def reset_input(self):
|
|
|
|
|
|
# 实现输入重置逻辑
|
|
|
# 1. 清空输入缓冲区
|
|
|
self.input_buffer = ""
|
|
|
# 2. 重置相关状态变量
|
|
|
self.current_position = 0
|
|
|
self.is_input_active = False
|
|
|
# 3. 发送重置信号(如需要)
|
|
|
|
|
|
def set_expected_text(self, text: str):
|
|
|
|
|
|
# 实现设置期望文本逻辑
|
|
|
# 1. 保存期望文本
|
|
|
self.expected_text = text
|
|
|
# 2. 初始化匹配相关状态
|
|
|
self.current_position = 0
|
|
|
self.input_buffer = ""
|
|
|
self.is_input_active = True
|
|
|
|
|
|
class InputValidator:
|
|
|
def __init__(self):
|
|
|
|
|
|
# 实现构造函数逻辑
|
|
|
# 1. 初始化验证规则
|
|
|
self.case_sensitive = True
|
|
|
# 2. 设置默认验证参数
|
|
|
self.min_accuracy = 0.0
|
|
|
|
|
|
def validate_character(self, input_char: str, expected_char: str) -> bool:
|
|
|
|
|
|
# 实现字符验证逻辑
|
|
|
# 1. 比较输入字符与期望字符
|
|
|
# 2. 考虑大小写敏感性设置
|
|
|
if self.case_sensitive:
|
|
|
return input_char == expected_char
|
|
|
else:
|
|
|
return input_char.lower() == expected_char.lower()
|
|
|
# 3. 返回验证结果
|
|
|
|
|
|
def validate_word(self, input_word: str, expected_word: str) -> dict:
|
|
|
|
|
|
# 实现单词验证逻辑
|
|
|
# 1. 逐字符比较输入单词与期望单词
|
|
|
correct_count = 0
|
|
|
incorrect_count = 0
|
|
|
total_chars = max(len(input_word), len(expected_word))
|
|
|
|
|
|
# 2. 统计正确/错误字符数
|
|
|
for i in range(total_chars):
|
|
|
input_char = input_word[i] if i < len(input_word) else ""
|
|
|
expected_char = expected_word[i] if i < len(expected_word) else ""
|
|
|
|
|
|
if self.validate_character(input_char, expected_char):
|
|
|
correct_count += 1
|
|
|
else:
|
|
|
incorrect_count += 1
|
|
|
|
|
|
# 3. 计算准确率
|
|
|
accuracy = correct_count / total_chars if total_chars > 0 else 0.0
|
|
|
|
|
|
# 4. 返回验证结果字典
|
|
|
return {
|
|
|
"correct_count": correct_count,
|
|
|
"incorrect_count": incorrect_count,
|
|
|
"total_chars": total_chars,
|
|
|
"accuracy": accuracy
|
|
|
}
|
|
|
|
|
|
def calculate_accuracy(self, input_text: str, expected_text: str) -> float:
|
|
|
|
|
|
# 实现准确率计算逻辑
|
|
|
# 1. 比较输入文本与期望文本
|
|
|
# 2. 统计正确字符数
|
|
|
correct_count = 0
|
|
|
total_chars = max(len(input_text), len(expected_text))
|
|
|
|
|
|
if total_chars == 0:
|
|
|
return 1.0 # 两个空字符串认为是完全匹配
|
|
|
|
|
|
for i in range(total_chars):
|
|
|
input_char = input_text[i] if i < len(input_text) else ""
|
|
|
expected_char = expected_text[i] if i < len(expected_text) else ""
|
|
|
|
|
|
if self.validate_character(input_char, expected_char):
|
|
|
correct_count += 1
|
|
|
|
|
|
# 3. 计算准确率百分比
|
|
|
accuracy = correct_count / total_chars
|
|
|
|
|
|
# 4. 返回准确率
|
|
|
return accuracy |