我有一个应用程序向用户询问一系列8个数学问题。用户具有可以操纵标签的键盘。此标签answer_text
包含用户想要提交的答案。由于我有问题,有两个"机制"允许检查这个答案(如果是真的,下一个问题应该弹出,如果是,则不应该发生任何事情)。请考虑以下代码,其中我将禁止与此问题无关的所有内容。
from functools import partial
class KeyPad():
on_key_pad_pressed(self, btn, text):
cs = App.get_running_app().root.ids.calculation_screen
if text.isdigit():
answer_text.text += text
cs.current_answer = answer_text.text
elif text == 'clear':
answer_text.text = ''
elif text == 'submit':
cs.on_current_answer(self, btn, text)
elif text == 'joker'
Clock.schedule_once(partial(cs.on_current_answer(btn, MathBackEnd().get_true_answer()), 1)
class CalculationScreen(Screen):
current_answer = StringProperty('')
def __init__(self):
pass
def on_current_answer(self, btn, text):
true_answer = MathBackEnd().get_true_answer()
if text == true_answer:
Logger.info('CS: Cool! You got it')
else:
Logger.info('CS: Please try again.')
因此,Kivy至少有3种不同的方式来实现KeyPad(保存有关给定答案的信息)和CalculationScreen(评估给定答案)之间的连线。请注意,第一个if-case(cs.current_answer = answer_text.text
)中的方法确实有效,因为current_answer是一个StringProperty。因此,当它发生变化时,将调用其回调on_current_answer
。
提交按钮和小丑按钮都可以正常工作。如果您点击提交'你的答案得到了检查。如果你点击“joker'按下' joker'正确的答案会受到一秒的惩罚。然而,应该自动检查答案(首先在" on_key_pad_pressed" if);除了一种情况之外,这是有效的:如果当前的真实答案与前一个真实答案相同。假设第一个问题是" 3 + 4",你输入7并且游戏会自动检查你的答案。这是事实,所以你得到下一个问题" 1 + 6"。你输入7 ......没有任何反应。点击清除'清除answer_text标签并再次按7 ...没有任何反应。您点击“提交”#39;。答案得到检查,你得到下一个问题。
那么,这3种方法中的哪一种优于/劣等?我应该总是使用schedule_once(似乎非常强大)?如果两个连续(真实)的答案相等,你是否明白为什么我会在第一个案例中得到这个错误的行为?在计算过程中,事件循环会被计时器(计时用户的响应)限制,每十分之一秒更新一次。这种拥挤可能导致这种奇怪的行为吗?
非常感谢任何帮助!