Réorientation de l'ordre des tabulations tkinter [Résolu]

Signaler
Messages postés
14
Date d'inscription
lundi 31 août 2020
Statut
Membre
Dernière intervention
18 septembre 2020
-
Messages postés
14
Date d'inscription
lundi 31 août 2020
Statut
Membre
Dernière intervention
18 septembre 2020
-
Bonjour à tous,
dans la série : c'est en cherchant que l'on progresse, je cherche à changer l'ordre des tabulations Tkinter.
Dans mon code :
#-------------------------------------------------------------------------------
# Name: FrancsEuros.py
# Purpose: Une conversion Francs Euros ou Euros Francs facile
#
# Author: BALDONI GUY
#
# Created: 07/09/2020
# Copyright: (c) BALDONI GUY 2020
# Licence: <your licence>
#-------------------------------------------------------------------------------
# coding: utf8
from tkinter import *
import tkinter.messagebox
from PIL import ImageTk, Image
import pygame
import os
import winsound
from time import *
from time import gmtime, strftime, sleep
import locale
import time
import datetime
from math import *
from winsound import *

# Pour la date en français
locale.setlocale(locale.LC_TIME,'')

# Définition fréquence et durée des beep de winsound
frequency = 2500 # Set Frequency To 2500 Hertz
duration = 500 # Set Duration To 500 ms == 1/2 second

# Définition d'une fonte barrée et non barrée
fontbarre = "-family {DejaVu Sans} -size 8 -weight normal -underline 0 -overstrike 1"
fontnormal = "-family {DejaVu Sans} -size 8 -weight normal -underline 0 -overstrike 0"

def touche_clav(event):
btn_effacer["state"] = "normal"

def touche_tabulation(event):
print('Vous avez appuyez sur la touche tabulation')
print(root.focus_get())
print(Francs.focus_get())
if Francs.focus_get() == '.!button2' :
print('Focus sur Bouton2')


#*******************************************************************************
# MUSIQUE
# Fonction de choix avec ou sans musique
def choix_musique():
global compteur
if btn_couperMusique['font'] == fontbarre:
btn_couperMusique['font'] = fontnormal
couper_musique()
else:
btn_couperMusique['font'] = fontbarre
jouer_musique('oiseau.wav')
compteur = 0


# On joue une petite musique
def jouer_musique(nom_musique):
pygame.mixer.init()
pygame.mixer.music.load(nom_musique)
pygame.mixer.music.play()

# Fonction d'arrêt de la musique
def couper_musique():
pygame.mixer.music.stop()
#*******************************************************************************

#*******************************************************************************
# Fonction de destruction de la fenêtre principale suite à un événement clavier
def exit(event):
root.destroy()

#*******************************************************************************

#*******************************************************************************
# Fonction de choix d'un mode Francs->Euros ou Euros->Francs
def switch_feef():
# On efface les deux champs de saisie
Euros.delete(0 , END)
Francs.delete(0 , END)
if btn_ch_mode["text"] == "Francs -> Euros" :
btn_ch_mode["text"] = "Euros -> Francs"
root.title("Conversion actuelle Francs->Euros")
Francs.focus_set()
else:
btn_ch_mode["text"] = "Francs -> Euros"
root.title("Conversion actuelle Euros->Francs")
Euros.focus_set()
btn_effacer["state"] = "disabled"

#*******************************************************************************

