Kivy - 为什么Label不会更新?

时间:2016-02-25 08:59:51

标签: python kivy

我想要更改标签的文字,但我无法做到,我可以看到它在shell上更改但在UI上没有。我甚至通过引用它的id直接更改标签的文本,但仍然没有更新。谁知道怎么做?

class MainApp(Screen, EventDispatcher):
title = "Top 10 Plays of 2015"

def __init__(self,*args,**kwargs):
    super(MainApp, self).__init__(*args, **kwargs)

def change_curr_title(self, title, *args):
    self.title = title
    self.ids.lblTitle.text = self.title
    print(self.ids.lblTitle.text)
pass

class OtherVideos(BoxLayout, EventDispatcher):
def __init__(self, *args, **kwargs):
    super(OtherVideos,self).__init__(*args, **kwargs)
    self.loadVideos()

def loadVideos(self):
    self.clear_widgets()
    con = MongoClient()
    db = con.nba
    vids = db.videos.find()

    vidnum = 1
    for filename in vids:
        myid = "vid" + str(vidnum)
        getfilename = filename['filename']

        button = Button(id=myid,
                      text=getfilename,
                      color=[0,0.7,1,1],
                      bold=1)
        button.bind(on_release=partial(self.change_Title, getfilename))
        self.add_widget(button)
        vidnum += 1

def change_Title(self, title, *args):
    main = MainApp()
    main.change_curr_title(title)

这是我的结构:

<MainApp>:
    ....
    BoxLayout:
    ....
        BoxLayout:
        ....some widgets
        BoxLayout:
            OtherVideos:
                ...this is where the buttons are generated...
            BoxLayout:
                Label:
                    id: lblTitle
                    text: root.title

有没有上传我的整个代码?就像文件本身一样,所以你们可以看看它。

编辑:当我在没有参数的情况下制作这样的新方法并通过kivy将其绑定到按钮时,我可以轻松更新标签

def update_label(self):
    self.ids.lblTitle.text = "New Title"

我不知道为什么动态创建事件的按钮无法正常工作。

1 个答案:

答案 0 :(得分:0)

下面:

def change_Title(self, title, *args):
    main = MainApp()  # !
    main.change_curr_title(title)

您正在创建一个新的屏幕对象(MainApp),该对象未与任何内容相关联。要使其有效,main应该链接到MainApp屏幕的现有实例。

OtherVideos框布局需要引用它,最好是在kv文件中。

修改

要创建从MainAppOtherVideos的链接,请创建ObjectProperty

class OtherVideos(BoxLayout):

    main = ObjectProperty()

    def __init__(self, *args, **kwargs):
        super(OtherVideos,self).__init__(*args, **kwargs)
        self.loadVideos()
    ...

将填入kv文件:

OtherVideos:
    main: root
    ...this is where the buttons are generated...

然后,在change_Title函数中,使用此引用:

def change_Title(self, title, *args):    
    self.main.change_curr_title(title)