简体   繁体   中英

Kivy not updating the label

I think I have ready through all similar problems but cannot get this to work.

I am trying to update a label, defined in.kv file, via a python function. The label I am trying to update is lbl_autohours

I have tried StringProperty and like below, direct reference (self.ids.lbl_autohours.text = "test123"), and it works if I call it from a button click. But I want to call it from the.py-script once some data has been recieved. And I cannot get this to work.

...
# Welcome screen
class WelcomeScreen(Screen):
    def __init__(self, **kwargs):
        super().__init__(**kwargs)
        Clock.schedule_once(self.updateInputField, 0.1)

    ... 

    def loadTimeseries(self, assetToShow, aspect):
        timeseries = get_timeseries(clientid, clientsecret, payload, assetToShow, aspect, latestValue="true")
        print("Done")
        mainApp.current = 'scr_177'
        screen_177.showData(timeseries)
...

class Screen_177(Screen):
    lbl_autohours = StringProperty()

    def __init__(self, **kwargs):
        super(Screen_177, self).__init__(**kwargs)
        self.lbl_autohours="123" #Works

    def showData(self, timeseries):
        print("Running showData")
        print(timeseries[0]['Auto_hours'])
        self.lbl_autohours = "test123" #Doesnt work 


...
mainApp = Builder.load_file("alogconn.kv")

# Main app 
class myApp(App):
    def build(self):
        return mainApp

# Run main program
if __name__ == "__main__":
    Window.clearcolor = (1, 1, 1, 1)
    screen_177 = Screen_177()
    my_app = myApp()
    my_app.run()
...


.KV file:

ScreenManagement: 
    id: screen_manager
    transition: WipeTransition(clearcolor=(1,1,1,1))
    welcomeScreen: scr_welcome
    loadingScreen: scr_loading
    screen177: scr_177
    WelcomeScreen:
        id: scr_welcome
    LoadingScreen:
        id: scr_loading
    Screen_177:
        id: scr_177
...
<Screen_177>:
    clearcolor: (1,1,1,1)
    name: 'scr_177'
    Image:
        source: 'logo.png'
        size_hint: 0.5, 0.5
        pos_hint: {"center_x":0.5, "top":1}
    Label:
        text: '177'
        font_size: 30
        size_hint: 1, 0.2
        pos_hint: {"center_x":0.5, "top":0.5}
    GridLayout:
        cols: 2
        id: data_grid
        Label:
            text: "Auto hours:"
        Label:
            id: lbl_autohours
            text: root.lbl_autohours
...

The way you referenced lbl_autohours is not really proper (I think) try this

# Welcome screen
class WelcomeScreen(Screen):
    def __init__(self, **kwargs):
        super().__init__(**kwargs)
        Clock.schedule_once(self.updateInputField, 0.1)

    ... 

    def loadTimeseries(self, assetToShow, aspect):
        timeseries = get_timeseries(clientid, clientsecret, payload, assetToShow, aspect, latestValue="true")
        print("Done")
        mainApp.current = 'scr_177'
        self.parent.ids.screen_177.showData(timeseries)
...

class Screen_177(Screen):
    label_auto = StringProperty()
    def __init__(self, **kwargs):
        super(Screen_177, self).__init__(**kwargs)
        self.label_auto = "123"

    def showData(self, timeseries):
        print("Running showData")
        print(timeseries[0]['Auto_hours'])
        self.ids.lbl_autohours.text = "test123"


...
mainApp = Builder.load_file("alogconn.kv")

# Main app 
class myApp(App):
    def build(self):
        return mainApp

# Run main program
if __name__ == "__main__":
    Window.clearcolor = (1, 1, 1, 1)
    screen_177 = Screen_177()
    my_app = myApp()
    my_app.run()
...

and this

ScreenManagement: 
    id: screen_manager
    transition: WipeTransition(clearcolor=(1,1,1,1))
    welcomeScreen: scr_welcome
    loadingScreen: scr_loading
    screen177: scr_177
    WelcomeScreen:
        id: scr_welcome
    LoadingScreen:
        id: scr_loading
    Screen_177:
        id: scr_177
...
<Screen_177>:
    clearcolor: (1,1,1,1)
    name: 'scr_177'
    Image:
        source: 'logo.png'
        size_hint: 0.5, 0.5
        pos_hint: {"center_x":0.5, "top":1}
    Label:
        text: '177'
        font_size: 30
        size_hint: 1, 0.2
        pos_hint: {"center_x":0.5, "top":0.5}
    GridLayout:
        cols: 2
        id: data_grid
        Label:
            text: "Auto hours:"
        Label:
            id: lbl_autohours
            text: root.label_atuo

since lbl_autohours already exist in Screen_177 , why not refer to it with an ids and your code will be back to live and also be careful while naming ids and properties

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