Kivy如何在函数中访问widget,没有KV只是python代码

时间:2017-06-09 01:33:43

标签: python kivy kivy-language

对不起我的基本问题,但我一直在寻找答案一小时无济于事。

这是我的基本代码:

class LoginScreen(Screen):

def __init__(self,**kwargs):
    super(LoginScreen,self).__init__(**kwargs)

    l = BoxLayout(orientation='vertical')
    sound_btn = Button(text="Play Sound", font_size = 300)
    word_bx = TextInput(multiline=False,hint_text='type here...',font_size=300)
    submit_btn = Button(text = 'Submit', font_size=300)
    submit_btn.bind(on_press = self.submitAction)
    l.add_widget(sound_btn)
    l.add_widget(word_bx)
    l.add_widget(submit_btn)
    self.add_widget(l)

def submitAction(self,*args):
    if self.word_bx.text == KivyApp.word:
        KivyApp.point+=1
    self.word_bx.text=""
    KivyApp.i +=1
    print(KivyApp.point)

正如您所看到的,在submitAction函数中我想引用word_bx小部件,但这会引发一个错误,指出Class LoginPage没有属性word_bx。然后我试图将'ids'置于自我面前,但这会引发另一个错误。我究竟做错了什么?对不起我的无能......

2 个答案:

答案 0 :(得分:1)

这些行

word_bx = TextInput(multiline=False,hint_text='type here...',font_size=300)
...
l.add_widget(word_bx)

word_bx定义为临时变量。在__init__()退出后,它不可用。如果您希望它是持久的,以便您可以从其他方法访问它,则需要使其成为该类的成员。

self.word_bx = TextInput(multiline=False,hint_text='type here...',font_size=300)
...
l.add_widget(self.word_bx)

然后就行了

self.word_bx.text=""
<{1}}中的

将引用实际存在的内容。

答案 1 :(得分:0)

我使用Lambda修复它并使该函数在类外部:

def submitAction(text):
    if text == KivyApp.word:
        KivyApp.point+=1
    KivyApp.i +=1
    print(KivyApp.point)

class LoginScreen(Screen):

    def __init__(self,**kwargs):
        super(LoginScreen,self).__init__(**kwargs)

        l = BoxLayout(orientation='vertical')
        sound_btn = Button(text="Play Sound", font_size = 300)
        word_bx = TextInput(multiline=False,hint_text='type here...',font_size=300)
        submit_btn = Button(text = 'Submit', font_size=300)
        submit_btn.bind(on_press = lambda *a:submitAction(word_bx.text))
        l.add_widget(sound_btn)
        l.add_widget(word_bx)
        l.add_widget(submit_btn)
        self.add_widget(l)