Je pense que le problème vient du fait que la fonction a le même nom que le bouton lui-même. J'ai eu le même problème et en changeant le nom du bouton, le problème a été résolu. Il semblerait que le changement de nom de ton bouton ait aussi résolu le problème pour toi.
Conjecture :
Je supposerais que lorsque les noms sont les mêmes, l'interpréteur essaie d'appeler le bouton lui-même, plutôt que la fonction. Comme le bouton n'est pas une fonction, une erreur est déclenchée.
Je n'ai pas d'explication pour pourquoi ça a fonctionné pour toi quand le bouton était en dehors du formulaire, cependant. Peut-être que lorsque le bouton est en dehors du formulaire, l'interpréteur ne le relie pas automatiquement comme un objet accessible de la même manière, ou peut-être faudrait-il y accéder via un "parent".