Reorientación del orden de tabulación en tkinter

Resuelto
Baldo35 Mensajes publicados 14 Estado Miembro -  
Baldo35 Mensajes publicados 14 Estado Miembro -
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. Baldo35 Mensajes publicados 14 Estado Miembro
     
    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
  2. yg_be Mensajes publicados 23437 Fecha de registro   Estado Colaborador Última intervención   Ambassadeur 1 588
     
    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. yg_be Mensajes publicados 23437 Fecha de registro   Estado Colaborador Última intervención   1 588
       
      por otra parte, la función lift() permite controlar la secuencia de tabulación.
      0
  3. Baldo35 Mensajes publicados 14 Estado Miembro
     
    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
  4. Phil_1857 Mensajes publicados 1883 Fecha de registro   Estado Miembro Última intervención   169
     
    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. Baldo35 Mensajes publicados 14 Estado Miembro
       
      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
  5. Phil_1857 Mensajes publicados 1883 Fecha de registro   Estado Miembro Última intervención   169
     
    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. Baldo35 Mensajes publicados 14 Estado Miembro
       
      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
      1. yg_be Mensajes publicados 23437 Fecha de registro   Estado Colaborador Última intervención   1 588 > Baldo35 Mensajes publicados 14 Estado Miembro
         
        ¿Todavía tienes el mismo problema con el if?
        0
      2. yg_be Mensajes publicados 23437 Fecha de registro   Estado Colaborador Última intervención   1 588 > yg_be Mensajes publicados 23437 Fecha de registro   Estado Colaborador Última intervención  
         
        primero 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
      3. Baldo35 Mensajes publicados 14 Estado Miembro > yg_be Mensajes publicados 23437 Fecha de registro   Estado Colaborador Última intervención  
         
        Muchas 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
  6. Baldo35 Mensajes publicados 14 Estado Miembro
     
    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. Baldo35 Mensajes publicados 14 Estado Miembro
       
      En la línea 25, el :
       Francs.focus_set()

      no funciona.
      0
    2. yg_be Mensajes publicados 23437 Fecha de registro   Estado Colaborador Última intervención   1 588
       
      podremos ayudarte mejor si nos mantienes informado rápidamente y de manera espontánea sobre el efecto de nuestras sugerencias.
      0
      1. Baldo35 Mensajes publicados 14 Estado Miembro > yg_be Mensajes publicados 23437 Fecha de registro   Estado Colaborador Última intervención  
         
        sí, 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