2017-11-30 6 views
2

いくつかのGUIツールボックスには、テキストボックスのテキストが変更されるたびにトリガーされるon_changeなどのイベントが含まれています。kivy、テキスト変更によるイベントのトリガー方法

これによると: https://kivy.org/docs/api-kivy.uix.textinput.htmlon_textイベントは等しい必要があります。ですから、私は1つのTextInputボックスを作成しました。これは、ターミナルに表示されるボックスの内容を1文字変更するたびに発生します。

from kivy.app import App 
from kivy.uix.textinput import TextInput 
from kivy.uix.boxlayout import BoxLayout 

class LoginScreen(BoxLayout): 

    def __init__(self, **kwargs): 
     super(LoginScreen, self).__init__(**kwargs) 
     self.orientation = 'horizontal' 
     self.mytext = TextInput(text='500', multiline = False) 
     self.add_widget(self.mytext) 

     self.mytext.bind(on_text = self.calc) 
     #self.mytext.bind(on_text_validate = self.calc) 

    def calc(self, mytext): 
     print mytext.text 

class MyApp(App): 

    def build(self): 
     return LoginScreen() 

if __name__ == '__main__': 
    MyApp().run() 

はまだ、何も起こりません、明らかにcalc機能がまったくトリガされないことを意味します。これは、コードです。 on_text_validateイベントが正常に機能することを覚えておいてください。なぜなら、Enterキーを押したときにボックスの内容が端末に表示されるからです。

私はon_textイベントを誤解しましたか?もしそうなら、私はどのように目標を達成できますか?

答えて

2

on_textは、TextInputイベントではありません。

    :プロパティの変更が on_<property_name> sintaxを使用した場合

    from kivy.app import App 
    from kivy.uix.textinput import TextInput 
    from kivy.uix.boxlayout import BoxLayout 
    
    class LoginScreen(BoxLayout): 
    
        def __init__(self, **kwargs): 
         super(LoginScreen, self).__init__(**kwargs) 
         self.orientation = 'horizontal' 
         self.mytext = TextInput(text='500', multiline = False) 
         self.add_widget(self.mytext) 
         self.mytext.bind(text = self.calc) 
    
        def calc(self, instance, text): 
         print(text) 
    
    class MyApp(App): 
    
        def build(self): 
         return LoginScreen() 
    
    if __name__ == '__main__': 
        MyApp().run() 
    

    はあなたが呼ばれている自動そのコールバックを作成することができます。テキストが変化したときにコールバックを実行するには、(TextInputコントロールのテキストが格納されている)textプロパティをバインドすることができます

  • Kivy Languaje:

    from kivy.app import App 
    from kivy.uix.boxlayout import BoxLayout 
    from kivy.lang import Builder 
    
    Builder.load_string('''\ 
    <LoginScreen>: 
        orientation: "horizontal" 
        TextInput: 
         text: "500" 
         on_text: root.calc(self.text) 
    ''') 
    
    class LoginScreen(BoxLayout): 
        def __init__(self, **kwargs): 
         super(LoginScreen, self).__init__(**kwargs) 
    
        def calc(self, text): 
         print(text) 
    
    class MyApp(App): 
    
        def build(self): 
         return LoginScreen() 
    
    if __name__ == '__main__': 
        MyApp().run() 
    
  • は、ウィジェットクラスの拡張:

    from kivy.app import App 
    from kivy.uix.textinput import TextInput 
    from kivy.uix.boxlayout import BoxLayout 
    
    class My_TextInput(TextInput): 
        def __init__(self, **kwargs): 
         super(My_TextInput, self).__init__(**kwargs) 
    
        def on_text(self, instance, text): 
         print(text) 
    
    class LoginScreen(BoxLayout): 
        def __init__(self, **kwargs): 
         super(LoginScreen, self).__init__(**kwargs) 
         self.mytext = My_TextInput(text='500', multiline = False) 
         self.add_widget(self.mytext) 
    
    
    class MyApp(App): 
    
        def build(self): 
         return LoginScreen() 
    
関連する問題