Reorientación del orden de tabulación en tkinter

Resuelto
Hola a todos,
en la serie: buscando se avanza, intento cambiar el orden de las tabulaciones en Tkinter.
En mi código:
#-------------------------------------------------------------------------------
# Nombre: FrancsEuros.py
# Propósito: Una conversión de Francos a Euros o de Euros a Francos fácil
#
# Autor: BALDONI GUY
#
# Creado: 07/09/2020
# Copyright: (c) BALDONI GUY 2020
# Licencia: <su licencia>
#-------------------------------------------------------------------------------
# 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 *

# Para la fecha en francés
locale.setlocale(locale.LC_TIME,'')

# Definición de frecuencia y duración de los beep de winsound
frequency = 2500 # Establecer Frecuencia a 2500 Hertz
duration = 500 # Establecer Duración a 500 ms == 1/2 segundo

# Definición de una fuente tachada y no tachada
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('Usted presionó la tecla de tabulación')
print(root.focus_get())
print(Francs.focus_get())
if Francs.focus_get() == '.!button2' :
print('Enfoque en Botón2')

#*******************************************************************************
# MÚSICA
# Función de elección con o sin música
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

# Se reproduce una pequeña música
def jouer_musique(nom_musique):
pygame.mixer.init()
pygame.mixer.music.load(nom_musique)
pygame.mixer.music.play()

# Función para detener la música
def couper_musique():
pygame.mixer.music.stop()
#*******************************************************************************

#*******************************************************************************
# Función para destruir la ventana principal tras un evento del teclado
def exit(event):
root.destroy()

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

#*******************************************************************************
# Función para elegir un modo Francos->Euros o Euros->Francos
def switch_feef():
# Se borran los dos campos de entrada
Euros.delete(0 , END)
Francs.delete(0 , END)
if btn_ch_mode["text"] == "Francos -> Euros" :
btn_ch_mode["text"] = "Euros -> Francos"
root.title("Conversión actual Francos->Euros")
Francs.focus_set()
else:
btn_ch_mode["text"] = "Francos -> Euros"
root.title("Conversión actual Euros->Francos")
Euros.focus_set()
btn_effacer["state"] = "disabled"

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

#*******************************************************************************
# Se realiza la conversión
def convert(event):
# Si se rellenan Francos y Euros y estamos en modo Francos -> Euros
# el usuario quiere hacer otro cálculo entonces, volvemos a calcular
if ((Francs.get() != "") and (Euros.get() != "")) and btn_ch_mode["text"] == "Euros -> Francos":
try :
tmp = float(Francs.get()) * 0.1524
except :
tkinter.messagebox.showerror('Francos', '( ' + Francs.get() +' )' + ' no es una suma correcta')
Francs.insert(0, 'Entrada incorrecta')
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 se rellenan Francos y Euros y estamos en modo Euros -> Francos
# el usuario quiere hacer otro cálculo entonces, volvemos a calcular
elif ((Francs.get() != "") and (Euros.get() != "")) and btn_ch_mode["text"] == "Francos -> Euros":
try :
tmp = float(Euros.get()) * 6.5596
except :
tkinter.messagebox.showerror('Euros', '( ' + Euros.get() +' )' + ' no es una suma correcta')
winsound.Beep(frequency, duration)
btn_effacer["state"] = "normal"
effacer()
Euros.insert(0, 'Entrada incorrecta')
else :
round = float("%0.2f" % tmp)
strround = str(round)
Francs.delete(0 , END)
Francs.insert(0, strround + ' F')
# De lo contrario funcionamiento normal
else :
x = Francs.get()
y = Euros.get()
# Si Francos y Euros están vacíos, el botón Borrar está deshabilitado
if (x == "") and (y == ""):
btn_effacer["state"] = "disabled"
else:
btn_effacer["state"] = "normal"

if (x != "" ) and (y == ""):
# Verificación de la correcta entrada de Francos
try :
tmp = float(x) * 0.1524
except :
# Se borra el campo Francos y se muestra el error
Francs.delete(0 , END)
Francs.insert(0, 'Entrada incorrecta')
winsound.Beep(frequency, duration)
tkinter.messagebox.showerror('Francos', '( ' + x +' )' + ' no es una suma correcta')
else :
# Está bien entonces se muestra el resultado
round = float("%0.2f" % tmp)
strround = str(round)
Euros.delete(0 , END)
Euros.insert(0, strround + ' €')
Francs.focus_set()
elif (y != "") and (x == ""):
# Verificación de la correcta entrada de Euros
try :
tmp = float(y) * 6.5596
except :
# Se borra el campo Euros y se muestra el error
Euros.delete(0 , END)
Euros.insert(0, 'Entrada incorrecta')
winsound.Beep(frequency, duration)
tkinter.messagebox.showerror('Euros', '( ' + y +' )' + ' no es una suma correcta')
else :
# Está bien entonces se muestra el resultado
round = float("%0.2f" % tmp)
strround = str(round)
Francs.delete(0 , END)
Francs.insert(0, strround + ' F')
Euros.focus_set()

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