#*******************************************************************************
# On effectue la conversion
def convert(event):
# Si Francs et Euros sont remplis et que nous sommes en mode Francs -> Euros
# l'utilisateur veut faire un autre calcul alors, on refait le calcul
if ((Francs.get() != "") and (Euros.get() != "")) and btn_ch_mode["text"] == "Euros -> Francs":
try :
tmp = float(Francs.get()) * 0.1524
except :
tkinter.messagebox.showerror('Francs', '( ' + Francs.get() +' )' + ' n\'est pas une somme correcte')
Francs.insert(0, 'Saisie incorrecte')
winsound.Beep(frequency, duration)
btn_effacer["state"] = "normal"
effacer()
else :
round = float("%0.2f" % tmp)
strround = str(round)
Euros.delete(0 , END)
Euros.insert(0, strround + ' €')
# Si Francs et Euros sont remplis et que nous sommes en mode Euros -> Francs
# l'utilisateur veut faire un autre calcul alors, on refait le calcul
elif ((Francs.get() != "") and (Euros.get() != "")) and btn_ch_mode["text"] == "Francs -> Euros":
try :
tmp = float(Euros.get()) * 6.5596
except :
tkinter.messagebox.showerror('Euros', '( ' + Euros.get() +' )' + ' n\'est pas une somme correcte')
winsound.Beep(frequency, duration)
btn_effacer["state"] = "normal"
effacer()
Euros.insert(0, 'Saisie incorrecte')
else :
round = float("%0.2f" % tmp)
strround = str(round)
Francs.delete(0 , END)
Francs.insert(0, strround + ' F')
# Sinon fonctionnement normal
else :
x = Francs.get()
y = Euros.get()
# Si Francs et Euros sont vides le bouton Effacer est grisé
if (x == "") and (y == ""):
btn_effacer["state"] = "disabled"
else:
btn_effacer["state"] = "normal"

if (x != "" ) and (y == ""):
# Vérification de la bonne saisie de Francs
try :
tmp = float(x) * 0.1524
except :
# On efface le champ Francs et on affiche l'erreur
Francs.delete(0 , END)
Francs.insert(0, 'Saisie incorrecte')
winsound.Beep(frequency, duration)
tkinter.messagebox.showerror('Francs', '( ' + x +' )' + ' n\'est pas une somme correcte')
else :
# C'est bon alors on affiche le résultat
round = float("%0.2f" % tmp)
strround = str(round)
Euros.delete(0 , END)
Euros.insert(0, strround + ' €')
Francs.focus_set()
elif (y != "") and (x == ""):
# Vérification de la bonne saisie d'Euros
try :
tmp = float(y) * 6.5596
except :
# On efface le champ Euros et on affiche l'erreur
Euros.delete(0 , END)
Euros.insert(0, 'Saisie incorrecte')
winsound.Beep(frequency, duration)
tkinter.messagebox.showerror('Euros', '( ' + y +' )' + ' n\'est pas une somme correcte')
else :
# C'est bon alors on affiche le résultat
round = float("%0.2f" % tmp)
strround = str(round)
Francs.delete(0 , END)
Francs.insert(0, strround + ' F')
Euros.focus_set()

#*******************************************************************************

#*******************************************************************************
# Efface les deux champs de saisie et grise le bouton Effacer
def effacer():
# On efface les deux champs de saisie
Euros.delete(0 , END)
Francs.delete(0 , END)
# Le bouton Effacer est grisé
btn_effacer["state"] = "disabled"
# Le curseur clignote dans le champ Francs
Francs.focus_set()
root.title("Conversion actuelle Francs->Euros")

#*******************************************************************************
# Affichage d'une fenêtre A propos
def aff_infos(e) :
btn_effacer["state"] = "normal"
feninf = Toplevel()
feninf.config(bg='lightblue')
geo1=root.winfo_geometry()
geox=root.winfo_rootx()
geoy=root.winfo_rooty()
feninf.geometry("300x260+"+str(geox-50)+"+"+str(geoy-22))
feninf.title("À propos de FrancsEuros")
feninf.resizable(height = False, width = False)
labinf=Label(feninf, bg='lightblue',fg='black',width=50,font=('Arial', 9),
text= "\nFrancseuros v1.0\n\n"
"Programme écrit en Python / Tkinter\n"
"et distribué sous licence GNU GPL.\n\n"
"© 2020 Guy Baldoni\n"
"( )\n\n"
"Ce programme propose une conversion \n"
"Francs Euros ou Euros Francs facile ! \n"
"\n"
" ")
labinf.pack(pady=5)
bouf3=Button(feninf, text="Fermer", command=feninf.destroy, fg='blue', relief=RAISED)
bouf3.pack(side=BOTTOM,pady=10)
feninf.grab_set()
feninf.wait_window()
#*******************************************************************************

# Fenêtre principale
root = Tk()
root.geometry("430x160")

#*******************************************************************************
# Affichage de la date courante mise à jour en permanence
global compteur
compteur = 0
text = StringVar()
heure_syst = Label(root,fg = 'blue',textvariable = text)
heure_syst.pack(side = TOP)

