2017-11-30 4 views
2

Mehrere GUI-Toolboxen enthalten Ereignisse wie on_change, die jedes Mal ausgelöst werden, wenn sich der Text in einem Textfeld ändert.kivy, wie Ereignis durch Textänderung auslösen

Entsprechend diesem: https://kivy.org/docs/api-kivy.uix.textinput.html das Ereignis on_text sollte gleich sein. Also habe ich ein einzelnes TextInput-Feld erstellt, in dem jedesmal eine Änderung eines einzelnen Buchstabens erwartet wird, der den Inhalt der Box im Terminal anzeigt. Dies ist der Code:

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() 

Doch nichts passiert, was natürlich bedeutet, dass die calc Funktion überhaupt nicht ausgelöst wird. Beachten Sie, dass das Ereignis on_text_validate funktioniert, weil der Inhalt der Box im Terminal gedruckt wird, wenn ich die Eingabetaste drücke.

Also, habe ich das on_text Ereignis missverstanden, und wenn ja, wie kann ich mein Ziel erreichen?

Antwort

2

on_text ist kein TextInput Ereignis. Um einen Rückruf ausgeführt werden, wenn der Text ändert, können Sie text Eigenschaft binden (wobei der Text der Texteingabe gespeichert ist):

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() 

Sie können Rückruf erstellen, die automatischen aufgerufen wird, wenn eine Eigenschaftsänderung on_<property_name> sintax mit:

  • 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() 
    
  • Erweiterung Widget-Klasse:

    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() 
    
Verwandte Themen