如何解决我无法通过基维获得两次交易之间的时差
我想保留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,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.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,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.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.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,0.8) File "kivy \ properties.pyx",line 863,in kivy.properties.ObservableDict .__ getattr__ AttributeError: 'super' object has no attribute returns '__getattr__'
错误。
我认为这是因为这个原因。第一次加载窗口时,未分配在帮助器中定义的名称值,当第二次打开窗口时,将为该类定义该名称值。通过执行打印(自我),我看到名称值第一次返回为空,第二次返回为全。如何解决此问题或获得点击之间的时差?
解决方法
将为您调用on_enter()
和on_leave()
方法。您无需自己明确调用它们。您也不需要这样做:
rscreen = ReflexScreen()
当您加载ReflexScreen
字符串时,将在GUI中创建helper
。并且上面的rscreen
不是您的GUI中显示的实例。
您可以通过将start
和end
的时间保存在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.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.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
尚未测试此代码,因此可能存在一些错误。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。