#*******************************************************************************
# Borra los dos campos de entrada y deshabilita el botón Borrar
def effacer():
# Se borran los dos campos de entrada
Euros.delete(0 , END)
Francs.delete(0 , END)
# El botón Borrar está deshabilitado
btn_effacer["state"] = "disabled"
# El cursor parpadea en el campo Francos
Francs.focus_set()
root.title("Conversión actual Francos->Euros")

#*******************************************************************************
# Mostrar una ventana Acerca de
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("Acerca 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"
"Programa escrito en Python / Tkinter\n"
"y distribuidos bajo licencia GNU GPL.\n\n"
"© 2020 Guy Baldoni\n"
"( )\n\n"
"Este programa propone una conversión \n"
"Francos Euros o Euros Francos fácil ! \n"
"\n"
" ")
labinf.pack(pady=5)
bouf3=Button(feninf, text="Cerrar", command=feninf.destroy, fg='blue', relief=RAISED)
bouf3.pack(side=BOTTOM,pady=10)
feninf.grab_set()
feninf.wait_window()
#*******************************************************************************

# Ventana principal
root = Tk()
root.geometry("430x160")

#*******************************************************************************
# Mostrar la fecha actual actualizada permanentemente
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 el cursor parpadea en el campo Francos actualización coherente
if str(root.focus_get()) == '.!entry' :
btn_ch_mode["text"] = "Euros -> Francos"
root.title("Conversión actual Francos->Euros")
# Si el cursor parpadea en el campo Euros actualización coherente
elif str(root.focus_get()) == '.!entry2' :
btn_ch_mode["text"] = "Francos -> Euros"
root.title("Conversión actual 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
# Comando que recuerda la función majheure después de 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')

# Mostrar un pequeño logo en la ventana
img = ImageTk.PhotoImage(Image.open('h.gif'))
panel = Label(root, image = img)
panel.place(x = 10, y = 10)
# Prueba de color
#root.configure(bg='cyan')
# Coloca la aplicación en el centro de la pantalla
x = (root.winfo_screenwidth() - root.winfo_reqwidth()) / 2
y = (root.winfo_screenheight() - root.winfo_reqheight()) / 2
root.geometry("+%d+%d" % (x, y))
# Definición del título de la aplicación al inicio
root.title("Conversión actual Francos->Euros")
# Prohibir el agrandamiento de la ventana
root.resizable(height = False, width = False)
root.event_delete
root.size()
#*******************************************************************************

#*******************************************************************************
# Botones, etiquetas y campos de entrada
#*******************************************************************************
#*******************************************************************************
# Botón para detener la música
btn_couperMusique = Button(root, text="Canciones", fg ='blue', command = choix_musique, relief=RAISED)
btn_couperMusique.place(x = 20, y = 125)
btn_couperMusique['font'] = fontbarre
#*******************************************************************************

#*******************************************************************************
# Botón para cambiar la conversión Francos->Euros o Euros->Francos así como su etiqueta
mode = Label(root,text="Elección del modo ->")
mode.place(x = 230, y = 30)
btn_ch_mode = Button(root, text="Euros -> Francos", fg ='blue', command = switch_feef , relief = RAISED)
btn_ch_mode.place ( x = 330, y = 25)
#*******************************************************************************

#*******************************************************************************
# Entrada del campo Francos
lblFrancs = Label(root,text="Suma en Francos : ")
lblFrancs.place(x = 110, y = 20)
Francs = Entry(root, width = 15)
Francs.place( x = 120, y = 40)
# El cursor parpadea en el campo Francos
Francs.focus_set()
#*******************************************************************************

#*******************************************************************************
# Entrada del campo Euros
lblEuros = Label(root,text="Suma en Euros : ")
Euros = Entry(root, width = 15 )
lblEuros.place(x = 110, y = 60)
Euros.place(x = 120, y = 80)
#*******************************************************************************

#*******************************************************************************
# Se crea el botón Borrar
btn_effacer = Button(root, text="Borrar", fg ='blue', command = effacer, relief = RAISED)
btn_effacer.place(x = 230, y = 60)
# Por defecto el botón Borrar está deshabilitado porque no hay nada que borrar
btn_effacer["state"] = "disabled"

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

#*******************************************************************************
# Se crea el botón Salir
bouton2 = Button(root, text="Salir", fg ='blue', command = root.destroy, relief = RAISED)
bouton2.place(x = 375, y = 130)
#*******************************************************************************

#*******************************************************************************
# Etiqueta de las instrucciones
modeEmploi = Label(root,text="Enter para calcular,\nQ o Esc para salir\n H--> Acerca de...")
modeEmploi.place( x = 100, y = 100)
#*******************************************************************************
#*******************************************************************************

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

# Detección de cualquier tecla del teclado, de la tecla Enter Esc o 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()
# Cuando se sale del programa, detenemos la música y decimos adiós

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

en las líneas 40 a 45 de la función <touche_tabulation> me gustaría realizar una reasignación del enfoque, pero el <if> de la línea 44 nunca es verdadero.
Además, traté de cambiar la asignación del enfoque en la misma función y no funciona.
¿Puedes ayudarme a resolver este enigma?
Gracias de antemano

7 respuestas

  1. Gracias por tu esfuerzo yg_be.
    Aquí está el código Python 3.8.5 depurado :
    #-------------------------------------------------------------------------------
    # Nombre: FrancsEuros.py
    # Propósito: Una conversión fácil de Francos a Euros o de Euros a Francos
    #
    # Autor: BALDONI GUY
    #
    # Creado: 07/09/2020
    # Copyright: (c) BALDONI GUY 2020
    # Licencia: <tu licencia>
    #-------------------------------------------------------------------------------
    # coding: utf8
    from tkinter import *
    import tkinter.messagebox
    import os
    import winsound
    import datetime
    from math import *
    from winsound import *

    # Definición de frecuencia y duración de los sonidos de winsound
    frequency = 2500 # Establecer frecuencia a 2500 Hertz
    duration = 500 # Establecer duración a 500 ms == 1/2 segundo

    # Definición de una fuente tachada y no tachada
    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('Has presionado la tecla tabulación')
    print(root.focus_get())
    print(Francs.focus_get())
    if Francs.focus_get() == '.!button2' :
    print('Enfocado en Botón2')

    #*******************************************************************************
    # Función para destruir la ventana principal tras un evento de teclado
    def exit(event):
    root.destroy()

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

    #*******************************************************************************
    # Función para elegir un modo Francos->Euros o Euros->Francos
    def switch_feef():
    # Limpiamos ambos campos de entrada
    Euros.delete(0 , END)
    Francs.delete(0 , END)
    if btn_ch_mode["text"] == "Francos -> Euros" :
    btn_ch_mode["text"] = "Euros -> Francos"
    root.title("Conversión actual Francos->Euros")
    Francs.focus_set()
    else:
    btn_ch_mode["text"] = "Francos -> Euros"
    root.title("Conversión actual Euros->Francos")
    Euros.focus_set()
    btn_effacer["state"] = "disabled"

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

    #*******************************************************************************
    # Limpia ambos campos de entrada y desactiva el botón Limpiar
    def effacer():
    # Limpiamos ambos campos de entrada
    Euros.delete(0 , END)
    Francs.delete(0 , END)
    # El botón Limpiar está desactivado
    btn_effacer["state"] = "disabled"
    # El cursor parpadea en el campo Francos
    Francs.focus_set()
    root.title("Conversión actual Francos->Euros")

    # Ventana principal
    root = Tk()
    root.geometry("430x160")

    # Prueba de color
    #root.configure(bg='cyan')
    # Coloca la aplicación en el centro de la pantalla
    x = (root.winfo_screenwidth() - root.winfo_reqwidth()) / 2
    y = (root.winfo_screenheight() - root.winfo_reqheight()) / 2
    root.geometry("+%d+%d" % (x, y))
    # Definición del título de la aplicación al inicio
    root.title("Conversión actual Francos->Euros")
    # Impide el agrandamiento de la ventana
    root.resizable(height = False, width = False)
    root.event_delete
    root.size()
    #*******************************************************************************

    #*******************************************************************************
    # Botones, etiquetas y campos de entrada
    #*******************************************************************************

    #*******************************************************************************
    # Botón para cambiar la conversión Francos->Euros o Euros->Francos y su etiqueta
    mode = Label(root,text="Elección del modo ->")
    mode.place(x = 230, y = 30)
    btn_ch_mode = Button(root, text="Euros -> Francos", fg ='blue', command = switch_feef , relief = RAISED)
    btn_ch_mode.place ( x = 330, y = 25)
    #*******************************************************************************

    #*******************************************************************************
    # Entrada del campo Francos
    lblFrancs = Label(root,text="Cantidad en Francos : ")
    lblFrancs.place(x = 110, y = 20)
    Francs = Entry(root, width = 15)
    Francs.place( x = 120, y = 40)
    # El cursor parpadea en el campo Francos
    Francs.focus_set()
    #*******************************************************************************

    #*******************************************************************************
    # Entrada del campo Euros
    lblEuros = Label(root,text="Cantidad en Euros : ")
    Euros = Entry(root, width = 15 )
    lblEuros.place(x = 110, y = 60)
    Euros.place(x = 120, y = 80)
    #*******************************************************************************

    #*******************************************************************************
    # Se crea el botón Limpiar
    btn_effacer = Button(root, text="Limpiar", fg ='blue', command = effacer, relief = RAISED)
    btn_effacer.place(x = 230, y = 60)
    # Por defecto el botón Limpiar está deshabilitado porque no hay nada que limpiar
    btn_effacer["state"] = "disabled"

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

    #*******************************************************************************
    # Se crea el botón Salir
    bouton2 = Button(root, text="Salir", fg ='blue', command = root.destroy, relief = RAISED)
    bouton2.place(x = 375, y = 130)
    #*******************************************************************************

    #*******************************************************************************
    # Etiqueta del manual de usuario
    modeEmploi = Label(root,text="Enter para calcular,\nQ o Esc para salir\n H--> Acerca de...")
    modeEmploi.place( x = 100, y = 100)
    #*******************************************************************************
    #*******************************************************************************

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

    # Detección de cualquier tecla del teclado, de la tecla Enter Esc o 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()
    # Al salir del programa, detenemos la música y decimos adiós

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


    siempre me interesa la función <touche_tabulation> que me preocupa.
    Gracias de nuevo a todos los que me responderán.
    0
    1. Colaborador
      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' :
      0
      1. Colaborador
        por otra parte, la función lift() permite controlar la secuencia de tabulación.
        0
    2. Gracias yg_be por tu paciencia, estoy aprendiendo.
      Mi código :
      <code python>
      #-------------------------------------------------------------------------------
      # Nombre: FrancsEuros.py
      # Propósito: Una conversión fácil de Francos a Euros o de Euros a Francos
      #
      # Autor: BALDONI GUY
      #
      # Creado: 07/09/2020
      # Copyright: (c) BALDONI GUY 2020
      # Licencia: <tu licencia>
      #-------------------------------------------------------------------------------
      # coding: utf8
      from tkinter import *
      import os
      from math import *

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

      def touche_tabulation(event):
      print('Has presionado la tecla de tabulación')
      print(root.focus_get())
      if str(Francs.focus_get()) == '.!button2' :
      print('Enfoque en Botón2')

      #*******************************************************************************
      # Función para destruir la ventana principal tras un evento de teclado
      def exit(event):
      root.destroy()

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

      #*******************************************************************************
      # Función para elegir un modo Francos->Euros o Euros->Francos
      def switch_feef():
      # Limpiamos los dos campos de entrada
      Euros.delete(0 , END)
      Francs.delete(0 , END)
      if btn_ch_mode["text"] == "Francos -> Euros" :
      btn_ch_mode["text"] = "Euros -> Francos"
      root.title("Conversión actual Francos->Euros")
      Francs.focus_set()
      else:
      btn_ch_mode["text"] = "Francos -> Euros"
      root.title("Conversión actual Euros->Francos")
      Euros.focus_set()
      btn_effacer["state"] = "disabled"

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

      #*******************************************************************************
      # Limpia los dos campos de entrada y desactiva el botón Limpiar
      def effacer():
      # Limpiamos los dos campos de entrada
      Euros.delete(0 , END)
      Francs.delete(0 , END)
      # El botón Limpiar está desactivado
      btn_effacer["state"] = "disabled"
      # El cursor parpadea en el campo Francos
      Francs.focus_set()
      root.title("Conversión actual Francos->Euros")

      # Ventana principal
      root = Tk()
      root.geometry("430x160")

      # Definición del título de la aplicación al inicio
      root.title("Conversión actual Francos->Euros")
      # Prohibir el agrandamiento de la ventana
      root.resizable(height = False, width = False)
      root.event_delete
      root.size()
      #*******************************************************************************

      #*******************************************************************************
      # Botones, etiquetas y campos de entrada
      #*******************************************************************************

      #*******************************************************************************
      # Botón para cambiar la conversión de Francos->Euros o Euros->Francos así como su etiqueta
      mode = Label(root,text="Elección del modo ->")
      mode.place(x = 230, y = 30)
      btn_ch_mode = Button(root, text="Euros -> Francos", fg ='blue', command = switch_feef , relief = RAISED)
      btn_ch_mode.place ( x = 330, y = 25)
      #*******************************************************************************

      #*******************************************************************************
      # Entrada del campo Francos
      lblFrancs = Label(root,text="Suma en Francos : ")
      lblFrancs.place(x = 110, y = 20)
      Francs = Entry(root, width = 15)
      Francs.place( x = 120, y = 40)
      # El cursor parpadea en el campo Francos
      Francs.focus_set()
      #*******************************************************************************

      #*******************************************************************************
      # Entrada del campo Euros
      lblEuros = Label(root,text="Suma en Euros : ")
      Euros = Entry(root, width = 15 )
      lblEuros.place(x = 110, y = 60)
      Euros.place(x = 120, y = 80)
      #*******************************************************************************

      #*******************************************************************************
      # El botón Limpiar se crea desactivado porque no hay nada que limpiar
      btn_effacer = Button(root, text="Limpiar", fg ='blue', state = 'disabled',command = effacer, relief = RAISED)
      btn_effacer.place(x = 230, y = 60)

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

      #*******************************************************************************
      # El botón Salir se crea
      bouton2 = Button(root, text="Salir", fg ='blue', command = root.destroy, relief = RAISED)
      bouton2.place(x = 375, y = 130)
      #*******************************************************************************

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

      # Detección de cualquier tecla del teclado, de la tecla Enter Escape o 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 realidad, cuando se presiona tabulador varias veces, el enfoque pasa por
      los campos de entrada y luego por los botones.
      Quisiera que pasáramos de un campo a otro sin pasar por los botones.
      Gracias por tu comprensión.
      Baldo35
      0
      1. Hola Baldo,

        ¡Todavía no!

        Debe parecerse a esto:
         # coding: utf8 from tkinter import * import os from math import * def toque_teclado(event): btn_borrar["state"] = "normal" def toque_tabulacion(event): print('Has presionado la tecla de tabulación') print(root.focus_get()) if str(Francs.focus_get()) == '.!button2' : print('Enfoque en Botón2') 
        0
        1. Hola Phil,
          el código que me das funciona bien, pero me gustaría:
          De hecho, cuando se presiona la tecla de tabulación varias veces, el foco pasa
          por los campos de entrada y luego por los botones.
          Me gustaría que se pasara de un campo a otro sin pasar por los botones.
          Gracias por tu comprensión.
          Baldo35
          0
      2. No te he dado un código que funcione bien

        Te he puesto las 14 primeras líneas de tu código con las etiquetas de código colocadas correctamente

        para que veas a qué debe parecerse exactamente

        Así que tienes que volver a poner tu código completo con las etiquetas, debe aparecer exactamente

        como en mi ejemplo, con los colores, las indentaciones y todo...
        0
        1. Mil disculpas Phil,
          estoy intentando:
          #------------------------------------------------------------------------------- # Nombre: FrancsEuros.py # Propósito: Una conversión fácil de Francos a Euros o de Euros a Francos # # Autor: BALDONI GUY # # Creado: 07/09/2020 # Copyright: (c) BALDONI GUY 2020 # Licencia: <tu licencia> #------------------------------------------------------------------------------- # coding: utf8 from tkinter import * import os from math import * def touche_clav(event): btn_effacer["state"] = "normal" def touche_tabulation(event): print('Has presionado la tecla tabulación') print(root.focus_get()) if str(Francs.focus_get()) == '.!entry2' : print('Enfoque en Botón3') Francs.focus_set() #******************************************************************************* # Función para destruir la ventana principal tras un evento de teclado def exit(event): root.destroy() #******************************************************************************* #******************************************************************************* # Función para elegir un modo Francos->Euros o Euros->Francos def switch_feef(): # Limpiamos los dos campos de entrada Euros.delete(0 , END) Francs.delete(0 , END) if btn_ch_mode["text"] == "Francos -> Euros" : btn_ch_mode["text"] = "Euros -> Francos" root.title("Conversión actual Francos->Euros") Francs.focus_set() else: btn_ch_mode["text"] = "Francos -> Euros" root.title("Conversión actual Euros->Francos") Euros.focus_set() btn_effacer["state"] = "disabled" #******************************************************************************* #******************************************************************************* # Limpia los dos campos de entrada y desactiva el botón Borrar def effacer(): # Limpiamos los dos campos de entrada Euros.delete(0 , END) Francs.delete(0 , END) # El botón Borrar está deshabilitado btn_effacer["state"] = "disabled" # El cursor parpadea en el campo Francs Francs.focus_set() root.title("Conversión actual Francos->Euros") # Ventana principal root = Tk() root.geometry("430x160") # Definición del título de la aplicación al principio root.title("Conversión actual Francos->Euros") # Impedir el agrandamiento de la ventana root.resizable(height = False, width = False) root.event_delete root.size() #******************************************************************************* #******************************************************************************* # Botones, etiquetas y campos de entrada #******************************************************************************* #******************************************************************************* # Botón de cambio de conversión Francos->Euros o Euros->Francos junto con su etiqueta mode = Label(root,text="Selección del modo ->") mode.place(x = 230, y = 30) btn_ch_mode = Button(root, text="Euros -> Francos", fg ='blue', command = switch_feef , relief = RAISED) btn_ch_mode.place ( x = 330, y = 25) #******************************************************************************* #******************************************************************************* # Entrada del campo Francs lblFrancs = Label(root,text="Suma en Francos : ") lblFrancs.place(x = 110, y = 20) Francs = Entry(root, width = 15) Francs.place( x = 120, y = 40) # El cursor parpadea en el campo Francs Francs.focus_set() #******************************************************************************* #******************************************************************************* # Entrada del campo Euros lblEuros = Label(root,text="Suma en Euros : ") Euros = Entry(root, width = 15 ) lblEuros.place(x = 110, y = 60) Euros.place(x = 120, y = 80) #******************************************************************************* #******************************************************************************* # El botón Borrar se crea deshabilitado porque no hay nada que borrar btn_effacer = Button(root, text="Borrar", fg ='blue', state = 'disabled',command = effacer, relief = RAISED) btn_effacer.place(x = 230, y = 60) #******************************************************************************* #******************************************************************************* # El botón Salir se crea botón2 = Button(root, text="Salir", fg ='blue', command = root.destroy, relief = RAISED) botón2.place(x = 375, y = 130) #******************************************************************************* #******************************************************************************* # Detección de cualquier tecla del teclado, de la tecla Enter Escape o 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() #******************************************************************************* #******************************************************************************* #******************************************************************************* 

          Espero que esta vez sea bueno.
          Entonces, querría que la tecla <Tabulación> pase de un campo de entrada a otro evitando ir a
          los botones.
          Muchas gracias por tu paciencia.
          Baldo35
          0
        2. Colaborador
          @Baldo35¿Todavía tienes el mismo problema con el if?
          0
        3. Colaborador
          @yg_beprimero explicaste que querías cambiar el orden de las tabulaciones.
          luego explicas que quieres evitar ir a los botones.
          de qué se trata precisamente? gracias por tomarte el tiempo para explicarte claramente.

          si quieres excluir el widget botón2 de la secuencia de tabulación:
          botón2.config(takefocus=False) 
          0
        4. @yg_beMuchas gracias a ti yg_be, es la solución que estaba esperando.
          Por supuesto, puede que me haya expresado mal, pero me has entendido.
          Hasta pronto en la red
          0
      3. Hola,
        el problema con el if está resuelto.
        Pero todavía no consigo forzar el enfoque en mi campo de entrada cuando se activa la tabulación (el enfoque pasa inevitablemente a los botones).
        Gracias
        0
        1. En la línea 25, el :
           Francs.focus_set()

          no funciona.
          0
        2. Colaborador
          podremos ayudarte mejor si nos mantienes informado rápidamente y de manera espontánea sobre el efecto de nuestras sugerencias.
          0
        3. @yg_besí, efectivamente tu solución aplicada a todos los widgets de botón hace que el foco permanezca en los campos de entrada (ese era el objetivo de mi solicitud).
          0