Python 3.x 我能';t获取与kivy的两次交易之间的时差
我希望保留ReflexScreen类中on_事件和on_leave函数中的2个time.time()方法返回的值。我想在MainScreen类中使用这些值,但是当我在MainScreen类中调用这些函数时,会再次调用这些函数,它们不会保留当前值。所以它返回一个新值,两个值都相同,因为我同时调用了这两个值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
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