2015-03-23 4 views
0

Мой первый вопрос здесь :), и, вероятно, простой для вас, ребята ... У меня проблема с изменением текста ярлыка при нажатии кнопки.Kivy - Текст ярлыка не меняется

Код приведен ниже. Я пробовал много вариантов on_press определения:

self.on_press=lambda:YellowLabel.change_text(YellowLabel) 
self.on_press=lambda:YellowLabel.change_text 

не работает

self.on_press=YellowLabel.change_text(YellowLabel) 

возвращается:

KeyError: 'text'

Я предполагаю, что это, вероятно, из-за конфликта, потому что функция вызывается перед этикетки инициализируется. Когда я попытался

self.on_press=YellowLabel.change_text

возвращается:

TypeError: change_text() missing 1 required positional argument: 'self'

Я также пробовал много других вариантов, но я просто не могу получить его. И, функция печати внутри change_text работает в примере ниже, но текст метки не изменяется. Я также попытался поставить change_text вне класса YellowLabel, но все равно не повезло ...

Что я делаю неправильно? Теперь, я думаю, что, возможно, функция change_text не очень хорошая, но я не могу понять, почему ...

p.s. я пошёл по многим связанным с Киви вопросам на этом сайте и попробовал их, но я просто не могу заставить его работать.

from kivy.app import App 
from kivy.uix.label import Label 
from kivy.uix.boxlayout import BoxLayout 
from kivy.uix.button import Button 

class RedButton(Button): 
    def __init__(self,txt="RED LABEL",**kwargs): 
     super(RedButton,self).__init__(txt="RED LABEL",**kwargs) 
     self.text=(txt) 
     self.color=[1,0,0,1] 
     self.on_press=lambda:YellowLabel.change_text(YellowLabel) 


class YellowLabel(Label): 
    def __init__(self,**kwargs): 
     super(YellowLabel,self).__init__(**kwargs) 
     self.text=("yellow") 
     self.color=[1,1,0,1] 
     self.id="yelb" 

    def change_text(self): 
     print("printed") 
     self.text=("new yellow text") 

class Window(BoxLayout): 
    def __init__(self,**kwargs): 
     super(Window,self).__init__(orientation="vertical",**kwargs) 
     self.add_widget(RedButton(txt="new red button")) 
     self.add_widget(YellowLabel()) 

class UpdateApp(App): 
    def build(self): 
     return Window() 

if __name__=="__main__": 
    UpdateApp().run() 
+0

попробовать 'self.on_press = лямбда: YellowLabel.change_text() ' – ThePavolC

+0

nope ... я получаю эту ошибку: ТипError: change_text() отсутствует 1 обязательный позиционный аргумент: 'self' – tomyslav

+0

Я бы сказал, что проблема может заключаться в том, что здесь' self.on_press = lambda: YellowLabel .change_text (YellowLabel) 'вам не хватает ссылки на YellowLable, которую вы создали в окне' __init__'. Вы должны попытаться получить виджет YellowLable из объекта Window и вызвать 'change_text()' на том, что – ThePavolC

ответ

0

Я бы сказал, что эта проблема может быть, что здесь self.on_press=lambda:YellowLabel.change_text(YellowLabel) вам не хватает ссылок на YellowLable, что вы создали в окне __init__. Вы должны попытаться получить YellowLable виджета от объекта Window и вызовите change_text() на этой

Вашего кода от комментариев (в конце концов вы поняли это сами :-)):

class Window(BoxLayout): 
     def __init__(self,**kwargs): 
      super(Window,self).__init__(orientation="vertical",**kwargs) 
      rb=RedButton(txt="new red button") 
      self.add_widget(rb) 
      yl=YellowLabel() 
      self.add_widget(yl) 
      rb.on_press=lambda:YellowLabel.change_text(yl) 
+0

благодарю вас за помощь;) – tomyslav

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