2017-07-08 1 views
0

Le point de départ de la discussion est la réponse à ma question here.Python - comparaison entre 2 applications avec une base de code très similaire - 'TypeError: change_name() prend exactement 2 arguments (1 donné)' seulement dans un

Le sujet était « Comment appeler le clavier Android à partir d'une application Kivy »

La réponse m'a fourni fonctionne parfaitement si seul, mais je l'ai essayé de réutiliser le code m'a fourni dans une application plus complexe et ça ne marche pas.

En détail: l'application est en cours d'exécution, mais quand je clique sur le Button qui doit exécuter la fonction change_name je reçois l'erreur suivante TypeError: change_name() takes exactly 2 arguments (1 given)

C'est le Button

Button: 
    text: "Me" 
    font_size: '20sp' 
    pos_hint: {'x':.0, 'y':.3} 
    size_hint: .4, .8 
    on_release: root.change_name() 

C'est le change_name Fonction à l'intérieur de la classe associée LifeCounter

class LifeCounter(BoxLayout): 

    def __init__(self, **kwargs): 
     super(LifeCounter, self).__init__(**kwargs) 
     self.hide_input = TextInput(size_hint=(None, None), 
            size=(0, 0), 
            multiline=False) 
     self.hide_input_bind = None 

    def change_name(self, instance): 
     if self.hide_input_bind: 
      self.hide_input.unbind_uid('text', self.hide_input_bind) 
     self.hide_input.text = instance.text 
     self.hide_input.focus = True 
     self.hide_input_bind = self.hide_input.fbind('text', self._update_text, instance) 

    def _update_text(self, button, instance, value): 
     button.text = value 

Ci-dessous le retraçage complet

Traceback (most recent call last): 
    File "app.py", line 182, in <module> 
    MtgLifeCounter().run() 
    File "C:\Python27\lib\site-packages\kivy\app.py", line 828, in run 
    runTouchApp() 
    File "C:\Python27\lib\site-packages\kivy\base.py", line 504, in runTouchApp 
    EventLoop.window.mainloop() 
    File "C:\Python27\lib\site-packages\kivy\core\window\window_sdl2.py", line 663, in mainloop 
    self._mainloop() 
    File "C:\Python27\lib\site-packages\kivy\core\window\window_sdl2.py", line 405, in _mainloop 
    EventLoop.idle() 
    File "C:\Python27\lib\site-packages\kivy\base.py", line 342, in idle 
    self.dispatch_input() 
    File "C:\Python27\lib\site-packages\kivy\base.py", line 327, in dispatch_input 
    post_dispatch_input(*pop(0)) 
    File "C:\Python27\lib\site-packages\kivy\base.py", line 293, in post_dispatch_input 
    wid.dispatch('on_touch_up', me) 
    File "kivy\_event.pyx", line 718, in kivy._event.EventDispatcher.dispatch (kivy\_event.c:8191) 
    File "C:\Python27\lib\site-packages\kivy\uix\behaviors\button.py", line 179, in on_touch_up 
    self.dispatch('on_release') 
    File "kivy\_event.pyx", line 714, in kivy._event.EventDispatcher.dispatch (kivy\_event.c:8146) 
    File "kivy\_event.pyx", line 1225, in kivy._event.EventObservers.dispatch (kivy\_event.c:14035) 
    File "kivy\_event.pyx", line 1109, in kivy._event.EventObservers._dispatch (kivy\_event.c:12816) 
    File "C:\Python27\lib\site-packages\kivy\lang\builder.py", line 64, in custom_callback 
    exec(__kvlang__.co_value, idmap) 
    File "<string>", line 21, in <module> 
TypeError: change_name() takes exactly 2 arguments (1 given) 

Tenir compte que je suis nouveau à la programmation, et certains concepts ne sont pas tout à fait clair pour moi et ce cas est un exemple: J'ai deux applications avec la même classe principale (seul le nom est différent) mais dans un cas court et dans l'autre non.

Pourriez-vous m'aider s'il vous plaît comprendre quelle est la différence entre les deux applications et pourquoi je reçois une erreur dans le cas ci-dessous si la fonction change_name que j'appelle avec un Button est la même chose?

+0

Cette erreur est généralement le résultat d'une tentative d'appel d'une méthode sur une classe, plutôt que sur une classe __instance__. Donc 'MyWidget.change_name (foo)' vs 'MyWidget(). Change_name (foo)'. Avec une instance de classe, python insère une référence à l'instance elle-même en tant que premier argument de l'appel de méthode. Par convention, cela s'appelle 'self'. –

+0

Si vous voulez de l'aide pour trouver ce bogue, vous devez inclure la trace complète et seulement le code pertinent. Lisez ceci: [mcve]. La traceback vous indique où l'erreur a été déclenchée. –

+0

Merci, je vais lire l'article et éditer la question! –

Répondre

3

Dans le premier exemple vous avez

on_release: root.change_name(self) 

Dans le second exemple vous avez ceci:

on_release: root.change_name() 

Vous devez appeler change_name() avec le nombre d'arguments requis. Vraisemblablement, vous voulez utiliser root.change_name(self) là aussi.

+0

Ca marche !! Merci beaucoup!!! –