def majheure():
if ((Francs.get() == "") and (Euros.get() == "")):
btn_effacer["state"] = "disabled"
# Si le curseur clignote dans le champ Francs mise à jour cohérente
if str(root.focus_get()) == '.!entry' :
btn_ch_mode["text"] = "Euros -> Francs"
root.title("Conversion actuelle Francs->Euros")
# Si le curseur clignote dans le champ Euros mise à jour cohérente
elif str(root.focus_get()) == '.!entry2' :
btn_ch_mode["text"] = "Francs -> Euros"
root.title("Conversion actuelle Euros->Francs")
Euros.focus_set()
global compteur
if btn_couperMusique['font'] == fontbarre:
compteur = compteur + 1
if btn_couperMusique['font'] == fontbarre and compteur > 540:
btn_couperMusique['font'] = fontnormal
compteur = 0
# Commande qui rappelle la fonction majheure après 300ms
time.sleep(0.3)
root.after(50,majheure)
text.set(time.strftime("%A %d %B %Y %H:%M:%S"))
root.after(50, majheure)
#*******************************************************************************

jouer_musique('oiseau.wav')

# Affichage d'un petit logo dans la fenêtre
img = ImageTk.PhotoImage(Image.open('h.gif'))
panel = Label(root, image = img)
panel.place(x = 10, y = 10)
# Test de mise en couleur
#root.configure(bg='cyan')
# Place l'application au centre de l'écran
x = (root.winfo_screenwidth() - root.winfo_reqwidth()) / 2
y = (root.winfo_screenheight() - root.winfo_reqheight()) / 2
root.geometry("+%d+%d" % (x, y))
# Définition du titre de l'application au départ
root.title("Conversion actuelle Francs->Euros")
# Interdire l'agrandissement de la fenêtre
root.resizable(height = False, width = False)
root.event_delete
root.size()
#*******************************************************************************

#*******************************************************************************
# Boutons, étiquettes et champs de saisie
#*******************************************************************************
#*******************************************************************************
# Bouton d'arrêt de la musique
btn_couperMusique = Button(root, text="Chants", fg ='blue', command = choix_musique, relief=RAISED)
btn_couperMusique.place(x = 20, y = 125)
btn_couperMusique['font'] = fontbarre
#*******************************************************************************

#*******************************************************************************
# Bouton de switch de la conversion Francs->Euros ou Euros->Francs ainsi que son étiquette
mode = Label(root,text="Choix du mode ->")
mode.place(x = 230, y = 30)
btn_ch_mode = Button(root, text="Euros -> Francs", fg ='blue', command = switch_feef , relief = RAISED)
btn_ch_mode.place ( x = 330, y = 25)
#*******************************************************************************


#*******************************************************************************
# Saisie du champ Francs
lblFrancs = Label(root,text="Somme en Francs : ")
lblFrancs.place(x = 110, y = 20)
Francs = Entry(root, width = 15)
Francs.place( x = 120, y = 40)
# Le curseur clignote dans le champ Francs
Francs.focus_set()
#*******************************************************************************

#*******************************************************************************
# Saisie du champ Euros
lblEuros = Label(root,text="Somme en Euros : ")
Euros = Entry(root, width = 15 )
lblEuros.place(x = 110, y = 60)
Euros.place(x = 120, y = 80)
#*******************************************************************************

#*******************************************************************************
# Le bouton Effacer est créé
btn_effacer = Button(root, text="Effacer", fg ='blue', command = effacer, relief = RAISED)
btn_effacer.place(x = 230, y = 60)
# Par défaut le bouton Effacer est grisé car il n'y a rien à effacer
btn_effacer["state"] = "disabled"

#*******************************************************************************

#*******************************************************************************
# Le bouton Quitter est créé
bouton2 = Button(root, text="Quitter", fg ='blue', command = root.destroy, relief = RAISED)
bouton2.place(x = 375, y = 130)
#*******************************************************************************

#*******************************************************************************
# Etiquette du mode d'emploi
modeEmploi = Label(root,text="Enter pour calculer,\nQ ou Echap pour quitter\n H--> A propos de...")
modeEmploi.place( x = 100, y = 100)
#*******************************************************************************
#*******************************************************************************

