Kivy eventloop错过了StringProperty

时间:2018-03-23 07:51:16

标签: python debugging kivy event-loop

我有一个应用程序向用户询问一系列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(似乎非常强大)?如果两个连续(真实)的答案相等,你是否明白为什么我会在第一个案例中得到这个错误的行为?在计算过程中,事件循环会被计时器(计时用户的响应)限制,每十分之一秒更新一次。这种拥挤可能导致这种奇怪的行为吗?

非常感谢任何帮助!

0 个答案:

没有答案