我无法获得与 kivy 的两次交易之间的时间差

I can't get the time difference between two transactions with kivy

我想在 ReflexScreen class 中保留从 on_event 和 on_leave 函数中的 2 time.time () 方法返回的值。我想在 MainScreen class 中使用这些值,但是当我在 MainScreen class 中调用这些函数时,这些函数被再次调用并且它们不保留当前值。所以它 returns 我一个新值,两者的值是相同的,因为我同时调用了两者。

from kivy.lang import Builder
from kivy.core.window import Window
from kivy.uix.screenmanager import Screen
from kivymd.app import MDApp
from time import sleep, time
from random import randint
from kivymd.uix.label import MDLabel


Window.size = (300, 500)

helper = """
ScreenManager:

    MenuScreen:

    ReflexScreen:
    
    MainScreen:
    
<MainScreen>:
    id: main
    name: 'main'
    
    BoxLayout:
        orientation: 'vertical'

        MDToolbar:
            title: 'Test Your Reflex'
            elevation:10

        Widget:  
    MDRectangleFlatButton:
        text: 'P L A Y'
        on_press: root.manager.current = 'menu'
        size_hint_x: None
        size_hint_y: None
        width: 20
        height: 30
        pos_hint: {'center_x':0.5, 'center_y':0.5}
        md_bg_color: 0.2,0.3,0.6,0.1
        text_color: 0.2, 0.5, 0.6, 1
              
    MDLabel:
        id: score_label
        size_hint_x: 0.45
        size_hint_y: None
        pos_hint: {'center_x':0.5, 'center_y':0.4}             


<ReflexScreen>:
    id: reflex
    name: 'reflex'

    Button:
        id: reflex_button
        text: 'Wait Change The Color'
        font_size: '20sp'
        pos_hint: {'center_x':0.5, 'center_y':0.5}
        on_press: root.manager.current = 'main'
        size_hint_x: None
        size_hint_y: None
        width: 300
        height: 500
        background_color: 1,0,0,0.8

<MenuScreen>
    id: menu
    name: 'menu'

   
    
    BoxLayout:
        orientation: 'vertical'

        MDToolbar:
            title: 'Test Your Reflex'
            elevation:10

        Widget:

    MDRectangleFlatButton:
        text: 'P L A Y'
        on_press: root.manager.current = 'reflex'
        size_hint_x: None
        size_hint_y: None
        width: 20
        height: 30
        pos_hint: {'center_x':0.5, 'center_y':0.5}
        md_bg_color: 0.2,0.3,0.6,0.1
        text_color: 0.2, 0.5, 0.6, 1
        
         
                
"""




class ReflexScreen(Screen):

    def on_enter(self, *args):
        """Event fired when the screen is displayed: the entering animation is
        complete."""
        sleep(randint(1,6))

        self.ids.reflex_button.background_color = (0,1,0,0.8)
        start = time()
        print(start)
        self.ids.reflex_button.text = 'CLICK !!!'
        return start

    def on_leave(self, *args):
        end = time()
        print(end)
        self.ids.reflex_button.background_color = (1,0,0,0.8)
        return end


"""rscreen = ReflexScreen()
start = rscreen.on_enter()
end = rscreen.on_leave()"""

class MainScreen(Screen):


    def on_enter(self, *args):
        rscreen = ReflexScreen()
        start = rscreen.on_enter()
        end = rscreen.on_leave()
        #reflexclass = ReflexScreen()
        #final_time = reflexclass.on_leave()-reflexclass.on_enter()
        #print(final_time)
        final_time = (end-start)
        self.ids.score_label.text = f"TIME : {str(final_time)}"

如果我在两个 class 之间添加下面的代码块,并在 MainScreen class、

中使用这些变量
rscreen = ReflexScreen()
start = rscreen.on_enter()
end = rscreen.on_leave()

我可以得到我想要的结果,但是如果我这样做,kivy 会告诉我 self.ids.reflex_button.background_color = (0,1,0,0.8) File "kivy \ properties.pyx", line 863, in kivy.properties.ObservableDict .__ getattr__ AttributeError: 'super' object has no attribute returns '__getattr__' 错误。

我觉得是因为这个原因。首次加载 window 时,未分配 helper 中定义的名称值,该名称值是在第二次打开 window 时为 class 定义的。通过 print (self),我看到名称值 returns 第一次为空,第二次为满。如何解决这个问题或获取点击之间的时间差?

on_enter()on_leave() 方法为您调用。您不需要自己显式调用它们。你也不需要做:

rscreen = ReflexScreen()

GUI 中的 ReflexScreen 是在您加载 helper 字符串时创建的。上面的 rscreen 不是出现在您的 GUI 中的实例。

可以通过在ReflexScreenclass中保存startend时间来获取时差,并添加获取时差的方法:

class ReflexScreen(Screen):
    start = NumericProperty()
    end = NumericProperty()

    def on_enter(self, *args):
        """Event fired when the screen is displayed: the entering animation is
        complete."""
        sleep(randint(1,6))

        self.ids.reflex_button.background_color = (0,1,0,0.8)
        self.start = time()
        print(self.start)
        self.ids.reflex_button.text = 'CLICK !!!'
        # return start

    def on_leave(self, *args):
        self.end = time()
        print(self.end)
        self.ids.reflex_button.background_color = (1,0,0,0.8)

        # set the text of a Label in MainScreen to show time difference
        self.manager.get_screen('main').ids.score_label.text = str(self.end - self.start)
        # return end

    # a method to get the time difference
    def get_time_diff(self):
        return self.end - self.start

尚未测试此代码,因此可能存在一些错误。