#*******************************************************************************

# Détection d'une touche quelconque du clavier, de la touche Enter Echap ou Q
root.bind('<Tab>', touche_tabulation)
root.bind('<Key>', touche_clav)
root.bind('<Return>', convert)
root.bind("<Escape>", exit)
root.bind("q", exit)
root.bind("Q", exit)
root.bind('h',aff_infos)
root.bind('H',aff_infos)
root.mainloop()
# Quand on quitte le programme, on arrête la musique et on dit au revoir

couper_musique()
jouer_musique('aurevoir.wav')
#*******************************************************************************
#*******************************************************************************
#*******************************************************************************

au niveau des lignes 40 à 45 dans la fonction <touche_tabulation> je voudrais effectuer une réaffectation du focus mais le <if> de la ligne 44 n'est jamais vrai.
D'autre part, j'ai essayé de changer l'affectation du focus dans la même fonction et ça ne fonctionne pas.
Pouvez-vous m'aider à résoudre cette énigme ?
Merci par avance

7 réponses

Messages postés
13276
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
24 novembre 2020
746
bonjour, peux-tu préciser "python" dans les balises de code quand tu partages du python, comme expliqué: https://codes-sources.commentcamarche.net/faq/11288-les-balises-de-code
par ailleurs, nous pourrons plus facilement t'aider si tu simplifies ton programme, pour ne garder que la partie relative aux tabulations tkinter.
Messages postés
14
Date d'inscription
lundi 31 août 2020
Statut
Membre
Dernière intervention
18 septembre 2020

Merci beaucoup de ton effort yg_be.
Voici le code python 3.8.5 épuré :
#-------------------------------------------------------------------------------
# Name: FrancsEuros.py
# Purpose: Une conversion Francs Euros ou Euros Francs facile
#
# Author: BALDONI GUY
#
# Created: 07/09/2020
# Copyright: (c) BALDONI GUY 2020
# Licence: <your licence>
#-------------------------------------------------------------------------------
# coding: utf8
from tkinter import *
import tkinter.messagebox
import os
import winsound
import datetime
from math import *
from winsound import *



# Définition fréquence et durée des beep de winsound
frequency = 2500 # Set Frequency To 2500 Hertz
duration = 500 # Set Duration To 500 ms == 1/2 second

# Définition d'une fonte barrée et non barrée
fontbarre = "-family {DejaVu Sans} -size 8 -weight normal -underline 0 -overstrike 1"
fontnormal = "-family {DejaVu Sans} -size 8 -weight normal -underline 0 -overstrike 0"

def touche_clav(event):
btn_effacer["state"] = "normal"

def touche_tabulation(event):
print('Vous avez appuyé sur la touche tabulation')
print(root.focus_get())
print(Francs.focus_get())
if Francs.focus_get() == '.!button2' :
print('Focus sur Bouton2')




#*******************************************************************************
# Fonction de destruction de la fenêtre principale suite à un événement clavier
def exit(event):
root.destroy()

#*******************************************************************************

#*******************************************************************************
# Fonction de choix d'un mode Francs->Euros ou Euros->Francs
def switch_feef():
# On efface les deux champs de saisie
Euros.delete(0 , END)
Francs.delete(0 , END)
if btn_ch_mode["text"] == "Francs -> Euros" :
btn_ch_mode["text"] = "Euros -> Francs"
root.title("Conversion actuelle Francs->Euros")
Francs.focus_set()
else:
btn_ch_mode["text"] = "Francs -> Euros"
root.title("Conversion actuelle Euros->Francs")
Euros.focus_set()
btn_effacer["state"] = "disabled"

#*******************************************************************************


#*******************************************************************************
# Efface les deux champs de saisie et grise le bouton Effacer
def effacer():
# On efface les deux champs de saisie
Euros.delete(0 , END)
Francs.delete(0 , END)
# Le bouton Effacer est grisé
btn_effacer["state"] = "disabled"
# Le curseur clignote dans le champ Francs
Francs.focus_set()
root.title("Conversion actuelle Francs->Euros")


# Fenêtre principale
root = Tk()
root.geometry("430x160")


