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 :

Conserver selection dans une listbox


Sujet :

Tkinter Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Août 2010
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 42
    Par défaut Conserver selection dans une listbox
    Bonjour,

    Je rencontre actuellement un problème, j'ai dans un programme une listbox comprenant un certain nombre de nom de fichiers faisant référence à des fichiers sur lesquels je souhaite faire des opérations ensuite. Je souhaiterais pouvoir choisir un nom de fichier dans ma liste et ensuite entrer certaines options relatives à ce fichier.

    Cependant après avoir choisit mon fichier dans la listbox je clique sur un widget de type Entry pour entrer une option, je perds alors ma sélection dans la listbox. Ce que je souhaiterais c'est conserver cette selection.

    En parcourant le web j'ai trouvé qu'il faut probablement utiliser la méthode selection_set() cependant j'ai un peu de mal à comprendre ce que fait cette méthode, j'ai l'impression qu'elle ne fait que surligner les éléments choisit, est ce qu'il y a un moyen d'avoir accès à ces éléments ensuite ce qui réglerais mon problème (peu être en utilisant ACTIVE ou ANCHOR pour les index) ? J'ai également une question concernant selection_anchor(), que fait elle exactement ?

    Voilà je remercie d'avance tout ceux qui m' apporterons leur aide.

  2. #2
    Membre Expert Avatar de PauseKawa
    Homme Profil pro
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    Juin 2006
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien Help Desk, maintenance, réseau, système et +
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 725
    Par défaut
    Bonjour,

    Citation Envoyé par Schopenhauer Voir le message
    Cependant après avoir choisit mon fichier dans la listbox je clique sur un widget de type Entry pour entrer une option, je perds alors ma sélection dans la listbox. Ce que je souhaiterais c'est conserver cette selection.
    Je n'arrive pas à reproduire ce phénomène.
    Que donne le code suivant pour vous ?
    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
    #!/usr/bin/env python
    # -*- coding: UTF-8 -*-
    #
    #
    try:
        import Tkinter as Tk
    except:
        import tkinter as Tk
     
    root = Tk.Tk()
     
    lb = Tk.Listbox(root, selectmode=Tk.SINGLE)
    lb.pack(padx=5, pady=5)
     
    for item in ['un', 'deux', 'trois', 'quatre', 'cinq']:
        lb.insert(Tk.END, item)
     
    l = Tk.Label(root, bg='white')
    l.pack(padx=5, pady=5, fill=Tk.BOTH, expand=1)
     
    def isselect(event=None):
        if lb.curselection():
            l.config(text='Selection actuelle : '+lb.get(lb.curselection()))
        else:
            l.config(text='Pas de selection')
     
    e = Tk.Entry(root)
    e.pack(padx=5, pady=5)
    e.bind('<Button-1>' , isselect)
     
    root.mainloop()
    Si vous perdez aussi la sélection pourriez vous nous donner votre os ainsi que la version de Python ?
    Dans le cas contraire cela viens de votre code.

    @+

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Août 2010
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 42
    Par défaut
    Bonjour,

    Merci pour cette réponse et merci pour le code test que vous me proposé.

    Alors j'ai moi aussi effectué quelques tests et je pense avoir cerné le problème (si toutefois c'en est un).

    Je n'avais pas remarqué cela lors de mon premier post. Apparament le problème ne se pose pas lors d'une utilisation "normal" du programme, mais si l'on clique 3 fois sur l'entry.

    Chez moi le phénomène se produit avec votre code et le mien sous unbutu avec python 2.6.5 et cela se produit avec votre code également sous XP (je n'ai pas pus tester mon code sous XP n'ayant pas developpé encore sa version sous windows) avec cette fois python 2.7 sur la machine.

    Alors il sagit peu être en fait d'un comportement normal, je trouve cela embêtant car mon programme plantait parfois, étant donné que plus rien ne se trouvait dans le tuple de retour. J'ai palié ce problème en enregistrant l'index dans une variable dès le premier clic. Mais j'aimerais tout de même savoir d'où vient ce phénomène.

    Merci encore.

    edit : je précise qu'après encore quelques test il faut a priori cliquer rapidement, faire une sorte de "triple clique".

  4. #4
    Membre Expert Avatar de PauseKawa
    Homme Profil pro
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    Juin 2006
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien Help Desk, maintenance, réseau, système et +
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 725
    Par défaut
    Bonjour,

    Citation Envoyé par Schopenhauer Voir le message
    Je n'avais pas remarqué cela lors de mon premier post. Apparament le problème ne se pose pas lors d'une utilisation "normal" du programme, mais si l'on clique 3 fois sur l'entry.
    Cela doit venir de la:
    doc Tcl/Tk
    Database Class: ExportSelection
    Specifies whether or not a selection in the widget should also be the X selection. The value may have any of the forms accepted by Tcl_GetBoolean, such as true, false, 0, 1, yes, or no. If the selection is exported, then selecting in the widget deselects the current X selection, selecting outside the widget deselects any widget selection, and the widget will respond to selection retrieval requests when it has a selection. The default is usually for widgets to export selections.
    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
    #!/usr/bin/env python
    # -*- coding: UTF-8 -*-
    #
    #
    try:
        import Tkinter as Tk
    except:
        import tkinter as Tk
     
    root = Tk.Tk()
     
    lb = Tk.Listbox(root, selectmode=Tk.SINGLE, exportselection=0)
    lb.pack(padx=5, pady=5)
     
    for item in ['un', 'deux', 'trois', 'quatre', 'cinq']:
        lb.insert(Tk.END, item)
     
    l = Tk.Label(root, bg='white')
    l.pack(padx=5, pady=5, fill=Tk.BOTH, expand=1)
     
    def isselect(event=None):
        if lb.curselection():
            l.config(text='Selection actuelle : '+lb.get(lb.curselection()))
        else:
            l.config(text='Pas de selection')
     
    e = Tk.Entry(root)
    e.pack(padx=5, pady=5)
    e.bind('<Button-1>' , isselect)
     
    root.mainloop()
    @+

  5. #5
    Membre Expert Avatar de PauseKawa
    Homme Profil pro
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    Juin 2006
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien Help Desk, maintenance, réseau, système et +
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 725
    Par défaut
    Bonjour,

    C'est bien cela (pas de poste pour tester )

    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
    #!/usr/bin/env python
    # -*- coding: UTF-8 -*-
    #
    #
    try:
        import Tkinter as Tk
    except:
        import tkinter as Tk
     
    root = Tk.Tk()
     
    lb1 = Tk.Listbox(root)
    lb1.grid(row=0, column=0, padx=5, pady=5)
    l1 = Tk.Label(root, bg='white')
    l1.grid(row=1, column=0, padx=5, pady=5)
    for item in ['un', 'deux', 'trois', 'quatre', 'cinq']:
        lb1.insert(Tk.END, item)
     
    lb2 = Tk.Listbox(root)
    lb2.grid(row=0, column=1, padx=5, pady=5)
    l2 = Tk.Label(root, bg='white')
    l2.grid(row=1, column=1, padx=5, pady=5)
    for item in ['1', '2', '3', '4', '5']:
        lb2.insert(Tk.END, item)
     
    def isselect(listb, lab, downlb):
        if listb.curselection():
            lab.config(text='Selection actuelle : '+listb.get(listb.curselection()))
        else:
            lab.config(text='Pas de selection')
        print(downlb.selection_get())
        print(listb.selection_get())
     
    e1 = Tk.Entry(root)
    e1.grid(row=2, column=0, padx=5, pady=5)
    e1.bind('<Button-1>', lambda event=None: isselect(lb1, l1, l2))
     
    e2 = Tk.Entry(root)
    e2.grid(row=2, column=1, padx=5, pady=5)
    e2.bind('<Button-1>', lambda event=None: isselect(lb2, l2, l1))
     
    root.mainloop()
    @+

  6. #6
    Membre Expert Avatar de PauseKawa
    Homme Profil pro
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    Juin 2006
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien Help Desk, maintenance, réseau, système et +
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 725
    Par défaut
    Bonjour Schopenhauer,

    Petit bonus du Week-end sur l'option exportselection.
    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
    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
    83
    84
    85
    86
    #!/usr/bin/env python
    # -*- coding: UTF-8 -*-
    #
    #
    try:
        import Tkinter as Tk
    except:
        import tkinter as Tk
     
    root = Tk.Tk()
    root.title("L'option exportselection avec les Widgets Entry et Listbox")
    Tk.Label(root, text='exportselection=1').grid(row=0, column=1, padx=5, pady=5, sticky=Tk.E+Tk.W)
    Tk.Label(root, text='Listbox exportselection=1\nEntry exportselection=0').grid(row=0, column=2, padx=5, pady=5, sticky=Tk.E+Tk.W)
    Tk.Label(root, text='exportselection=0').grid(row=0, column=3, padx=5, pady=5, sticky=Tk.E+Tk.W)
    Tk.Label(root, text='Listbox exportselection=0\nEntry exportselection=1').grid(row=0, column=4, padx=5, pady=5, sticky=Tk.E+Tk.W)
    Tk.Label(root, text='Listbox').grid(row=1, column=0, padx=5, pady=5)
    Tk.Label(root, text='Selection dans\nla Lisbox').grid(row=2, column=0, padx=5, pady=5)
    Tk.Label(root, text="'Clipboard'/Sélection\nselection_get() sur la Listbox").grid(row=3, column=0, padx=5, pady=5)
    Tk.Label(root, text='Entry (un clic/deux clics)').grid(row=4, column=0, padx=5, pady=5)
    # exportselection=1
    lb1 = Tk.Listbox(root, selectmode=Tk.SINGLE)
    lb1.grid(row=1, column=1, padx=5, pady=5)
    l1 = Tk.Label(root, bg='white')
    l1.grid(row=2, column=1, padx=5, pady=5, sticky=Tk.E+Tk.W)
    lr1 = Tk.Label(root, bg='yellow')
    lr1.grid(row=3, column=1, padx=5, pady=5, sticky=Tk.E+Tk.W)
    e1 = Tk.Entry(root)
    e1.grid(row=4, column=1, padx=5, pady=5)
    e1.insert(0, '11111')
    for item in ['un', 'deux', 'trois', 'quatre', 'cinq']:
        lb1.insert(Tk.END, item)
    # Listbox exportselection=1 / Entry exportselection=0
    lb2 = Tk.Listbox(root, selectmode=Tk.SINGLE)
    lb2.grid(row=1, column=2, padx=5, pady=5)
    l2 = Tk.Label(root, bg='white')
    l2.grid(row=2, column=2, padx=5, pady=5, sticky=Tk.E+Tk.W)
    lr2 = Tk.Label(root, bg='yellow')
    lr2.grid(row=3, column=2, padx=5, pady=5, sticky=Tk.E+Tk.W)
    e2 = Tk.Entry(root, exportselection=0)
    e2.grid(row=4, column=2, padx=5, pady=5)
    e2.insert(0, '22222')
    for item in ['uno', 'dos', 'tres', 'cuatro', 'cinco']:
        lb2.insert(Tk.END, item)
    # exportselection=0
    lb3 = Tk.Listbox(root, exportselection=0, selectmode=Tk.SINGLE)
    lb3.grid(row=1, column=3, padx=5, pady=5)
    l3 = Tk.Label(root, bg='white')
    l3.grid(row=2, column=3, padx=5, pady=5, sticky=Tk.E+Tk.W)
    lr3 = Tk.Label(root, bg='yellow')
    lr3.grid(row=3, column=3, padx=5, pady=5, sticky=Tk.E+Tk.W)
    e3 = Tk.Entry(root, exportselection=0)
    e3.grid(row=4, column=3, padx=5, pady=5)
    e3.insert(0, '33333')
    for item in ['one', 'two', 'three', 'four', 'five']:
        lb3.insert(Tk.END, item)
    # Listbox exportselection=0 / Entry exportselection=1
    lb4 = Tk.Listbox(root, exportselection=0, selectmode=Tk.SINGLE)
    lb4.grid(row=1, column=4, padx=5, pady=5)
    l4 = Tk.Label(root, bg='white')
    l4.grid(row=2, column=4, padx=5, pady=5, sticky=Tk.E+Tk.W)
    lr4 = Tk.Label(root, bg='yellow')
    lr4.grid(row=3, column=4, padx=5, pady=5, sticky=Tk.E+Tk.W)
    e4 = Tk.Entry(root)
    e4.grid(row=4, column=4, padx=5, pady=5)
    e4.insert(0, '44444')
    for item in ['eins', 'zwei', 'drei', 'vier', 'fünf']:
        lb4.insert(Tk.END, item)
     
    def isselect(event=None):
        # curselection()
        for lisb, lab in ((lb1, l1), (lb2, l2), (lb3, l3), (lb4, l4)):
            try:
                lab.config(text=lisb.get(lisb.curselection()))
            except Tk.TclError:
                lab.config(text='Pas de selection')
        # selection_get() sur la Listbox
        for lb, l in ((lb1, lr1), (lb2, lr2), (lb3, lr3), (lb4, lr4)):
            try:
                l.config(text=lb.selection_get())
            except Tk.TclError:
                l.config(text='Vide')
     
    for Widget in (e1, lb1, e2, lb2, e3, lb3, e4, lb4):
        Widget.bind('<ButtonRelease-1>', isselect)
    Tk.Button(root, text='Quitter', command=root.quit).grid(row=4, column=5, padx=5, pady=5)
    root.mainloop()
    @+

  7. #7
    Membre Expert Avatar de PauseKawa
    Homme Profil pro
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    Juin 2006
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien Help Desk, maintenance, réseau, système et +
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 725
    Par défaut
    Bonjour,

    J'avais oublier cette question:
    Citation Envoyé par Schopenhauer Voir le message
    J'ai également une question concernant selection_anchor(), que fait elle exactement ?
    Peut être qu'un bout de code sur ACTIVE/ANCHOR vous permettras de comprendre les subtilités de ses deux la.
    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
    #!/usr/bin/env python
    # -*- coding: UTF-8 -*-
    #
    #
    try:
        import Tkinter as Tk
    except:
        import tkinter as Tk
     
    root = Tk.Tk()
    root.title('ACTIVE et ANCHOR')
    lb = Tk.Listbox(root, selectmode=Tk.SINGLE)
    lb.pack(padx=5, pady=5)
    for item in ['un', 'deux', 'trois', 'quatre', 'cinq', 'six', 'sept', 'huit',
        'neuf', 'dix']:
        lb.insert(Tk.END, item)
    sb = Tk.Scrollbar(root)
    sb.pack(side=Tk.RIGHT, fill=Tk.Y)
    result = Tk.Text(root)
    result.pack(side=Tk.LEFT)
    sb.config(command=result.yview)
    result.config(yscrollcommand=sb.set)
    result.insert(Tk.END, 'Sélectionnez un élément dans la Listbox.\n')
    result.insert(Tk.END, '****************************************\n')
    result.config(state=Tk.DISABLED)
     
    def isselect(msg):
        result.config(state=Tk.NORMAL)
        result.insert(Tk.END, msg)
        result.insert(Tk.END, 'get(ACTIVE) ' + lb.get(Tk.ACTIVE) + '\n')
        result.insert(Tk.END, 'index(ACTIVE) ' + str(lb.index(Tk.ACTIVE)) + '\n')
        result.insert(Tk.END, 'get(ANCHOR) ' + lb.get(Tk.ANCHOR) + '\n')
        result.insert(Tk.END, 'index(ANCHOR) ' + str(lb.index(Tk.ANCHOR)) + '\n')
        result.insert(Tk.END, 'curselection() ' + str(lb.curselection()) + '\n')
        result.insert(Tk.END, '*********************\n')
        result.config(state=Tk.DISABLED)
     
    lb.bind('<Button-1>', lambda event=None: isselect('<Button-1>\n'))
    # <ButtonRelease-1> == <<ListboxSelect>>
    lb.bind('<ButtonRelease-1>', lambda event=None: isselect('<ButtonRelease-1>\n'))
    root.mainloop()
    @+

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Août 2010
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 42
    Par défaut
    Merci pour tous ces codes, en effet cela aide à comprendre les choses.

    Donc ACTIVE correspond à l'élément de la listbox encadré de pointillés que l'on peu obtenir soit en cliquant sur un élément soit en utilisant les flèches haut bas du clavier.

    Alors que ANCHOR correspond à l'élément sélectionné en bleu dans la liste.

    Si j'ai tout bon entre mon précédent post et celui-ci j'aurais vraiment apprit plein de choses.

    Merci encore. Je vais pouvoir modifier mon code en conséquence.

Discussions similaires

  1. [XL-2010] Selection dans une listbox
    Par MatthieuT42 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 10/06/2015, 10h37
  2. [XL-2007] Test si il y a une selection dans une listbox
    Par Ltspitfire dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 18/12/2014, 11h59
  3. [XL-2003] Selection dans une listbox et impression d'un TCD
    Par fabian123 dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 16/11/2014, 12h03
  4. Interdire la selection dans une listBox
    Par beaf05 dans le forum Général JavaScript
    Réponses: 7
    Dernier message: 06/01/2012, 11h04
  5. la selection dans une listbox
    Par etoile_de_vie dans le forum C#
    Réponses: 4
    Dernier message: 23/09/2008, 14h57

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