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.