# Test de mise en couleur
#root.configure(bg='cyan')
# Place l'application au centre de l'écran
x = (root.winfo_screenwidth() - root.winfo_reqwidth()) / 2
y = (root.winfo_screenheight() - root.winfo_reqheight()) / 2
root.geometry("+%d+%d" % (x, y))
# Définition du titre de l'application au départ
root.title("Conversion actuelle Francs->Euros")
# Interdire l'agrandissement de la fenêtre
root.resizable(height = False, width = False)
root.event_delete
root.size()
#*******************************************************************************

#*******************************************************************************
# Boutons, étiquettes et champs de saisie
#*******************************************************************************


#*******************************************************************************
# Bouton de switch de la conversion Francs->Euros ou Euros->Francs ainsi que son étiquette
mode = Label(root,text="Choix du mode ->")
mode.place(x = 230, y = 30)
btn_ch_mode = Button(root, text="Euros -> Francs", fg ='blue', command = switch_feef , relief = RAISED)
btn_ch_mode.place ( x = 330, y = 25)
#*******************************************************************************


#*******************************************************************************
# Saisie du champ Francs
lblFrancs = Label(root,text="Somme en Francs : ")
lblFrancs.place(x = 110, y = 20)
Francs = Entry(root, width = 15)
Francs.place( x = 120, y = 40)
# Le curseur clignote dans le champ Francs
Francs.focus_set()
#*******************************************************************************

#*******************************************************************************
# Saisie du champ Euros
lblEuros = Label(root,text="Somme en Euros : ")
Euros = Entry(root, width = 15 )
lblEuros.place(x = 110, y = 60)
Euros.place(x = 120, y = 80)
#*******************************************************************************

#*******************************************************************************
# Le bouton Effacer est créé
btn_effacer = Button(root, text="Effacer", fg ='blue', command = effacer, relief = RAISED)
btn_effacer.place(x = 230, y = 60)
# Par défaut le bouton Effacer est grisé car il n'y a rien à effacer
btn_effacer["state"] = "disabled"

#*******************************************************************************

#*******************************************************************************
# Le bouton Quitter est créé
bouton2 = Button(root, text="Quitter", fg ='blue', command = root.destroy, relief = RAISED)
bouton2.place(x = 375, y = 130)
#*******************************************************************************

#*******************************************************************************
# Etiquette du mode d'emploi
modeEmploi = Label(root,text="Enter pour calculer,\nQ ou Echap pour quitter\n H--> A propos de...")
modeEmploi.place( x = 100, y = 100)
#*******************************************************************************
#*******************************************************************************

#*******************************************************************************

# Détection d'une touche quelconque du clavier, de la touche Enter Echap ou Q
root.bind('<Tab>', touche_tabulation)
root.bind('<Key>', touche_clav)

root.bind("<Escape>", exit)
root.bind("q", exit)
root.bind("Q", exit)

root.mainloop()
# Quand on quitte le programme, on arrête la musique et on dit au revoir


#*******************************************************************************
#*******************************************************************************
#*******************************************************************************


c'est toujours la fonction <touche_tabulation> qui m'intéresse et qui me fais soucis.
Merci encore à tous ceux qui me répondront.
Messages postés
13276
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
24 novembre 2020
746
je répète ma demande: peux-tu préciser "python" dans les balises de code quand tu partages du python, comme expliqué ici: https://codes-sources.commentcamarche.net/faq/11288-les-balises-de-code
je n'ai pas bien compris ce que tu voulais faire. tu n'expliques pas le comportement attendu ni le comportement obtenu.
ceci fonctionnera peut-être mieux:
if str(Francs.focus_get()) == '.!button2' :
Messages postés
13276
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
24 novembre 2020
746
par ailleurs, la fonction lift() permet de contrôler la séquence de tabulation.
Messages postés
14
Date d'inscription
lundi 31 août 2020
Statut
Membre
Dernière intervention
18 septembre 2020

Merci yg_be pour ta patience, j'apprends.
Mon code :
<code python>
#-------------------------------------------------------------------------------
# Name: FrancsEuros.py
# Purpose: Une conversion Francs Euros ou Euros Francs facile
#
# Author: BALDONI GUY
#
# Created: 07/09/2020
# Copyright: (c) BALDONI GUY 2020
# Licence: <your licence>
#-------------------------------------------------------------------------------
# coding: utf8
from tkinter import *
import os
from math import *


