IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Tkinter Python Discussion :

Obtenir un focus après listbox-multiple [Python 3.X]


Sujet :

Tkinter Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre très actif
    Avatar de toumic2.0
    Homme Profil pro
    Gammologie (Étudie, code, publie des gammes)
    Inscrit en
    Janvier 2021
    Messages
    167
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Gammologie (Étudie, code, publie des gammes)
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Janvier 2021
    Messages : 167
    Par défaut Obtenir un focus après listbox-multiple
    Bonjour,

    J'ai un problème, lorsque la listbox s'ouvre le focus est bien sur le bouton 'valider'. Car dès que je commence à sélectionner mes choix, le bouton 'valider' est désélectionné. Je souhaite que le bouton 'valider' ait le focus à chaque intervention de choix.


    Et, après plusieurs essais, je n'ai pas de solution...

    Code Python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
     
        def selection():
            """Permet de capturer les choix de l'utilisateur"""
            # nonlocal v_choix
            i_choix = t_choix.curselection()  # Si i_choix = Index table t_choix = (1, 2, 3)
            v_choix[0] = list(t_choix.get(iv) for iv in i_choix)  # Alors v_choix = Valeur v_choix = [5, 2, 1]
            if not i_choix:
                v_choix[0] = box_6.copy()  # Quand il n'y a pas de choix, c'est que tout est choisi.
                (lineno(), "\n*** sélection_if v_choix:", v_choix, "\n*** i_choix:", i_choix)
            (lineno(), "\n*** sélection v_choix:", type(v_choix[0][0]), "\n***")
            print(lineno(), "focus :", root.focus_get())
            window.focus_set()
            window.destroy()
            return v_choix
     
     
        def initialise():
            nonlocal v2_choix
            v2_choix = selection()
            (lineno(), "\n*** sélection v2_choix:", v2_choix, "\n***")
            for dtk, dtv in dic_taux.items():
                dtk6 = dtk % 6
                if dtk6 == 0:
                    dtk6 = 6
                ray = ((int_sec * float(dtv[0])) // 100) + (int_sec * (int(dtv[1]) - 1))
                ang = dtk6 * six0
                (lineno(), "ray:", ray, "ang:", ang, "dtk:", dtk, "dtv:", dtv, "centre0:", centre0)
                x6 = ray * math.cos(math.radians(ang)) + centre0[0]
                y6 = ray * math.sin(math.radians(ang)) + centre0[1]
                xy6 = x6, y6
                if y6 > centre0[1]:  # centre0[1] = 534
                    pos0 = (210 - (y6 - centre0[1]))
                    (lineno(), "if y6:", y6, "pos0:", pos0, "dtk6:", dtk6)
                else:
                    pos0 = ((centre0[1] - y6) - 210)
                    (lineno(), "else y6:", y6, "pos0:", pos0, "dtk6:", dtk6)
                if dtk6 == 6:
                    dtk6 = 0
                "# Intersection (rayon, barre)"
                (lineno(), "xy6:", xy6, "dtk:", dtk, "dtk6:", dtk6, type(dtk6), "v2_choix.val:", v2_choix[0])
                if dtk6 in v2_choix[0]:
                    # Tracer les rayons
                    cant.create_line(centre0, xy6, fill=color6[dtk6], width=3)
                    # Liaison rayon et barre
                    cant.create_line(xy6, dic_axe[dtk], fill=color6[dtk6], width=2, dash=(1, 1))
                    (lineno(), "in v2_choix dtk6:", dtk6, "v2_choix.values:", v2_choix[0])
                if dtk6 not in sax0:  # La ligne d'indication du numéro de rayon.
                    cant.create_line(xy6, (xy6[0], xy6[1] + pos0), fill=color6[dtk6], width=1)
                    cant.create_text(xy6[0], xy6[1] + (pos0 + 6), text=str(dtk6), fill='black', font=c_ovale)
                    sax0.append(dtk6)
                    (lineno(), "sax0:", sax0)
            (lineno(), "sax0:", sax0, "v2_choix:", v2_choix)
            # ...
     
     
        for child in root.winfo_children():  # Pour supprimer les fenêtres déjà ouvertes.
            if isinstance(child, Toplevel):
                if child.winfo_exists():
                    (lineno(), "graphes_window : ", child)
                    child.destroy()
        window = Toplevel(root)
        window.geometry('300x150')
        window.title("Choix liste")
        t_choix = Listbox(window, selectmode="multiple")
        t_choix.pack(expand=YES, fill="both")
        c_bouton = Button(window, text="Valider", name="bou_lis", command=initialise)
        c_bouton.place(x="30", y="120")
        for each_item in range(len(box_6)):
            t_choix.insert(END, box_6[each_item])
            t_choix.itemconfig(each_item, bg="yellow" if each_item % 2 == 0 else "cyan")
        window.bind("<ButtonRelease>", c_bouton.focus_set())
        c_bouton.focus_set()
        (lineno(), "\n*** dic_six:", dic_six, "\n*** box_6:", box_6, "\n***")
        # État du window_Protocole
        (lineno(), "v2_choix:", v2_choix)
        window.protocol("WM_DELETE_WINDOW", initialise)
     
     
        (lineno(), "\n Fonte", c_ovale, "sax0:", sax0)
        (lineno(), " Positions max_paires   max_dro", max_dro, "max-min", (max_dro - min_gau))
        (lineno(), " Positions max impaires min_gau", min_gau)
        (lineno(), " Positions bas_impaires lig_hau", lig_hau)

  2. #2
    Membre Expert
    Avatar de MPython Alaplancha
    Homme Profil pro
    Paysan à 3 francs six sous
    Inscrit en
    Juin 2018
    Messages
    920
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Paysan à 3 francs six sous
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Juin 2018
    Messages : 920
    Billets dans le blog
    8
    Par défaut
    Bonjour,
    lie l'événement de sélection de la listbox à une fonction:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    listbox.bind('<<ListboxSelect>>', ma_fonction)
    et dans cette fonction applique la méthode focus_set() à ton bouton 'valider'

  3. #3
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 738
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 738
    Par défaut
    Citation Envoyé par Hominidé Voir le message
    et dans cette fonction applique la méthode focus_set() à ton bouton 'valider'
    C'est l'idée mais (sur Windows au moins) elle ne marche pas. Par contre, si on appelle focus_set après le callback, c'est mieux:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
     
    import tkinter as tk
     
    values = "Blue", "Red", "Green", "Yellow", "Orange", "Black"
     
    def on_select(e):
        root.after_idle(btn.focus_set)
     
    root  = tk.Tk()
    liste = tk.Listbox(root)
    liste.insert('end', *values)
    liste.bind('<<ListboxSelect>>', on_select)
    liste.pack()
    btn = tk.Button(root, text='valider', command=lambda: print('** '))
    btn.pack()
    btn.focus_set()
    tk.mainloop()
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  4. #4
    Membre Expert
    Avatar de MPython Alaplancha
    Homme Profil pro
    Paysan à 3 francs six sous
    Inscrit en
    Juin 2018
    Messages
    920
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Paysan à 3 francs six sous
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Juin 2018
    Messages : 920
    Billets dans le blog
    8
    Par défaut
    Citation Envoyé par wiztricks Voir le message
    C'est l'idée mais (sur Windows au moins) elle ne marche pas.
    ah bon.
    Pour ma part, je suis sur Debian et btn.focus_set() fonctionne.
    (ton code fonctionne aussi)

  5. #5
    Membre très actif
    Avatar de toumic2.0
    Homme Profil pro
    Gammologie (Étudie, code, publie des gammes)
    Inscrit en
    Janvier 2021
    Messages
    167
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Gammologie (Étudie, code, publie des gammes)
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Janvier 2021
    Messages : 167
    Par défaut
    Citation Envoyé par wiztricks Voir le message
    C'est l'idée mais (sur Windows au moins) elle ne marche pas. Par contre, si on appelle focus_set après le callback, c'est mieux:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
     
    import tkinter as tk
     
    values = "Blue", "Red", "Green", "Yellow", "Orange", "Black"
     
    def on_select(e):
        root.after_idle(btn.focus_set)
     
    root  = tk.Tk()
    liste = tk.Listbox(root)
    liste.insert('end', *values)
    liste.bind('<<ListboxSelect>>', on_select)
    liste.pack()
    btn = tk.Button(root, text='valider', command=lambda: print('** '))
    btn.pack()
    btn.focus_set()
    tk.mainloop()
    - W
    J'aimerais bien voir votre exemple avec une ListBox à valeurs multiples, car dès que je sélectionne un élément de la liste, le bouton perd son focus.

    Bonne année à tous ☺
    Merci

  6. #6
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 738
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 738
    Par défaut
    Citation Envoyé par toumic2.0 Voir le message
    J'aimerais bien voir votre exemple avec une ListBox à valeurs multiples,
    Il est facile d'ajouter selectmode="multiple" à la création de la Listbox ligne 10... et constater que ça marche pareil (le focus revient/reste sur le Button).

    Citation Envoyé par toumic2.0 Voir le message
    Voici le lien vers le code entier : sys_pro_blame/conjectureCollatz2.0.py at master · Toumic/sys_pro_blame (github.com)
    À la ligne de 610 à 673. Bien avant mes essais.
    Pourquoi se taper 1000 lignes de code mal écrites pour un problème qu'on ne sait pas reproduire en 10 lignes?

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  7. #7
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 4 062
    Par défaut
    Voici un exemple testé

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    import tkinter as tk
     
    def on_select(event):
        root.after(100, btn_valider.focus_set)
     
    def print_ok():
        print("ok")
     
    root = tk.Tk()
     
    listbox = tk.Listbox(root, selectmode='multiple')
    listbox.pack(padx=10, pady=10)
     
    for i in range(1, 11):
        listbox.insert(tk.END, f"Élément {i}")
     
    btn_valider = tk.Button(root, text='Valider', command=print_ok)
    btn_valider.pack(padx=10, pady=10)
     
    listbox.bind('<<ListboxSelect>>', on_select)
     
    root.mainloop()

  8. #8
    Membre très actif
    Avatar de toumic2.0
    Homme Profil pro
    Gammologie (Étudie, code, publie des gammes)
    Inscrit en
    Janvier 2021
    Messages
    167
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Gammologie (Étudie, code, publie des gammes)
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Janvier 2021
    Messages : 167
    Par défaut
    Citation Envoyé par fred1599 Voir le message
    Voici un exemple testé

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    import tkinter as tk
     
    def on_select(event):
        root.after(100, btn_valider.focus_set)
     
    def print_ok():
        print("ok")
     
    root = tk.Tk()
     
    listbox = tk.Listbox(root, selectmode='multiple')
    listbox.pack(padx=10, pady=10)
     
    for i in range(1, 11):
        listbox.insert(tk.END, f"Élément {i}")
     
    btn_valider = tk.Button(root, text='Valider', command=print_ok)
    btn_valider.pack(padx=10, pady=10)
     
    listbox.bind('<<ListboxSelect>>', on_select)
     
    root.mainloop()
    Je ne nie pas le fait que le focus fonctionne, mais il est inutile quand on cherche à activer le bouton avec un "entrée" au clavier. (Je voulais dire la touche Entrée de mon clavier)

  9. #9
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 4 062
    Par défaut
    Je ne nie pas le fait que le focus fonctionne, mais il est inutile quand on cherche à activer le bouton avec un "entrée" au clavier.
    Le focus fonctionne, c'est un exemple que vous souhaitiez, vous l'avez. Si vous souhaitez plus, précisez, mais je lis ceci qui n'indique rien de plus

    EDIT : Si vous parlez du print, c'est une sortie, ça permet de simuler et vérifier que le bouton fait bien quelque chose, c'est à vous d'adapter ce que vous souhaitez en faire.

    J'aimerais bien voir votre exemple avec une ListBox à valeurs multiples, car dès que je sélectionne un élément de la liste, le bouton perd son focus.

  10. #10
    Membre très actif
    Avatar de toumic2.0
    Homme Profil pro
    Gammologie (Étudie, code, publie des gammes)
    Inscrit en
    Janvier 2021
    Messages
    167
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Gammologie (Étudie, code, publie des gammes)
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Janvier 2021
    Messages : 167
    Par défaut
    Citation Envoyé par fred1599 Voir le message
    Le focus fonctionne, c'est un exemple que vous souhaitiez, vous l'avez. Si vous souhaitez plus, précisez, mais je lis ceci qui n'indique rien de plus
    Oups ☺

  11. #11
    Membre très actif
    Avatar de toumic2.0
    Homme Profil pro
    Gammologie (Étudie, code, publie des gammes)
    Inscrit en
    Janvier 2021
    Messages
    167
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Gammologie (Étudie, code, publie des gammes)
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Janvier 2021
    Messages : 167
    Par défaut
    Voici le lien vers le code entier : sys_pro_blame/conjectureCollatz2.0.py at master · Toumic/sys_pro_blame (github.com)
    À la ligne de 610 à 673. Bien avant mes essais.

  12. #12
    Membre actif
    Homme Profil pro
    Animateur Numérique
    Inscrit en
    Février 2013
    Messages
    143
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Animateur Numérique
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Février 2013
    Messages : 143
    Par défaut
    Salut,

    Du coup, il suffit de "binder" la touche enter

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    root.bind('<Return>', ma_fonction)

  13. #13
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 738
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 738
    Par défaut
    Citation Envoyé par Diablo76 Voir le message
    Du coup, il suffit de "binder" la touche enter
    Lorsqu'un Button a le focus, c'est la touche "espace" qui fait qu'on clique sur le bouton.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Garder le focus apres un submit
    Par SweetLeaf dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 10/07/2008, 16h42
  2. Focus après texte
    Par HiRoN dans le forum Général JavaScript
    Réponses: 12
    Dernier message: 07/03/2008, 10h32
  3. Recupere plusieurs variables d'une asp:ListBox multiple
    Par arnogb69 dans le forum Windows Forms
    Réponses: 1
    Dernier message: 10/08/2007, 20h50
  4. Réponses: 2
    Dernier message: 14/04/2006, 08h42
  5. [java][KeyListener]j'arrive pas a obtenir le focus au debu
    Par bodygard dans le forum AWT/Swing
    Réponses: 3
    Dernier message: 11/01/2006, 15h27

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo