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 :

Bind sur listbox Double-Button-1 et Button-1


Sujet :

Tkinter Python

  1. #1
    Nouveau membre du Club
    Bind sur listbox Double-Button-1 et Button-1
    Bonjour à tous

    Dans le code suivant le double clic dans une listbox fonctionne mais pas le simple clic. Le tuple renvoyé n'est correct qu'au deuxième clic.

    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
    23
    24
    25
    26
    27
    28
    29
    30
    31
    from tkinter import *
    import tkinter as tk
    from tkinter.constants import END
     
    def init():
        for item in range(0, 10):
            ma_listbox.insert(END, "La valeur indice  " + str(item))
     
    def selection(event):
        valeur = ma_listbox.curselection()
        print(valeur[0])
     
    ma_fenetre = Tk()
    ma_fenetre.geometry("1000x750")
    mon_canvas = Canvas(ma_fenetre)
    ma_listbox = Listbox(mon_canvas)
    mon_scrollbar = Scrollbar(mon_canvas, orient='vertical')
    mon_canvas.grid(row=0, column=0)
     
    ma_listbox.config(yscrollcommand=mon_scrollbar.set)
    ma_listbox.grid(row=0, column=0, sticky=E)
     
    mon_scrollbar.config(command=ma_listbox.yview)
    mon_scrollbar.grid(row=0, column=1, sticky='ns')
     
    #ma_listbox.bind("<Double-Button-1>", selection)    * fonctionne au double clic
    ma_listbox.bind("<Button-1>", selection)            # Ne fonctionne qu'au deuxième clic
     
    init()
     
    ma_fenetre.mainloop()

  2. #2
    Expert éminent sénior
    Salut,

    Certains widgets ont des évènements virtuels définis pour jouer avec. Dans le cas de la Listbox, c'est "<<ListboxSelected>>".

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

  3. #3
    Nouveau membre du Club
    Bonjour,

    Merci ça fonctionne, juste pour information c'est ListboxSelect

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    box1.bind('<<ListboxSelect>>', show_selected)

  4. #4
    Nouveau membre du Club
    Bonjour à tous

    Je constate un comportement étrange.
    Par moment lorsque par la tabulation je passe d'un champ à l'autre je déclenche l'évènement ListboxSelect

    print(valeur[0])
    IndexError: tuple index out of range
    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
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    from tkinter import *
    import tkinter as tk
    from tkinter.constants import END
     
     
    def init():
        for item in range(0, 10):
            ma_listbox.insert(END, "La valeur indice  " + str(item))
     
     
    def selection(event):
        valeur = ma_listbox.curselection()
        print(valeur[0])
     
     
    ma_fenetre = Tk()
    ma_fenetre.geometry("1000x750")
    mon_canvas = Canvas(ma_fenetre)
    ma_listbox = Listbox(mon_canvas)
    mon_scrollbar = Scrollbar(mon_canvas, orient='vertical')
    mon_canvas.grid(row=0, column=0)
     
    ma_listbox.config(yscrollcommand=mon_scrollbar.set)
    ma_listbox.grid(row=0, column=0, sticky=E)
     
    mon_scrollbar.config(command=ma_listbox.yview)
    mon_scrollbar.grid(row=0, column=1, sticky='ns')
     
    txt1 = Label(ma_fenetre, text='Texte 1', bg="#41B77F")
    txt1.grid(row=1, column=0, padx=2, pady=10, sticky=W)
    value1 = StringVar()
    entr1 = Entry(ma_fenetre, textvariable=value1, width=20)
    entr1.grid(row=1, column=1, pady=10, sticky=W)
     
    txt2 = Label(ma_fenetre, text='Texte 2', bg="#41B77F")
    txt2.grid(row=2, column=0, padx=2, pady=10, sticky=W)
    value2 = StringVar()
    entr2 = Entry(ma_fenetre, textvariable=value2, width=20)
    entr2.grid(row=2, column=1, pady=10, sticky=W)
     
    ma_listbox.bind("<<ListboxSelect>>", selection)
     
    init()
     
    ma_fenetre.mainloop()

  5. #5
    Expert éminent sénior
    Salut,

    <Tab> navigue vers le widget suivant et désélectionne ce qui a été sélectionné dans la Listbox d'où l'évènement ListboxSelect...
    Et ce comportement se contrôle avec exportselection.

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

  6. #6
    Nouveau membre du Club
    Merci

    Ce n'est pas toujours lors du passage du Listbox au champ mais aussi lors du passage du champ1 au champ2
    Sur un autre exemple je l'ai même constaté avec la listbox desactivée

  7. #7
    Expert éminent sénior
    Citation Envoyé par tm68780 Voir le message
    Ce n'est pas toujours lors du passage du Listbox au champ mais aussi lors du passage du champ1 au champ2
    Sur un autre exemple je l'ai même constaté avec la listbox desactivée
    Le soucis est que votre callback:
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    def selection(event):
        valeur = ma_listbox.curselection()
        print(valeur[0])

    suppose que si la sélection change, il doit y avoir quelque chose de sélectionné.
    Sinon .curselection retourne un tuple vide et le print(valeur[0]) qui est derrière plante.

    Vous découvrez comment fonctionne une Listbox. Il n'y a rien de très étrange.

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

###raw>template_hook.ano_emploi###