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?
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'. –
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. –
Merci, je vais lire l'article et éditer la question! –