def touche_clav(event):
btn_effacer["state"] = "normal"

def touche_tabulation(event):
print('Vous avez appuyé sur la touche tabulation')
print(root.focus_get())
if str(Francs.focus_get()) == '.!button2' :
print('Focus sur Bouton2')


#*******************************************************************************
# Fonction de destruction de la fenêtre principale suite à un événement clavier
def exit(event):
root.destroy()

#*******************************************************************************

#*******************************************************************************
# Fonction de choix d'un mode Francs->Euros ou Euros->Francs
def switch_feef():
# On efface les deux champs de saisie
Euros.delete(0 , END)
Francs.delete(0 , END)
if btn_ch_mode["text"] == "Francs -> Euros" :
btn_ch_mode["text"] = "Euros -> Francs"
root.title("Conversion actuelle Francs->Euros")
Francs.focus_set()
else:
btn_ch_mode["text"] = "Francs -> Euros"
root.title("Conversion actuelle Euros->Francs")
Euros.focus_set()
btn_effacer["state"] = "disabled"

#*******************************************************************************


#*******************************************************************************
# Efface les deux champs de saisie et grise le bouton Effacer
def effacer():
# On efface les deux champs de saisie
Euros.delete(0 , END)
Francs.delete(0 , END)
# Le bouton Effacer est grisé
btn_effacer["state"] = "disabled"
# Le curseur clignote dans le champ Francs
Francs.focus_set()
root.title("Conversion actuelle Francs->Euros")


# Fenêtre principale
root = Tk()
root.geometry("430x160")

# Définition du titre de l'application au départ
root.title("Conversion actuelle Francs->Euros")
# Interdire l'agrandissement de la fenêtre
root.resizable(height = False, width = False)
root.event_delete
root.size()
#*******************************************************************************

#*******************************************************************************
# Boutons, étiquettes et champs de saisie
#*******************************************************************************

#*******************************************************************************
# Bouton de switch de la conversion Francs->Euros ou Euros->Francs ainsi que son étiquette
mode = Label(root,text="Choix du mode ->")
mode.place(x = 230, y = 30)
btn_ch_mode = Button(root, text="Euros -> Francs", fg ='blue', command = switch_feef , relief = RAISED)
btn_ch_mode.place ( x = 330, y = 25)
#*******************************************************************************


#*******************************************************************************
# Saisie du champ Francs
lblFrancs = Label(root,text="Somme en Francs : ")
lblFrancs.place(x = 110, y = 20)
Francs = Entry(root, width = 15)
Francs.place( x = 120, y = 40)
# Le curseur clignote dans le champ Francs
Francs.focus_set()
#*******************************************************************************

#*******************************************************************************
# Saisie du champ Euros
lblEuros = Label(root,text="Somme en Euros : ")
Euros = Entry(root, width = 15 )
lblEuros.place(x = 110, y = 60)
Euros.place(x = 120, y = 80)
#*******************************************************************************

#*******************************************************************************
# Le bouton Effacer est créé grisé car il n'y a rien à effacer
btn_effacer = Button(root, text="Effacer", fg ='blue', state = 'disabled',command = effacer, relief = RAISED)
btn_effacer.place(x = 230, y = 60)

#*******************************************************************************

#*******************************************************************************
# Le bouton Quitter est créé
bouton2 = Button(root, text="Quitter", fg ='blue', command = root.destroy, relief = RAISED)
bouton2.place(x = 375, y = 130)
#*******************************************************************************

#*******************************************************************************

# Détection d'une touche quelconque du clavier, de la touche Enter Echap ou Q
root.bind('<Tab>', touche_tabulation)
root.bind('<Key>', touche_clav)

root.bind("<Escape>", exit)
root.bind("q", exit)
root.bind("Q", exit)

root.mainloop()

#*******************************************************************************
#*******************************************************************************
#*******************************************************************************
</code>
En fait lorsque l'on appuie sur tabulation à plusieurs reprises le focus passe par
les champs de saisie puis sur les boutons.
Je voudrais que l'on passe d'un champ à l'autre sans passer par les boutons.
Merci de ta compréhension.
Baldo35
Messages postés
641
Date d'inscription
lundi 23 mars 2020
Statut
Membre
Dernière intervention
24 novembre 2020
79
Bonjour Baldo,

