Python 3.x 使用Clock.Interval更新Kivy中的可重用标签小部件
我正在开发一个多页面的Kivy应用程序,我希望在几个页面中有一个时钟小部件。我能够将它作为一个单独的实例在每个页面上实现,但我想将它更改为一个可重用的小部件,但在间隔期间它不会更新 这是.kv文件实现Python 3.x 使用Clock.Interval更新Kivy中的可重用标签小部件,python-3.x,kivy,kivy-language,Python 3.x,Kivy,Kivy Language,我正在开发一个多页面的Kivy应用程序,我希望在几个页面中有一个时钟小部件。我能够将它作为一个单独的实例在每个页面上实现,但我想将它更改为一个可重用的小部件,但在间隔期间它不会更新 这是.kv文件实现 ScreenManager: id: screen_manager HomeScreen: id: home_screen name: 'home_screen' manager: 'screen_manager' <ClockWidget>: Lab
ScreenManager:
id: screen_manager
HomeScreen:
id: home_screen
name: 'home_screen'
manager: 'screen_manager'
<ClockWidget>:
Label:
text_size: self.size
halign: 'left'
valign: 'middle'
id: clocktime
text: root.ClockTimeDisplay
<HomeScreen>:
orientation: 'vertical'
ScrollView:
do_scroll_x: True
scroll_distance: 20
BoxLayout:
orientation: 'vertical'
ClockWidget:
我还尝试在ClockWidget内的on_load函数中触发间隔,但也没有成功
任何帮助都将不胜感激。问题是,在构建方法中创建的ClockWidget与在.kv中作为BoxLayout的子级创建的ClockWidget不同,在您的情况下,只有时钟只调用第一个方法的update\u Clock方法 另一方面,我认为没有必要在ClockWidget中创建一个新的StringProperty,因为它是一个标签,并且具有属性“text”,另一件奇怪的事情是标签作为子标签具有另一个标签 考虑到上述情况,解决方案是:
从日期时间导入日期时间
从kivy.app导入应用程序
从kivy.clock导入时钟
从kivy.lang导入生成器
从kivy.uix.screenmanager导入屏幕
从kivy.uix.label导入标签
类ClockWidget(标签):
定义初始(自我,**kwargs):
超级()
时钟。计划间隔(自更新时钟,0.1)
def更新时钟(自身,*参数):
self.text=datetime.now().strftime(“%H:%M:%S”)
类主屏幕(屏幕):
通过
职业赛船比赛(App):
def生成(自):
返回生成器加载文件(“regatta\u racer.kv”)
如果名称=“\uuuuu main\uuuuuuuu”:
赛舟会赛车手()跑步
屏幕管理器:
id:屏幕管理器
主屏幕:
id:主屏幕
名称:“主屏幕”
经理:“屏幕经理”
:
文本大小:self.size
哈利格:“左”
valign:“中间”
:
方向:“垂直”
滚动视图:
是否滚动\u x:True
滚动距离:20
盒子布局:
方向:“垂直”
时钟部件:
谢谢,伙计,这很好用。我的第一款Kivy应用程序仍然有一些差距,
class ClockWidget(Label):
ClockTimeDisplay = StringProperty()
ClockTimeDisplay = "dummy text"
text = ClockTimeDisplay
def __init__(self, **kwargs):
super(ClockWidget, self).__init__(**kwargs)
def update_clock(self, *args):
print(self.text)
#I've tried all 3 of these implimentations at one time or another.
self.ClockTimeDisplay = str(datetime.now().strftime('%H:%M:%S'))
self.text = str(datetime.now().strftime('%H:%M:%S'))
self.ids.clocktime.text = str(datetime.now().strftime('%H:%M:%S'))
return ClockTimeDisplay
class HomeScreen(Screen):
pass
class regatta_racer(App):
def build(self):
clock_widget = ClockWidget()
Clock.schedule_interval(clock_widget.update_clock, .1)
return Builder.load_file('regatta_racer.kv')
if __name__ == "__main__":
regatta_racer().run()
ScreenManager:
id: screen_manager
HomeScreen:
id: home_screen
name: 'home_screen'
manager: 'screen_manager'
<ClockWidget>:
text_size: self.size
halign: 'left'
valign: 'middle'
<HomeScreen>:
orientation: 'vertical'
ScrollView:
do_scroll_x: True
scroll_distance: 20
BoxLayout:
orientation: 'vertical'
ClockWidget: