(KivyMD) 如何更改 MDLabel 的文本?
(KivyMD) How to change the text of an MDLabel?
这是我的代码:
from kivymd.app import MDApp
from kivy.app import App
from kivy.lang import Builder
from kivy.uix.screenmanager import ScreenManager, Screen
n = 1
class Screen1(Screen):
pass
class Screen2(Screen):
def set_number(self, n):
self.ids["number"].text == f"{n}"
print(f"The n variabile value is: {n}")
txt = self.ids["number"].text
print(f"The displayed number is: {txt}\n")
return
sm = ScreenManager()
sm.add_widget(Screen1(name="Screen1"))
sm.add_widget(Screen2(name="Screen2"))
class TestApp(MDApp):
def build(self):
self.title = "Test app"
self.theme_cls.primary_palette = "Indigo"
self.theme_cls.primary_hue = "600"
screen = Builder.load_file("test.kv")
return screen
def arrow_up(self):
global n
if n == 5:
pass
else:
n += 1
Screen2().set_number(n)
def arrow_down(self):
global n
if n == 1:
pass
else:
n -= 1
Screen2().set_number(n)
if __name__ == '__main__':
TestApp().run()
这是我的 KV 文件:
ScreenManager:
id: scrn_mngr
Screen1:
Screen2:
<Screen1>:
id: Scrn1
name: "Screen1"
MDRectangleFlatIconButton:
text: "Next screen"
icon: "arrow-right"
pos_hint: {"center_x": .5, "center_y": .5}
width: dp(180)
on_press: root.manager.current = "Screen2"
<Screen2>
id: Scrn2
name: "Screen2"
MDFloatingActionButton:
icon: "arrow-up-bold-outline"
md_bg_color: app.theme_cls.primary_color
pos_hint: {"center_x": .4, "center_y": .5}
on_press: app.arrow_up()
MDFloatingActionButton:
icon: "arrow-down-bold-outline"
md_bg_color: app.theme_cls.primary_color
pos_hint: {"center_x": .6, "center_y": .5}
on_press: app.arrow_down()
MDLabel:
text: "Number"
halign: "center"
pos_hint: {"center_x": .5, "center_y": .55}
MDLabel:
id: number
text: "1"
halign: "center"
pos_hint: {"center_x": .5, "center_y": .5}
我正在尝试使用第二个屏幕上的两个 MDFloatingActionButton 来增加和减少变量 n。问题是MDLabel的文本属性不会随着n的增减而变化,总是显示第一个,即使n实际上变化正确。
我不知道出了什么问题,有人可以帮助我吗?谢谢!
行:
Screen2().set_number(n)
不会影响您的 GUI。当您使用 Screen2()
时,您正在创建一个 Screen2
的新实例,它与您的 GUI 中显示的实例无关。因此,调用 Screen2().set_number(n)
是在 Screen2
的实例中设置 n
,而该实例未显示在您的 GUI 中。
有几种方法可以解决这个问题。一种方法是将 arrow_up()
和 arrow_down()
方法移动到 Screen2
class 中,如下所示:
class Screen2(Screen):
def set_number(self, n):
self.ids["number"].text = f"{n}" # Note: changed == to =
print(f"The n variabile value is: {n}")
txt = self.ids["number"].text
print(f"The displayed number is: {txt}\n")
return
def arrow_up(self):
global n
if n == 5:
pass
else:
n += 1
self.set_number(n)
def arrow_down(self):
global n
if n == 1:
pass
else:
n -= 1
self.set_number(n)
然后在 'kv' 中更改 app.arrow_down()
和 app.arrow_up()
以引用 root
而不是 app
:
<Screen2>
id: Scrn2
name: "Screen2"
MDFloatingActionButton:
icon: "arrow-up-bold-outline"
md_bg_color: app.theme_cls.primary_color
pos_hint: {"center_x": .4, "center_y": .5}
on_press: root.arrow_up()
MDFloatingActionButton:
icon: "arrow-down-bold-outline"
md_bg_color: app.theme_cls.primary_color
pos_hint: {"center_x": .6, "center_y": .5}
on_press: root.arrow_down()
MDLabel:
text: "Number"
halign: "center"
pos_hint: {"center_x": .5, "center_y": .55}
MDLabel:
id: number
text: "1"
halign: "center"
pos_hint: {"center_x": .5, "center_y": .5}
这是我的代码:
from kivymd.app import MDApp
from kivy.app import App
from kivy.lang import Builder
from kivy.uix.screenmanager import ScreenManager, Screen
n = 1
class Screen1(Screen):
pass
class Screen2(Screen):
def set_number(self, n):
self.ids["number"].text == f"{n}"
print(f"The n variabile value is: {n}")
txt = self.ids["number"].text
print(f"The displayed number is: {txt}\n")
return
sm = ScreenManager()
sm.add_widget(Screen1(name="Screen1"))
sm.add_widget(Screen2(name="Screen2"))
class TestApp(MDApp):
def build(self):
self.title = "Test app"
self.theme_cls.primary_palette = "Indigo"
self.theme_cls.primary_hue = "600"
screen = Builder.load_file("test.kv")
return screen
def arrow_up(self):
global n
if n == 5:
pass
else:
n += 1
Screen2().set_number(n)
def arrow_down(self):
global n
if n == 1:
pass
else:
n -= 1
Screen2().set_number(n)
if __name__ == '__main__':
TestApp().run()
这是我的 KV 文件:
ScreenManager:
id: scrn_mngr
Screen1:
Screen2:
<Screen1>:
id: Scrn1
name: "Screen1"
MDRectangleFlatIconButton:
text: "Next screen"
icon: "arrow-right"
pos_hint: {"center_x": .5, "center_y": .5}
width: dp(180)
on_press: root.manager.current = "Screen2"
<Screen2>
id: Scrn2
name: "Screen2"
MDFloatingActionButton:
icon: "arrow-up-bold-outline"
md_bg_color: app.theme_cls.primary_color
pos_hint: {"center_x": .4, "center_y": .5}
on_press: app.arrow_up()
MDFloatingActionButton:
icon: "arrow-down-bold-outline"
md_bg_color: app.theme_cls.primary_color
pos_hint: {"center_x": .6, "center_y": .5}
on_press: app.arrow_down()
MDLabel:
text: "Number"
halign: "center"
pos_hint: {"center_x": .5, "center_y": .55}
MDLabel:
id: number
text: "1"
halign: "center"
pos_hint: {"center_x": .5, "center_y": .5}
我正在尝试使用第二个屏幕上的两个 MDFloatingActionButton 来增加和减少变量 n。问题是MDLabel的文本属性不会随着n的增减而变化,总是显示第一个,即使n实际上变化正确。 我不知道出了什么问题,有人可以帮助我吗?谢谢!
行:
Screen2().set_number(n)
不会影响您的 GUI。当您使用 Screen2()
时,您正在创建一个 Screen2
的新实例,它与您的 GUI 中显示的实例无关。因此,调用 Screen2().set_number(n)
是在 Screen2
的实例中设置 n
,而该实例未显示在您的 GUI 中。
有几种方法可以解决这个问题。一种方法是将 arrow_up()
和 arrow_down()
方法移动到 Screen2
class 中,如下所示:
class Screen2(Screen):
def set_number(self, n):
self.ids["number"].text = f"{n}" # Note: changed == to =
print(f"The n variabile value is: {n}")
txt = self.ids["number"].text
print(f"The displayed number is: {txt}\n")
return
def arrow_up(self):
global n
if n == 5:
pass
else:
n += 1
self.set_number(n)
def arrow_down(self):
global n
if n == 1:
pass
else:
n -= 1
self.set_number(n)
然后在 'kv' 中更改 app.arrow_down()
和 app.arrow_up()
以引用 root
而不是 app
:
<Screen2>
id: Scrn2
name: "Screen2"
MDFloatingActionButton:
icon: "arrow-up-bold-outline"
md_bg_color: app.theme_cls.primary_color
pos_hint: {"center_x": .4, "center_y": .5}
on_press: root.arrow_up()
MDFloatingActionButton:
icon: "arrow-down-bold-outline"
md_bg_color: app.theme_cls.primary_color
pos_hint: {"center_x": .6, "center_y": .5}
on_press: root.arrow_down()
MDLabel:
text: "Number"
halign: "center"
pos_hint: {"center_x": .5, "center_y": .55}
MDLabel:
id: number
text: "1"
halign: "center"
pos_hint: {"center_x": .5, "center_y": .5}