Toujours pas !

Ca doit ressembler à ceci:
# coding: utf8
from tkinter import *
import os
from math import *


def touche_clav(event):
	btn_effacer["state"] = "normal"

def touche_tabulation(event):
	print('Vous avez appuyé sur la touche tabulation')
	print(root.focus_get())
	if str(Francs.focus_get()) == '.!button2' :
		print('Focus sur Bouton2')
Messages postés
14
Date d'inscription
lundi 31 août 2020
Statut
Membre
Dernière intervention
18 septembre 2020

Bonjour Phil,
le code que tu me donnes fonctionne bien mais je voudrais :
En fait lorsque l'on appuie sur tabulation à plusieurs reprises le focus passe par
les champs de saisie puis sur les boutons.
Je voudrais que l'on passe d'un champ à l'autre sans passer par les boutons.
Merci de ta compréhension.
Baldo35
Messages postés
641
Date d'inscription
lundi 23 mars 2020
Statut
Membre
Dernière intervention
24 novembre 2020
79
Je ne t'ai pas donné de code qui fonctionne bien

Je t'ai mis les 14 premières lignes de ton code avec les balises de code placées correctement

pour que tu voie à quoi ca doit ressembler exactement

Il faut donc que tu remettes ton code complet avec les balises, ca doit apparaitre exactement

comme sur mon exemple, avec les couleurs, les indentations et tout ...
Messages postés
14
Date d'inscription
lundi 31 août 2020
Statut
Membre
Dernière intervention
18 septembre 2020

Mille excuses Phil,
j'essai :
#-------------------------------------------------------------------------------
# Name:        FrancsEuros.py
# Purpose:     Une conversion Francs Euros ou Euros Francs facile
#
# Author:      BALDONI GUY
#
# Created:     07/09/2020
# Copyright:   (c) BALDONI GUY 2020
# Licence:     <your licence>
#-------------------------------------------------------------------------------
# coding: utf8
from tkinter import *
import os
from math import *


def touche_clav(event):
    btn_effacer["state"] = "normal"

def touche_tabulation(event):
    print('Vous avez appuyé sur la touche tabulation')
    print(root.focus_get())
    if str(Francs.focus_get()) == '.!entry2' :
        print('Focus sur Bouton3')
        Francs.focus_set()

#*******************************************************************************
# Fonction de destruction de la fenêtre principale suite à un événement clavier
def exit(event):
   root.destroy()

#*******************************************************************************

#*******************************************************************************
# Fonction de choix d'un mode Francs->Euros ou Euros->Francs
def switch_feef():
    # On efface les deux champs de saisie
    Euros.delete(0 , END)
    Francs.delete(0 , END)
    if  btn_ch_mode["text"] == "Francs -> Euros" :
        btn_ch_mode["text"] = "Euros -> Francs"
        root.title("Conversion actuelle Francs->Euros")
        Francs.focus_set()
    else:
        btn_ch_mode["text"] = "Francs -> Euros"
        root.title("Conversion actuelle Euros->Francs")
        Euros.focus_set()
    btn_effacer["state"] = "disabled"

#*******************************************************************************


#*******************************************************************************
# Efface les deux champs de saisie et grise le bouton Effacer
def effacer():
         # On efface les deux champs de saisie
        Euros.delete(0 , END)
        Francs.delete(0 , END)
        # Le bouton Effacer est grisé
        btn_effacer["state"] = "disabled"
        # Le curseur clignote dans le champ Francs
        Francs.focus_set()
        root.title("Conversion actuelle Francs->Euros")


# Fenêtre principale
root = Tk()
root.geometry("430x160")

# Définition du titre de l'application au départ
root.title("Conversion actuelle Francs->Euros")
# Interdire l'agrandissement de la fenêtre
root.resizable(height = False, width = False)
root.event_delete
root.size()
#*******************************************************************************

#*******************************************************************************
# Boutons, étiquettes et champs de saisie
#*******************************************************************************

