Python 3.x 我能';t获取与kivy的两次交易之间的时差

Python 3.x 我能';t获取与kivy的两次交易之间的时差,python-3.x,kivy,kivymd,Python 3.x,Kivy,Kivymd,我希望保留ReflexScreen类中on_事件和on_leave函数中的2个time.time()方法返回的值。我想在MainScreen类中使用这些值,但是当我在MainScreen类中调用这些函数时,会再次调用这些函数,它们不会保留当前值。所以它返回一个新值,两个值都相同,因为我同时调用了这两个值 from kivy.lang import Builder from kivy.core.window import Window from kivy.uix.screenmanager imp

我希望保留ReflexScreen类中on_事件和on_leave函数中的2个time.time()方法返回的值。我想在MainScreen类中使用这些值,但是当我在MainScreen类中调用这些函数时,会再次调用这些函数,它们不会保留当前值。所以它返回一个新值,两个值都相同,因为我同时调用了这两个值

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)}"
我可以得到我想要的结果,但如果我这样做,kivy会告诉我,
self.ids.reflection\u button.background\u color=(0,1,0,0.8)kivy\properties.pyx文件“kivy\properties.pyx”,第863行,在kivy.properties.observedict中。uuuu_Attr\uuuuu属性错误:“super”对象没有属性返回“\uuu getattr\uuuu”
错误

我想这是因为这个。首次加载窗口时,不会指定辅助对象中定义的名称值,该名称值是在第二次打开窗口时为类定义的。通过打印(self),我看到name值第一次返回空,第二次返回满。如何解决此问题或获取单击之间的时间差?

会为您调用enter()上的
和leave()上的
方法。您不需要自己显式地调用它们。您也不需要执行以下操作:

rscreen = ReflexScreen()
GUI中的
ReflexScreen
是在加载
helper
字符串时创建的。上面的
rscreen
不是GUI中显示的实例

您可以通过将
开始
结束
时间保存在
refleckscreen
类中,并添加获取时差的方法来获取时差:

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
尚未测试此代码,因此可能存在一些错误

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