2016-02-25 3 views
0

Я хочу изменить текст метки, но я не могу этого сделать, я вижу, как это меняется на оболочке, но не в пользовательском интерфейсе. Я даже напрямую изменяю текст метки, ссылаясь на его идентификатор, но все же не обновляя его. Кто-нибудь знает, как это сделать?Kivy - Почему ярлык не обновляется?

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) 

Это строительство моего kivy:

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

Есть в любом случае, чтобы загрузить весь свой код на этот счет? как и сам файл, поэтому вы, ребята, можете посмотреть на него.

EDIT: Я могу легко обновить метку, когда я делаю новый метод, как это без параметра и связывания его с кнопкой через kivy

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

Я не знаю, почему кнопки с событиями создан динамически не работает.

ответ

0

Здесь:

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

вы создаете новый объект экрана (MainApp), который не подключен ни к чему. Чтобы он работал, main должен ссылаться на существующий экземпляр экрана MainApp.

В макете OtherVideos должна быть ссылка на нее, предпочтительно в файле kv.


Редактировать

Для того, чтобы создать ссылку из MainApp в OtherVideos, создать ObjectProperty:

class OtherVideos(BoxLayout): 

    main = ObjectProperty() 

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

, который будет заполняться в кв файла:

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

Затем в функции change_Title используйте эту ссылку:

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

Спасибо ~ дайте мне загрузить файл. – KPA

+0

@KPA Измените свой вопрос, показывая, где 'OtherVideos' помещен в файл kv - для будущих читателей. – jligeza

+0

Готово. Надеюсь, ты поможешь мне :) – KPA

Смежные вопросы