简体   繁体   中英

Issue with kivy Clock updating label

I'm making a label that should update every second or so. I tried making it with the clock schedule but it doesn't seem to work. The weird is if I use a button to call the same function it works fine.

from kivy.app import App
from kivy.uix.boxlayout import BoxLayout
from kivy.properties import  StringProperty
from kivy.clock import Clock


class FirstLayout(BoxLayout):
    r = 0

    def __init__(self, **kwargs):
        super(FirstLayout, self).__init__(**kwargs)
        self.change = self.ids.temp_label

    def my_callback(self, *args):
        self.r += 1
        print self.r
        t = str(self.r)
        self.change.text = t


class TryApp(App):
    def build(self):
        Clock.schedule_interval(FirstLayout().my_callback, 1)
        return FirstLayout()


app = TryApp()
app.run()

the .kv file:

<FirstLayout>:
    orientation: 'vertical'
    Label:
        id: temp_label
        text: 'something'
    Button:
        on_press: root.my_callback()

When I run the code I get the prints showing that the function is running but the label doesn't update. Anything wrong with my logic there?

Thank you in advance.

PS: I know there are several questions about this here, sadly those I found were replied with answers about using the Clock which I already do

The problem is that the callback is for an instance that you don't use :

def build(self):
    Clock.schedule_interval(FirstLayout().my_callback, 1) #<--- FirstLayout created and never used
    return FirstLayout() #this one will be used :(

Instead, You need to call the method of the FirstLayout that you are using

def build(self):
    first_layout = FirstLayout() # "There should be one ..." :)
    Clock.schedule_interval(first_layout.my_callback, 1)
    return first_layout

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM