在kivy中不显示标签中的时间

时间:2016-03-26 14:35:48

标签: python events time kivy

我对kivy有点新意,我正试图在其中显示时间

这是python代码片段(由于任意原因删除了不必要的屏幕/部分):

from kivy.app import App
from kivy.uix.screenmanager import ScreenManager, Screen
import time
from kivy.uix.label import Label
class MyScreen(Screen):
   def update(self, *args):
        self.timeb.text = time.asctime()
        return time.asctime()
class MyApp(App):
   def build(self):
        x=MyScreen()
        root = ScreenManager()
        Clock.schedule_interval(x.update, 1)
        root.add_widget(password(name='Screen0'))
        root.add_widget(Correct(name='Screena'))
        root.add_widget(MyScreen(name='Screen1'))
        s=[x,root]
        for i in s:
            return i
if __name__ == '__main__':
    MyApp().run()

.kv文件(因任意原因删除了不必要的屏幕/部分):

MyScreen:
<MyScreen>: #
        timeb:time_box
    BoxLayout:
        orientation: "horizontal"
        pos_hint: {'top':1}
        height: "40dp"
        size_hint_y: None
        Label:
              id:time_box 
              text:root.update()
              size_hint_x: 6
              font_size:30
              font_name:"Roboto-Light.ttf"

正如你在代码中看到的那样,我添加了几个屏幕,但如果我改变了

,我的屏幕也是第一个出现的
s=[x,root]
for i in s:
      return i

return root

然后时间不会更新。

有人可以帮忙吗?

谢谢!

1 个答案:

答案 0 :(得分:1)

也许你忘记输入内容,很可能你的kv编码错了。为什么挂MyScreen:以及它分配给什么?你需要一个主要规则,但我没有看到。我将您的MyScreen:指定为<MyApp>:作为普通return MyScreen()return some_scrmanager会做的并且有效。

from kivy.app import App
from kivy.uix.screenmanager import ScreenManager, Screen
from kivy.clock import Clock
import time
from kivy.uix.label import Label
from kivy.lang import Builder

Builder.load_string('''
<MyApp>:
    MyScreen:
<MyScreen>: #
    timeb:time_box
    BoxLayout:
        orientation: "horizontal"
        pos_hint: {'top':1}
        height: "40dp"
        size_hint_y: None
        Label:
            id:time_box 
            text:root.update()
            size_hint_x: 6
            font_size:30
''')
class MyScreen(Screen):
   def update(self, *args):
        self.timeb.text = time.asctime()
        return time.asctime()
class MyApp(App):
   def build(self):
        x=MyScreen()
        root = ScreenManager()
        Clock.schedule_interval(x.update, 1)
        root.add_widget(MyScreen(name='Screen1'))
        s=[x,root]
        for i in s:
            return i
if __name__ == '__main__':
    MyApp().run()

同样的kv,但更合理的python代码会像这样讨论:

<ScreenMgr>:
    MyScreen:
<MyScreen>:
    ...

class MyScreen(Screen):
    def __init__(self, **kw):
        super(MyScreen, self).__init__(**kw)
        Clock.schedule_interval(self.update, 1)

    def update(self, *args):
        self.timeb.text = time.asctime()
        return time.asctime()

class ScreenMgr(ScreenManager):
    pass

class MyApp(App):
   def build(self):
        x=MyScreen()
        root = ScreenMgr()
        root.add_widget(MyScreen(name='Screen1'))
        return root
if __name__ == '__main__':
    MyApp().run()

因为没有必要在构建函数中从Screen类调用update(),甚至在你想要使用它的类之外,假设它会永远运行(你打算停止吗)时间?)。