这是我之前提出的关于如何更改kivy小部件属性的问题的后续跟进(更新另一个类中的kivy标签文本)。我一直试图弄清楚为什么Menuscreen上的温度读数会更新,但在Mashscreen中,文本不会更新。看起来值正在传递给eh temperature1def方法,但屏幕小部件不会更新。
此外,使用
发送值是否更好?Mashscreen().temperature1def(self.test_temp)
或使用
是更好的做法self.stuff_p.text = str(self.test_temp) + u'\u00B0F'
在MenuScreen中更新Mashscreen中的标签?提前谢谢。
from kivy.app import App
from kivy.lang import Builder
from kivy.uix.screenmanager import Screen
from kivy.properties import ObjectProperty
from kivy.clock import Clock
sm = """
ScreenManager:
#Handling the gesture event.
id:manager
canvas.before:
Color:
rgba: 0.5, 0.5, 0.5, 0.5
Rectangle:
pos: 0,0
size: 800, 480
MenuScreen:
id:MenuScreen
name:'MenuScreen'
manager: manager
Mashscreen:
id:Mashscreen
name: 'Mashscreen'
manager: manager
<MenuScreen>:
stuff_r: mainel1temp
Button:
text: "Go to mashscreen"
on_release:
root.manager.current = "Mashscreen"
Label:
id: mainel1temp
text:'0'
size_hint: None, None
size: 75,50
pos: 295,308
font_size:'22sp'
text_size: self.size
halign: 'left'
valign: 'middle'
<Mashscreen>:
stuff_p: temperature1
FloatLayout:
Label:
id: temperature1
text:'100'
size_hint: None, None
size: 75,50
pos: 50,275
font_size:'22sp'
text_size: self.size
halign: 'left'
valign: 'middle'
"""
class MenuScreen(Screen):
test_temp = 99
stuff_r = ObjectProperty(None)
def __init__(self,**kwargs):
super(MenuScreen,self).__init__(**kwargs)
Clock.schedule_interval((self.read_temp), 1)
#self.read_temp(1)
def read_temp(self, dt):
self.test_temp += 1
self.stuff_r.text = str(self.test_temp) + u'\u00B0F'
Mashscreen().temperature1def(self.test_temp)
#self.parent.ids.Mashscreen.stuff_p.text = str(self.test_temp) + u'\u00B0F'
class Mashscreen(Screen):
stuff_p = ObjectProperty(None)
def __init__(self, **kwargs):
super(Mashscreen, self).__init__(**kwargs)
def temperature1def(self, temp1):
print(temp1)
self.stuff_p.text = str(temp1)
class TestApp(App):
def build(self):
return Builder.load_string(sm)
if __name__ == '__main__':
TestApp().run()
答案 0 :(得分:1)
首先...
Mashscreen().temperature1def(self.test_temp)
这不会在UI中的temperature1def
实例上调用Mashscreen
方法,而是创建一个新的Mashscreen
实例,在其上调用方法,然后让这个对象被python收集垃圾。如果要更新UI,则需要获取要更新的窗口小部件的引用。
您可以在应用程序的根规则中定义Mashscreen
,这样您就可以通过此对象中的id来获取它。
App.get_running_app()
将返回对您当前正在运行的应用的引用,该应用具有root
属性,这是您的根小部件,规则根目录下的任何小部件都可以使用其ids
attribute来获取对其范围中定义的任何id的引用,所以。
App.get_running_app().root.ids.Mashscreen.temperature1def(self.test_temp)
肯定会更像你真正想做的事。
现在,关于如何在python kivy中做到最好的问题,我发现做类似的事情比较干净。
App.get_running_app().root.ids.Mashscreen.temperature = self.test_temp
然后将您的Mashscreen类更改为温度NumericProperty
,并更改您的kv规则以在Label
中使用此值。
<Mashscreen>:
stuff_p: temperature1
FloatLayout:
Label:
id: temperature1
text: '%s' % root.temperature
size_hint: None, None
size: 75,50
pos: 50,275
font_size:'22sp'
text_size: self.size
halign: 'left'
valign: 'middle'