我无法获得与 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 中的实例。
可以通过在ReflexScreen
class中保存start
和end
时间来获取时差,并添加获取时差的方法:
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
尚未测试此代码,因此可能存在一些错误。
我想在 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 中的实例。
可以通过在ReflexScreen
class中保存start
和end
时间来获取时差,并添加获取时差的方法:
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
尚未测试此代码,因此可能存在一些错误。