Quel est le but de votre fonction? Sauvegardez la variable du entry, vers la classe CM ?
Si vous faite un print() à votre fonction, vous allez voir qu'elle est appelé, avant même que vous pesez sur le bouton, pour sauvegarder et il ne fonctionne plus après.
Vous pouvez enlever le bouton et mettre un bind() à votre widget Entry()
import tkinter as tk
root = tk.Tk()
root.geometry("200x100")
def key_pressed(evt, laVariable):
#print('AxeX:', evt.x, 'AxeY:', evt.y)
_CM.prend(laVariable)
def option():
##Instance de StringVar()
var1 = tk.StringVar()
E1 = tk.Entry(root, textvariable=var1)
##Bind à la place d'un bouton (Peu remplacer la clef <'Key'>, par une autre touche)
##La fonction lambda, vous permet d'introduire des arguments dans la fonction à appeler. C'est une fonction anonyme (mot clef google)
E1.bind('<Key'>, lambda event, key=var1: key_pressed(event, key))
#E1.bind('<Key'>, lambda event: key_pressed(event, var1)) ##OU CECI..
E1.pack(side = tk.RIGHT)
class CM():
def prend(self, variable1):
self.variableA = variable1.get()
print("J'ai sauvegardé %s" % variable1.get())
##Python sait pas si vous voulez une variable ou une classe?
_CM = CM() ##Pourquoi le même nom ?
B1 = tk.Button(root, text="Yoop", command=option())
B1.pack(side=tk.LEFT)
root.mainloop()
Voici un lien, pour connaître tous les bindings et events, que vous pouvez attraper.. Surtout si vous faite un Jeu
Bonne Chance
A+
- Edité par nolimitech 26 décembre 2016 à 20:37:29
Ah oui, effectivement c'était bien les StringVar() qui posaient problème.... #hontesurmoi XD
De plus CENTER n'est pas un argument 'side' mais un argument 'anchor', comme quoi ..
En tout cas merci pour ta réponse entwanne ^-^
EDIT:
Merci nolimitech dans tout les cas, l'utilisateur doit cliquer sur un bouton, donc l'entry avait juste à être banal (mais je garde quand même votre code sous le coude #gnark).
En fait je voulais aussi que l'utilisateur puisse rentrer les flèches clavier dans les entry (car oui, le code est en fait un paramétrage de touches), sans pour autant écrire 'Up', 'Down'...
Donc j'avais effectivement pensé à la fonction .bind avec un focus (que je sais pas gérer).
Genre: quand .bind est exécuté, le focus passe à l'entry suivante. Mais là mon problème était que je ne savais pas comment faire pour faire passer le focus d'une entry à une autre dans le cas ou l'utilisateur rentrait un simple lettre (d'où la probable exploitation de votre code ^^)
En tout cas, merci pour ces réponses, je vais étudier votre lien B) :D
- Edité par Titou210Titou 27 décembre 2016 à 2:41:09
Si vous voulez redirigez le focus, voici un exemple:
entry = tk.Entry(...)
entry.place(...)
entry.focus_set() #Set focus sur ce widget Entry.
Vous avez juste à sélectionner le widget que vous voulez 'focus'. Donc, lorsqu'un entry est rempli, vous sélectionnez le prochain entry.
Très pratique, lorsque tous nos widgets sont dans un dictionnaire et que l'on a besoin que l'utilisateur, commence par un entry spécifique.
De plus, il y a tous les touches disponibles, avec le bind('<>').
Vous pouvez même ajouter la touche F1 en tout temps, pour afficher une fenêtre d'aide à l'utilisateur.
Pour ce qui est du Entry banale :), pas de problème, tous les binds fonctionnent sur tous les widgets (ou presque). Donc, si vous comprenez le principale c'est déjà pas mal, pour avancer.
Pour finir, même les flèches peuvent être gérées par la même fonction, qui contiendra les conditions. À la place de créer une fonction par flèche. Grâce à bind et lambda
L'utilisateur, pourra définir ces propres touches.
- Edité par nolimitech 28 décembre 2016 à 18:01:42
Self et attributs fonction get dans class
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
entwanne — @entwanne — Un zeste de Python — La POO en Python — Notions de Python avancées — Les secrets d'un code pythonique