#*******************************************************************************
# Bouton de switch de la conversion Francs->Euros ou Euros->Francs ainsi que son étiquette
mode = Label(root,text="Choix du mode ->")
mode.place(x = 230, y = 30)
btn_ch_mode = Button(root, text="Euros -> Francs", fg ='blue', command = switch_feef , relief = RAISED)
btn_ch_mode.place ( x = 330, y = 25)
#*******************************************************************************


#*******************************************************************************
# Saisie du champ Francs
lblFrancs =  Label(root,text="Somme en Francs : ")
lblFrancs.place(x = 110, y = 20)
Francs = Entry(root, width = 15)
Francs.place( x = 120, y = 40)
# Le curseur clignote dans le champ Francs
Francs.focus_set()
#*******************************************************************************

#*******************************************************************************
# Saisie du champ Euros
lblEuros = Label(root,text="Somme en Euros : ")
Euros = Entry(root, width = 15 )
lblEuros.place(x = 110, y = 60)
Euros.place(x = 120, y = 80)
#*******************************************************************************

#*******************************************************************************
# Le bouton Effacer est créé grisé car il n'y a rien à effacer
btn_effacer = Button(root, text="Effacer", fg ='blue', state = 'disabled',command = effacer, relief = RAISED)
btn_effacer.place(x = 230, y = 60)

#*******************************************************************************

#*******************************************************************************
# Le bouton Quitter est créé
bouton2 = Button(root, text="Quitter", fg ='blue', command = root.destroy, relief = RAISED)
bouton2.place(x = 375, y = 130)
#*******************************************************************************

#*******************************************************************************

# Détection d'une touche quelconque du clavier, de la touche Enter Echap ou Q
root.bind('<Tab>', touche_tabulation)
root.bind('<Key>', touche_clav)

root.bind("<Escape>", exit)
root.bind("q", exit)
root.bind("Q", exit)

root.mainloop()

#*******************************************************************************
#*******************************************************************************
#*******************************************************************************

J'espère que cette fois-ci ça va être bon.
Donc, je voudrais que la touche <Tabulation> fasse passer d'un champ de saisie à l'autre en évitant d'aller sur
les boutons.
Encore merci pour ta patience.
Baldo35
Messages postés
13276
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
24 novembre 2020
746 >
Messages postés
14
Date d'inscription
lundi 31 août 2020
Statut
Membre
Dernière intervention
18 septembre 2020

as-tu toujours le même problème avec le if?
Messages postés
13276
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
24 novembre 2020
746 >
Messages postés
13276
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
24 novembre 2020

tu as d'abord expliqué que tu voulais changer l'ordre des tabulations.
ensuite tu expliques que tu veux éviter d'aller sur les boutons.
de quoi s'agit-il précisément? merci de prendre le temps de t'expliquer clairement.

si tu veux exclure le widget bouton2 de la séquence de tabulation:
bouton2.config(takefocus=False)    
Messages postés
14
Date d'inscription
lundi 31 août 2020
Statut
Membre
Dernière intervention
18 septembre 2020
>
Messages postés
13276
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
24 novembre 2020

Merci beaucoup à toi yg_be, c'est la solution que j'attendais.
Je me suis certainement mal exprimé mais tu m'as compris.
A plus sur la toile
Messages postés
14
Date d'inscription
lundi 31 août 2020
Statut
Membre
Dernière intervention
18 septembre 2020

Bonjour,
le problème avec le if est résolu.
Mais je n'arrive toujours pas à forcer le focus sur mon champ de saisie quand tabulation est actionné (le focus passe inévitablement sur les boutons).
Merci
Messages postés
14
Date d'inscription
lundi 31 août 2020
Statut
Membre
Dernière intervention
18 septembre 2020

En ligne 25 le :
  Francs.focus_set()

ne fonctionne pas.
Messages postés
13276
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
24 novembre 2020
746
nous pourrons mieux t'aider si tu nous tiens rapidement et spontanément au courant de l'effet de nos suggestions.
Messages postés
14
Date d'inscription
lundi 31 août 2020
Statut
Membre
Dernière intervention
18 septembre 2020
>
Messages postés
13276
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
24 novembre 2020

oui, effectivement ta solution appliquée à tous les widgets button entraine que le focus reste placé sur les champs de saisie (c'était le but de ma demande).