如何解决Python kivy 时钟周期更新
我在更改时钟更新间隔时遇到问题。我需要在运行时钟时更改间隔。我还是 kivy 库的新手,这是我的第一个更大的项目,所以我只是基本了解它是如何工作的。
我最初更改值的计划不起作用。我可以看到值发生变化,但时钟保持不变。
class MainWindow(Screen):
def __init__(self,**kwargs):
super(MainWindow,self).__init__(**kwargs)
Clock.schedule_interval(self.btn,player.clock_interval)
def reduce_clock_interval(self):
player.clock_interval -= 1
稍后使用按钮调用 reduce_clock_interval() 函数:
<SecondWindow>:
name: "second"
BoxLayout:
BoxLayout:
BoxLayout:
Button:
text: "Reduce time"
on_press: root.reduce_clock_interval()
我也尝试过使用 Clock.cancel() 来停止当前时钟并使用新值创建一个新时钟,但仍然无法让它工作。
class MainWindow(Screen):
def __init__(self,self).__init__(**kwargs)
clock = Clock.schedule_interval(self.btn,player.clock_interval)
def reduce_clock_interval(self):
player.clock_interval -= 1
Clock.cancel(MainWindow.__init__.clock)
clock = Clock.schedule_interval(self.btn,player.clock_interval)
更新:
我在修改代码的同时进行了一些更改: - 将clock_interval 移动到MainWindow 类 -将reduce_clock_interval 函数移动到SecondWindow
最小可重现示例:
1.py
from kivy.app import App
from kivy.lang import Builder
from kivy.uix.screenmanager import ScreenManager,Screen
from kivy.clock import Clock
class MainWindow(Screen):
clock_interval = 5
def __init__(self,self).__init__(**kwargs)
self.clock = Clock.schedule_interval(self.btn,self.clock_interval)
def btn(self,*args):
print(*args)
print(MainWindow.clock_interval)
class SecondWindow(Screen):
def reduce_clock_interval(self):
MainWindow.clock_interval -= 1
MainWindow.clock.cancel()
MainWindow.clock = Clock.schedule_interval(MainWindow.btn(),self.clock_interval)
class WindowManager(ScreenManager):
pass
kv = Builder.load_file("my.kv")
class MyApp(App):
def build(self):
return kv
if __name__ == '__main__':
MyApp().run()
2.kv
ScreenManager:
MainWindow:
SecondWindow:
<MainWindow>:
name: "main"
value: value
BoxLayout:
cols: 2
Button:
text: "Screen 2"
on_release:
app.root.current = "second"
<SecondWindow>:
name: "second"
BoxLayout:
cols: 2
Button:
text: "update clock"
on_press: root.reduce_clock_interval()
Button:
text: "Screen 1"
on_release:
app.root.current = "main"
解决方法
您可以通过像这样保持对 Clock
事件的引用来做您想做的事:
class MainWindow(Screen):
def __init__(self,**kwargs):
super(MainWindow,self).__init__(**kwargs)
# save a reference to the event
self.clock = Clock.schedule_interval(self.btn,player.clock_interval)
def reduce_clock_interval(self):
player.clock_interval -= 1
self.clock.cancel() # cancel the saved event
# create a new event
self.clock = Clock.schedule_interval(self.btn,player.clock_interval)
,
在您编辑的帖子中,您尝试将 clock
作为类属性访问,但它是一个实例属性。这是 reduce_clock_interval()
的更正版本:
def reduce_clock_interval(self):
main_window = App.get_running_app().root.get_screen('main')
MainWindow.clock_interval -= 1
main_window.clock.cancel()
main_window.clock = Clock.schedule_interval(main_window.btn,MainWindow.clock_interval)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。