(KivyMD) Как изменить текст MDLabel?

#python #kivy #kivymd

#python #kivy #kivymd

Вопрос:

Вот мой код:

 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}
  

Я пытаюсь увеличивать и уменьшать переменную n, используя две кнопки MDFloatingActionButton на втором экране. Проблема в том, что свойство text MDLabel не изменяется при увеличении или уменьшении n и всегда отображает номер один, даже если n на самом деле изменяется правильно.
Я не могу понять, что не так, может кто-нибудь мне помочь? Спасибо!

Ответ №1:

Строки:

 Screen2().set_number(n)
  

не повлияет на ваш графический интерфейс. При использовании Screen2() вы создаете новый экземпляр Screen2 , который не имеет никакого отношения к тому, который отображается в вашем графическом интерфейсе. Таким образом, вызов Screen2().set_number(n) выполняется n в экземпляре Screen2 , который не отображается в вашем графическом интерфейсе.

Есть несколько способов исправить это. Один из способов — просто переместить методы arrow_up() and arrow_down() в Screen2 класс следующим образом:

 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}