Réorientation de l'ordre des tabulations tkinter

Résolu/Fermé
Baldo35 Messages postés 13 Date d'inscription lundi 31 août 2020 Statut Membre Dernière intervention 18 septembre 2020 - 17 sept. 2020 à 17:11
Baldo35 Messages postés 13 Date d'inscription lundi 31 août 2020 Statut Membre Dernière intervention 18 septembre 2020 - 18 sept. 2020 à 17:14
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

yg_be Messages postés 23283 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 25 octobre 2024 Ambassadeur 1 546
17 sept. 2020 à 18:16
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.
0