更新另一个类中的 kivy 标签文本
Posted
技术标签:
【中文标题】更新另一个类中的 kivy 标签文本【英文标题】:update a kivy label text in another class 【发布时间】:2018-01-16 16:28:02 【问题描述】:这是我之前询问过的关于如何更改 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()
【问题讨论】:
【参考方案1】:首先……
Mashscreen().temperature1def(self.test_temp)
这不会在 UI 中调用 Mashscreen
实例上的 temperature1def
方法,而是创建一个新的 Mashscreen
实例,调用其上的方法,然后让这个对象被 python 垃圾回收.如果你想更新你的 UI,你需要获取你想更新的小部件的引用。
您在应用程序的根规则中定义您的Mashscreen
,因此您可以通过它在此对象中的 id 获取它。
App.get_running_app()
将返回对您当前正在运行的应用程序的引用,该应用程序具有root
属性,这是您的根小部件,规则根部的任何小部件都可以使用其ids
属性来获取对在其范围内定义的任何 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'
【讨论】:
以上是关于更新另一个类中的 kivy 标签文本的主要内容,如果未能解决你的问题,请参考以下文章