Python 当值更改时,如何使我的Kivy标签动态更新?

Python 当值更改时,如何使我的Kivy标签动态更新?,python,kivy,kivy-language,Python,Kivy,Kivy Language,我正在制作一款kivy应用程序,遇到了一个无法更新标签的问题。我不确定从这里到哪里,但我希望日期值通过类ThirdMenu中的标签显示。这是我所有的代码,有点杂乱无章。我是新来的基维,并没有完全掌握所有的概念,所以很可能有很多错误 这是具有我要更改的标签的类: class ThirdMenu(Screen, FloatLayout, EventDispatcher): theme_cls = ThemeManager() pickers = None previous_date = '' a =

我正在制作一款kivy应用程序,遇到了一个无法更新标签的问题。我不确定从这里到哪里,但我希望日期值通过类ThirdMenu中的标签显示。这是我所有的代码,有点杂乱无章。我是新来的基维,并没有完全掌握所有的概念,所以很可能有很多错误

这是具有我要更改的标签的类:

class ThirdMenu(Screen, FloatLayout, EventDispatcher):
theme_cls = ThemeManager()
pickers = None
previous_date = ''
a = NumericProperty(0)

def __init__(self, **kwargs):
    super(ThirdMenu, self).__init__(**kwargs)
    global Date


    #Labels
    app = App.get_running_app()
    app.D = Label(text=str(app.a),bold = True,text_size=(None,None),font_size="30sp",pos_hint={'center_x': 0.50, 'y': .8},size_hint_y=None,size = self.size,color=(1, 0, 0, 1))
    self.add_widget(app.D)

    #Buttons

    FBBtn = Button(text ='Back to menu', size_hint =(1, .15), pos_hint ={'x': 0, 'y': 0.85}) 
    self.add_widget(FBBtn) 
    FBBtn.bind(on_press = self.change_screen_menu)



    Builder.load_string(KV)
    self.pickers = Factory.Pickers()

    self.add_widget(self.pickers)
#Screen manager / changing screens route

def change_screen_menu(self, *args):
    self.manager.transition = SlideTransition(direction ='down')
    self.manager.current = 'menu'

    print('Screen is: ' + str(self.manager.current))
def on_a(self, instance, value):
    app = App.get_running_app()
    app.D.text = str(a)
    print (a)
此类负载的KV串:

KV = """ 
<Pickers@Screen>
    name: 'pickers'

    BoxLayout:
        orientation: 'vertical'
        spacing: dp(20)
        pos_hint: {'center_x': .5, 'center_y': .5}
        size_hint_y: None
        height: self.minimum_height

        MDRaisedButton:
            text: "Open date picker"
            pos_hint: {'center_x': .5}
            opposite_colors: True
            on_release: app.show_example_date_picker()

        MDLabel:
            id: date_picker_label
            theme_text_color: 'Primary'
            halign: 'center'

        Label:
            id: Date
            theme_text_color: 'Primary'
            halign: 'center'

        BoxLayout:
            size_hint: None, None
            size: self.minimum_size
            pos_hint: {'center_x': .5}

            Label:
                theme_text_color: 'Primary'
                text: "Start on previous date"
                size_hint_x: None
                width: self.texture_size[0]
                color: 0, 0, 0, 0

            MDCheckbox:
                id: date_picker_use_previous_date"""

感谢您的阅读,我非常感谢。

只要您有标签id,就可以在主文件中更改其值

(……)

(……)

在main.py上 (……)


(…)

代码中发生了一些奇怪的事情:

  • ThirdMenu
    class不需要扩展所有这些类。只要扩展
    屏幕
    就足够了,因为
    屏幕
    已经是一个
    相对值
    和一个
    事件调度程序
  • 您的
    选择器
    类扩展了
    屏幕
    ,但您没有将其用作
    屏幕
    。您可以只扩展
    RelativeLayout
  • 您正在两个不同的位置使用
    self.pickers=Factory.pickers()
    。这将为您提供两个不同的、不相关的
    选取器
    类实例。对在
    MyApp
    类中创建的
    Pickers
    实例进行更改将不会对
    ThirdMenu
    中显示的
    Pickers
    实例产生任何影响。您可以使用类似于下面第5点的内容来访问
    show_example_date_picker()
    metod中的
    picker
    的正确实例
  • 在您的
    set_previous_date()
    方法中,您使用
    app=app.get_running_app()
    ,但在该方法中,self是应用程序
  • 最后,在
    set_previous_date()
    方法中,可以使用

    self.root.get_screen('third')。pickers.ids.Date.text=str(Date_obj)


  • 这将访问
    应用程序的
    根目录
    ,即
    屏幕管理器
    ,然后获取名为
    third
    ThirdScreen
    )的
    屏幕
    ,然后访问
    ThirdScreen
    选择器属性,然后访问
    id
    选择器词典
    ,它从中访问
    日期
    选择器
    中的
    标签
    ),并将该
    标签
    文本
    属性设置为拾取的日期。

    您能给出一个更简单的示例吗?
    class MyApp(App):
    
    theme_cls = ThemeManager()
    pickers = None
    previous_date = ''
    a = StringProperty(0)
    def build(self):
    
    
        Window.size = (750,1334)
        Window.clearcolor = (1, 1, 1, 1)
        #set up of screen manager
        sm = ScreenManager()
    
        #Adding the different screens
    
        sm.add_widget(MainMenu(name='menu'))
        sm.add_widget(MainApp(name='main'))
        sm.add_widget(SecondMenu(name='second'))
        sm.add_widget(ThirdMenu(name='third'))
        sm.add_widget(FourthMenu(name='fourth'))
        sm.add_widget(TinaMenu(name='tinamenu'))
        sm.add_widget(JohnMenu(name='johnmenu'))
    
       #Activating the screen manager
    
    
    
        return sm
    def show_example_date_picker(self, *args):
    
        self.pickers = Factory.Pickers()
        if self.pickers.ids.date_picker_use_previous_date.active:
            pd = self.previous_date
            try:
                MDDatePicker(self.set_previous_date, pd.year, pd.month, pd.day).open()
            except AttributeError:
                MDDatePicker(self.set_previous_date).open()
        else:
            MDDatePicker(self.set_previous_date).open()
    
    
    def set_previous_date(self, date_obj):
        global a
        app = App.get_running_app()
        self.previous_date = date_obj
        self.pickers.ids.date_picker_label.text = str(date_obj)
        app.a = self.pickers.ids.date_picker_label.text
        print(app.a)
        ThirdMenu.text = str(app.a)
    
    Label:
                id: Date
                theme_text_color: 'Primary'
                halign: 'center'
    
    def change_date(newValue):    
                self.Date = newValue