2017-06-09 25 views
0

私の非常に基本的な問題は申し訳ありませんが、私は役に立たない1時間の答えを探しています。Kivy関数でウィジェットにアクセスする方法、KVなしPythonコード

これが私の基本的なコードです:あなたが見ることができるように

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機能でIはword_bxウィジェットを参照するが、これはクラスLoginPageが全く属性word_bxを持っていないというエラーがスローされます。私はその後、自分の前に 'ids'を配置しようとしましたが、別のエラーがスローされます。私は間違って何をしていますか?私の無能のため申し訳ありません..

答えて

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) 

その後submitAction()

self.word_bx.text="" 

ラインは、実際に存在する何かを参照します。

+0

こんにちはおかげで、これは解決策ではありません。私はレイアウトウィジェットにテキストボックスを追加する必要があります、私はそれを宣言することはできません自己kivyは好きではありません。 –

+0

Class LoginPageには属性word_bxがないため、エラーが報告されました。私はその原因を説明した。私は理解していない "私はそれを宣言することはできません自己kivyが好きではないように。 Kivyは変数が 'self.word_bx'または' word_bx'として宣言されているかどうかを知ることはできません。 Kivyが好きでないことをもう少し明示することはできますか? AttributeErrorを消した後、他のエラーはどうなりますか? – BoarGules

+0

はい、私が 'self.word_bx'を実行した場合、クラスには属性word_bxがないというエラーが表示されます。私はあなたのコード全体を見せていないので、私は自分のせいだと思う。このクラスはスクリーン・マネージャーの一員である。 –

0

が、私はそれがラムダを使用して、クラスの外部関数を作る固定:あなたの答えのための

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) 
関連する問題