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 :

Récupérer un item d'une listbox dans une nouvelle window


Sujet :

Tkinter Python

  1. #1
    Candidat au Club
    Inscrit en
    Décembre 2006
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 7
    Points : 3
    Points
    3
    Par défaut Récupérer un item d'une listbox dans une nouvelle window
    Bonjour,

    Après avoir parcouru pas mal le net sur des exemples et autres tutoriels, je n'arrive pas à récupérer un item d'une listbox que j'ai ouverte dans une nouvelle fenetre (Toplevel)

    quelqu'un saurait il m'éclairer?

    D'avance merci pour votre temps ^^

    Les parties de code concernées:

    (contenu du fichier db_path: card, 40, www.url )

    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
    ####### Suppression d'une carte dans la database #######
    def del_card():
        print "call del_card"
        del_wdw = Toplevel()
        del_wdw.title("Delete a Card")
        del_wdw.grab_set()
        del_wdw.protocol("WM_DELETE_WINDOW", del_wdw.destroy)
     
     
        ####### Création de la listbox et de la scrollbar #######
        frame_del = Frame(del_wdw)
        frame_del.pack()
        cardlistbox = Listbox(frame_del)
        scrollbar= Scrollbar(frame_del)
     
        cardlistbox.pack(side=Tkinter.LEFT, fill=Tkinter.Y)
        scrollbar.pack(side=Tkinter.RIGHT,fill=Tkinter.Y)
     
        scrollbar['command']=cardlistbox.yview
        cardlistbox['yscrollcommand']=scrollbar.set
     
        cardlist=get_cardlist(db_path)
        for item in cardlist:
            cardlistbox.insert(END,item)
     
        del_wdw.close_button = Button(del_wdw, text="Close", command=del_wdw.destroy)
        del_wdw.close_button.pack()
     
        current_selection = Label(frame_del,text="text à updater")
        current_selection.pack()
    et la, c'est le drame, j'ai eu beau essayer avec des cardlistbox.bind ou mm d'autres méthodes, impossible de trouver comment récupérer l'item selectionné



    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
    root = Tk()
    root.title("MTG Price Checker")
    root.config(width=300)
    root.config(height=100)
     
     
    frame=Frame(root)
    frame.pack()
     
    ############## Définition des Labels #################
    card_name= Label(frame, text="Card Name:").grid(row=1, column=1)
    buying_price= Label(frame, text="Buying Price:").grid(row=2, column=1)
    mv_url = Label(frame, text="Magic Ville URL:").grid(row=3, column=1)
    card_shark_url=Label(frame, text="Card Shark URL:").grid(row=4, column=1)
    card_market_url=Label(frame, text="Card Market URL:").grid(row=5, column=1)
     
     
    ########### Définition des entrées labels ############
    card_name_entry = Entry(frame, width =20)
    buying_price_entry = Entry(frame, width =20)
    mv_url_entry = Entry(frame, width =20)       
    card_shark_entry = Entry(frame, width =20)       
    card_market_entry = Entry(frame, width =20)
     
    ########### Placement des entrées labels ############
    card_name_entry.grid(row=1, column=2)
    buying_price_entry.grid(row=2, column=2)
    mv_url_entry.grid(row=3, column=2)
    card_shark_entry.grid(row=4, column=2)       
    card_market_entry.grid(row=5, column=2)
     
     
    ############## Bouton d'actions ##############
    add_button = Button(frame, text="Add \n Card!", command=record_data, height="7")
    analyse_button = Button(frame, text="Launch Analyze!", command=analyze, width="20", height="3")
    update_button = Button(frame, text="Update  \n Card", command=update, height="3")
    del_button = Button(frame, text="Del Card", command=del_card,height="3")
    quit_button = Button(frame, text="Quit Mtg Analyzer", command=frame.quit, height="3")
     
    ############## Placement des boutons d'actions ##############
    add_button.grid(row=1,rowspan=5, column=3)
    quit_button.grid(row=6, column=3, columnspan=2)
    analyse_button.grid(row=6, column=1)
    update_button.grid(row=1,rowspan=2, column=4)
    del_button.grid(row=3,rowspan=3, column=4)

  2. #2
    Membre confirmé
    Avatar de vincent.mbg
    Homme Profil pro
    Développeur Python
    Inscrit en
    Décembre 2007
    Messages
    327
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur Python

    Informations forums :
    Inscription : Décembre 2007
    Messages : 327
    Points : 618
    Points
    618
    Par défaut
    Bonjour,

    Je ne comprends pas très bien ton problème.

    Du moment que tu as une référence de ta listebox ( cardlistbox ) peu importe dans quelle fenêtre elle se trouve, la méthode reste la même.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    selection = cardlistbox .curselection()
    if selection != [] :
                print( cardlistbox .get( int( selection[ 0 ] ) ) )
    Le code source envoyé est en deux parties avec plein de Label, de Entry, de Scrollbar...

    Si ton problème concerne une liste box et deux fenêtres, envoie un code source avec juste ça.
    Mon guide pour apprendre Tkinter - N'oubliez pas de consulter les FAQ Python ou de visiter mon blog

  3. #3
    Candidat au Club
    Inscrit en
    Décembre 2006
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 7
    Points : 3
    Points
    3
    Par défaut
    Qd je fais ce que tu suggères, voici l'erreur qu'il me met lors de l'ouverture de la fenetre DEL

    Exception in Tkinter callback
    Traceback (most recent call last):
    File "C:\Python26\lib\lib-tk\Tkinter.py", line 1410, in __call__
    return self.func(*args)
    File "C:\Documents and Settings\Pierrick\Bureau\test.py", line 63, in del_card
    print( cardlistbox .get( int( selection[0] ) ) )
    IndexError: tuple index out of range

    Voici le code épuré ^^

    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
    87
     
    # -*- coding: cp1252 -*-
    import os
    import Tkinter
    from Tkinter import *
    import tkFileDialog
    from tkMessageBox import showerror
    import random
    import urllib
    import tkSimpleDialog
     
     
    #######Path du fichier database#######
    db_path = "C:\toto.txt"
     
     
    ###################################################
    #****** Fonction de Listing de la database        #
    ###################################################
    def get_cardlist(db_path):
        f = file(db_path , 'r')
        lines=f.readlines()
        f.close()
        cardlist = []
        for l in lines:
            card = l.split(",")
            cardlist.append(card[0])
        return cardlist
     
     
    ####### Suppression d'une carte dans la database #######
    def del_card():
        print "call del_card"
        del_wdw = Toplevel()
        del_wdw.title("Delete a Card")
        del_wdw.grab_set()
        del_wdw.protocol("WM_DELETE_WINDOW", del_wdw.destroy)
     
     
        ####### Création de la listbox et de la scrollbar #######
        frame_del = Frame(del_wdw)
        frame_del.pack()
        cardlistbox = Listbox(frame_del)
        scrollbar= Scrollbar(frame_del)
     
        cardlistbox.pack(side=Tkinter.LEFT, fill=Tkinter.Y)
        scrollbar.pack(side=Tkinter.RIGHT,fill=Tkinter.Y)
     
        scrollbar['command']=cardlistbox.yview
        cardlistbox['yscrollcommand']=scrollbar.set
     
        cardlist=get_cardlist(db_path)
        for item in cardlist:
            cardlistbox.insert(END,item)
     
        del_wdw.close_button = Button(del_wdw, text="Close", command=del_wdw.destroy)
        del_wdw.close_button.pack()
     
        current_selection = Label(frame_del,text="dddz")
        current_selection.pack()
     
        selection = cardlistbox .curselection()
        if selection != "" :
            print( cardlistbox .get( int( selection[0] ) ) )
     
    #    cardlistbox.bind('<ButtonRelease-1>', get_list)#('<ButtonRelease-1>',cardlistbox))
     
     
     
     
     
    root = Tk()
    root.title("MTG Price Checker")
    root.config(width=300)
    root.config(height=100)
     
     
    frame=Frame(root)
    frame.pack()
     
    del_button = Button(frame, text="Del Card", command=del_card,height="3")
    del_button.grid(row=3,rowspan=3, column=4)
     
     
     
     
    root.mainloop()

  4. #4
    Membre confirmé
    Avatar de vincent.mbg
    Homme Profil pro
    Développeur Python
    Inscrit en
    Décembre 2007
    Messages
    327
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur Python

    Informations forums :
    Inscription : Décembre 2007
    Messages : 327
    Points : 618
    Points
    618
    Par défaut
    Je me suis trompé

    c'est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    if selection != () :
    et non
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    if selection != '' :
    La méthode renvoie un tuple car dans certain cas on peut sélectionner plusieurs entrées. On vérifie si ce tuple n'est pas vide au cas ou la personne n'a rien sélectionné avant d'en extraire l'indice.

    Pour ce que tu cherches à faire voici une solution, il suffit de définir toi même la méthode pour détruire la fenêtre et de récupérer l'item a ce moment-là


    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
     
    # -*- coding: cp1252 -*-
    import os
    import Tkinter
    from Tkinter import *
    import tkFileDialog
    from tkMessageBox import showerror
    import random
    import urllib
    import tkSimpleDialog
     
     
    #######Path du fichier database#######
    db_path = "toto.txt"
     
     
    ###################################################
    #****** Fonction de Listing de la database        #
    ###################################################
    def get_cardlist(db_path):
        f = file(db_path , 'r')
        lines=f.readlines()
        f.close()
        cardlist = []
        for l in lines:
            card = l.split(",")
            cardlist.append(card[0])
        return cardlist
     
     
    ####### Suppression d'une carte dans la database #######
    def del_card():
        def recuper_selection() :
            " s'execute a la destruction de del_wdw."
            selection = cardlistbox .curselection()
            if selection != () :
                print( cardlistbox .get( int( selection[0] ) ) )
            del_wdw.destroy()
     
        print "call del_card"
        del_wdw = Toplevel()
        del_wdw.title("Delete a Card")
        del_wdw.grab_set()
        del_wdw.protocol("WM_DELETE_WINDOW", recuper_selection)
     
     
        ####### Création de la listbox et de la scrollbar #######
        frame_del = Frame(del_wdw)
        frame_del.pack()
        cardlistbox = Listbox(frame_del)
        scrollbar= Scrollbar(frame_del)
     
        cardlistbox.pack(side=Tkinter.LEFT, fill=Tkinter.Y)
        scrollbar.pack(side=Tkinter.RIGHT,fill=Tkinter.Y)
     
        scrollbar['command']=cardlistbox.yview
        cardlistbox['yscrollcommand']=scrollbar.set
     
        cardlist=get_cardlist(db_path)
        for item in cardlist:
            cardlistbox.insert(END,item)
     
        del_wdw.close_button = Button(del_wdw, text="Close", command = recuper_selection )
        del_wdw.close_button.pack()
     
        current_selection = Label(frame_del,text="dddz")
        current_selection.pack()
     
     
    root = Tk()
    root.title("MTG Price Checker")
    root.config(width=300)
    root.config(height=100)
     
     
    frame=Frame(root)
    frame.pack()
     
    del_button = Button(frame, text="Del Card", command=del_card,height="3")
    del_button.grid(row=3,rowspan=3, column=4)
     
     
     
     
    root.mainloop()
    Mon guide pour apprendre Tkinter - N'oubliez pas de consulter les FAQ Python ou de visiter mon blog

  5. #5
    Candidat au Club
    Inscrit en
    Décembre 2006
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 7
    Points : 3
    Points
    3
    Par défaut
    MErci pour les infos

    En fait je voulais récupérer la valeur de l'item tout en restant dans la fenetre (sans en sortir ^^ )
    est ce faisable?

  6. #6
    Membre confirmé
    Avatar de vincent.mbg
    Homme Profil pro
    Développeur Python
    Inscrit en
    Décembre 2007
    Messages
    327
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur Python

    Informations forums :
    Inscription : Décembre 2007
    Messages : 327
    Points : 618
    Points
    618
    Par défaut
    Bonjour,
    Je te met juste ce qui change.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    def del_card():
     
        def recuper_selection( event ) :
            " s'execute a la destruction de del_wdw."
            selection = cardlistbox .curselection()
            if selection != () :
                print( cardlistbox .get( int( selection[0] ) ) )
     
                # [...]
     
        cardlistbox.bind( "<ButtonRelease-1>", recuper_selection )
    Mon guide pour apprendre Tkinter - N'oubliez pas de consulter les FAQ Python ou de visiter mon blog

  7. #7
    Candidat au Club
    Inscrit en
    Décembre 2006
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 7
    Points : 3
    Points
    3
    Par défaut
    Merci, mais je cherche plus a avoir acces a la valeur de l'item selectionné sans avoir a quitter la fenetre

Discussions similaires

  1. Afficher une recherche après une sélection dans une ListBox
    Par vitalus dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 25/05/2015, 18h04
  2. [Débutant] Mettre une listBox dans une colonne d'une listView
    Par Tom57300 dans le forum VB.NET
    Réponses: 1
    Dernier message: 23/04/2014, 15h40
  3. récuperer les données cochées dans une listbox dans une nouvelle liste
    Par Lost_in_VBA dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 13/07/2011, 12h12
  4. Envoyer une formulaire dans une page dans une Frame
    Par zooffy dans le forum Balisage (X)HTML et validation W3C
    Réponses: 5
    Dernier message: 29/06/2007, 10h13
  5. Recherche une valeur d'une cellule dans une colonne d'une autre feuille
    Par kourria dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 21/06/2007, 13h48

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