2017-06-09 5 views
0

Sorry für mein sehr grundlegendes Problem, aber ich habe um eine Antwort für eine Stunde vergebens gesucht.Kivy wie Widget in Funktion zugreifen, kein KV nur Python-Code

das ist mein Grundcode:

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) 

Wie Sie sehen können, in der submitAction Funktion möchte ich das word_bx Widget verweisen, aber das wirft einen Fehler, der besagt, dass die Klasse Loginpage kein Attribut word_bx hat. Ich habe dann versucht, "IDs" vor sich selbst zu platzieren, aber das wirft einen weiteren Fehler auf. Was mache ich falsch? sorry für meine Unfähigkeit ..

Antwort

1

Diese Linien

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

word_bx als temporäre Variable definieren. Es ist nicht verfügbar, nachdem __init__() beendet wurde. Wenn Sie möchten, dass es dauerhaft ist, so dass Sie von anderen Methoden darauf zugreifen können, müssen Sie es ein Mitglied der Klasse machen.

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

Dann wird die Linie

self.word_bx.text="" 

in submitAction() wird auf etwas beziehen, die tatsächlich existiert.

+0

Hallo danke für deine Antwort, dies ist nicht die Lösung. Ich muss die Textbox zum Layout-Widget hinzufügen, ich kann es nicht einfach als selbst erklären, kivy mag das nicht. –

+0

Sie haben Ihren Fehler gemeldet, da Class LoginPage kein Attribut word_bx hat. Ich erklärte die Ursache dafür. Ich verstehe nicht "Ich kann es nicht einfach als selbst erklären kivy mag das nicht." Kivy kann nicht feststellen, ob Ihre Variable als 'self.word_bx' oder' word_bx' deklariert ist. Kannst du etwas explizierter darüber sein, was Kivy nicht mag? Nachdem Sie den Attributfehler beseitigt haben, welchen anderen Fehler erhalten Sie? – BoarGules

+0

Ja, aber wenn ich 'self.word_bx' habe, bekomme ich eine Fehlermeldung, dass die Klasse kein Attribut word_bx hat. Ich denke, es ist meine Schuld, weil ich dir nicht den ganzen Code gezeigt habe, ich baue diese Klasse nicht, es ist Teil eines Screen-Managers, sonst hätte deine Lösung funktioniert. –

0

ich es mit Lambda fixiert und macht die Funktion der Klasse extern:

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)