0

我想保留 ReflexScreen 类的 on_event 和 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)}"

如果我在两个类之间添加下面的代码块并在 MainScreen 类中使用这些变量,

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__'错误。

我认为这是因为这个。首次加载窗口时,不会分配帮助程序中定义的名称值,该名称值是在第二次打开窗口时为类定义的。通过执行打印(自我),我看到名称值第一次返回空,第二次返回满。我该如何解决这个问题或获得点击之间的时间差?

4

1 回答 1

1

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

rscreen = ReflexScreen()

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

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

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

没有测试过这段代码,所以可能有一些错误。

于 2020-08-14T03:05:47.780 回答