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

Python Discussion :

Sélectionner une valeur dans combobox pour recherche [Python 3.X]


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de lagratteCchouette
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    190
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 190
    Par défaut Sélectionner une valeur dans combobox pour recherche
    Bonjour,

    Par une combobox, je souhaite sélectionner un auteur par exemple "Platon" dans ma liste déroulante provenant de ma table [tb_auteur] pour lancer ensuite une recherche dans ma tb_citation et extraire toutes les citations de "Platon".

    Nom : 020.JPG
Affichages : 174
Taille : 28,4 Ko

    Un peu comme cela.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    def callbackFunc(event):
        print(comboExample.get())
     
    app = tk.Tk()
    app.geometry('200x100')
    labelTop = tk.Label(app,text="Choose your favourite month")
    labelTop.grid(column=0, row=0)
    comboExample = ttk.Combobox(app,values=["Socrate","Platon","Plutarque","Chruchill"])
    comboExample.grid(column=0, row=1)
    comboExample.bind("<<ComboboxSelected>>", callbackFunc)
     
    app.mainloop()
    Mais cela ne marche pas... il me manque une compréhension.
    Pourriez-vous s'il vous plaît m'aider ?
    Merci beaucoup par avance.

    Voici mon code.

    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
    # simple criteria or multi-criteria search functions
    
    # function callback
    def callbackAuteur(event):
        print(cmb_attribution.get())  # DEBUG
    rslcmb = cmb_attribution.get()
    
    
    def cmb_auteur2():
        """ Data recovery and insertion in combobox author_citation """
    connexion = sqlite3.connect('mnesis.db')
        cursor = connexion.cursor()
        cursor.execute('SELECT auteur FROM tb_auteur ORDER BY auteur')
        data1 = []
        for row in cursor.fetchall():
            data1.append(row[0])
        return data1
    
    
    def queryQuoteforauteur():
        """ Returns the values of the records of the Database """
    connexion = sqlite3.connect('mnesis.db')
        cursor = connexion.cursor()
        rsl = rslcmb
        cursor.execute('SELECT * FROM tb_citation WHERE auteur=?', (rsl,))
        print(f"SELECT * FROM tb_citation WHERE auteur = '{rsl}'")  # DEBUG
    resultDatabase = cursor.fetchall()
        results = ''
    for row in resultDatabase:
            results += '\n'.join({
                'Auteur: {}'.format(row[1]),
    'Citation: {}'.format(row[2]),
    'Référence: {}'.format(row[3]),
    '-----------------------\n'
    })
        connexion.close()
        return results
    
    
    def result_quote():
        """ Returns the values of the database records """
    tpl_result = Toplevel()  # == Contructor Toplevel ==
    tpl_result.title(" Data display")
        tpl_result.geometry("1024x600")
        # Text area with scrollbar
    zonetext = tk.Text()
        zonetext = ScrolledText(tpl_result, width=120, height=35)
        zonetext.pack()
        resulreq = query_quote()
        zonetext.insert("0.0", resulreq)
        # end of the loop ---
    tpl_result.mainloop()
    
    
    def search_data():
        """
        Search by selection of a combobox
        """
    global tpl_search
    
        tpl_search = Toplevel()  # == Constructor Toplevel ==
    tpl_search.title(" Search by selection of a combobox")
        screen_x = int(tpl_search.winfo_screenwidth())
        screen_y = int(tpl_search.winfo_screenheight())
        tpl_search_x = 400
    tpl_search_y = 100
    pos_x = (screen_x // 2) - (tpl_search_x // 2)
        pos_y = (screen_y // 2) - (tpl_search_y // 2)
        geo = "{}x{}+{}+{}".format(tpl_search_x, tpl_search_y, pos_x, pos_y)
        tpl_search.geometry(geo)
        tpl_search.resizable(width=False, height=False)  # Editable window True or False
    tpl_search.configure(bg='Gray79')
        # ------------
    attribution_label = Label(tpl_search, text="Author", bg='Gray79', font=("Arial", 11, "bold"))
        attribution_label.place(x=100, y=25)
    
        cmb_attribution = ttk.Combobox(tpl_search, values=cmb_auteur2(), width=20, height=30,
    font=("Arial", 10, "bold"))
        cmb_attribution.bind('<<ComboboxSelected>>', cmb_auteur2)
        cmb_attribution.place(x=100, y=46)
        # ----
    record_btn = Button(tpl_search, text='Launch', activebackground="SkyBlue1", font=("Arial", 8),
    command=lambda: queryQuoteforauteur())
        record_btn.place(x=280, y=46)
        # end of the loop ---
    tpl_search.mainloop()
    A la sélection de l'auteur j'ai ce message :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    Exception in Tkinter callback
    Traceback (most recent call last):
      File "C:\Users\xxxxxxx\AppData\Local\Programs\Python\Python37\lib\tkinter\__init__.py", line 1705, in __call__
        return self.func(*args)
    TypeError: cmb_auteur2() takes 0 positional arguments but 1 was given
    Et quand je lance la recherche j'ai ce message :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    Exception in Tkinter callback
    Traceback (most recent call last):
      File "C:\Users\xxxxxx\AppData\Local\Programs\Python\Python37\lib\tkinter\__init__.py", line 1705, in __call__
        return self.func(*args)
      File "C:/Users/xxxxxxxx/Documents/_PythonDeveloppement/GnosisProject/main21_b.py", line 986, in <lambda>
        command=lambda: queryQuoteforauteur())
      File "C:/Users/xxxxxx/Documents/_PythonDeveloppement/GnosisProject/main21_b.py", line 927, in queryQuoteforauteur
        rsl = rslcmb
    NameError: name 'rslcmb' is not defined

  2. #2
    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
    Salut,

    Citation Envoyé par lagratteCchouette Voir le message
    Pourriez-vous s'il vous plaît m'aider ?
    Comme à votre habitude, vous butez sur un message d'erreur (NameError: name 'rslcmb' is not defined) qui vous dit juste que la variable (globale) 'rslcmb' n'a pas (encore) été définie avant que le code cherche à la lire (via rsl = rslcmb).

    Comme d'habitude aussi, vous donnez des extraits de votre code avec des copier/coller qui se moquent de l'indentation et le rende illisible.

    Pourtant, un peu de travaill permettrait d'écrire facilement:
    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
    import tkinter as tk
    import tkinter.ttk as ttk
     
    def callbackFunc(event):
        print(comboExample.get())
        variable = comboExample.get()
     
    app = tk.Tk()
    app.geometry('200x100')
    labelTop = tk.Label(app,text="Choose your favourite month")
    labelTop.grid(column=0, row=0)
    comboExample = ttk.Combobox(app,values=["Socrate","Platon","Plutarque","Chruchill"])
    comboExample.grid(column=0, row=1)
    comboExample.bind("<<ComboboxSelected>>", callbackFunc)
     
    tk.Button(app, text='show', command=lambda: print(variable)).grid()
     
    app.mainloop()
    J'ai ajouté un Button qui déclenche un callback qui essaiera de lire la variable "variable" supposée être crée par le callback.

    Évidemment, çà plante... Juste pour vous montrer qu'on peut facilement reproduire un problème avec quelques lignes de code.

    Pour le reste, ouvrez votre tuto. préféré pour revoir les chapitres qui parlent de fonctions et de portée des variables.
    note: ce n'est pas la première fois que vous venez ici avec ce genre d'erreur! Manifestement, çà n'imprime pas. Il faut en remettre un couche.

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

  3. #3
    Membre confirmé Avatar de lagratteCchouette
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    190
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 190
    Par défaut
    Merci beaucoup je comprends.
    J'avance à petit pas... mais j'avance en tout cas grâce à vos conseils.
    Et la prochaine fois, je vérifierai l'indentation dans le code... vous avez raison.
    Gracias

  4. #4
    Membre confirmé Avatar de lagratteCchouette
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    190
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 190
    Par défaut Solution
    Et bien voilà une des solutions... Si vous avez des idées pour mieux l'écrire, je suis preneur !
    Déclarer après les différents imports en début de code les variables en global.

    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
    # coding:utf-8
    from varfunction15 import *
    from tkinter import *
    import tkinter as tk
    import tkinter.ttk as ttk
    from tkinter import Entry, Text
    from PIL import Image, ImageTk  # module image
    from tkinter.scrolledtext import *
    from tkcalendar import Calendar, DateEntry  # Widget calendar
    import webbrowser
    
    # variable globale
    cmb_attribution = None
    rsltcmb = None
    
    Ensuite...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    # function callback
    def callbackAuteur(event):
        global rsltcmb # la déclarer à nouveau en global pour éviter que python la considère en local
        rsltcmb = cmb_attribution.get()
    Ma fameuse combobox

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    
    def cmb_auteursearch():
        """ Data recovery and insertion in combobox author_citation """
        connexion = sqlite3.connect('mnesis.db')
        cursor = connexion.cursor()
        cursor.execute('SELECT auteur FROM tb_auteur ORDER BY auteur')
        data = []
        for row in cursor.fetchall():
            data.append(row[0])
        return data

    Ma requête

    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
    
    def queryQuoteforauteur():
        """ Returns the values of the records of the Database """
        connexion = sqlite3.connect('mnesis.db')
        cursor = connexion.cursor()
        cursor.execute('SELECT * FROM tb_citation WHERE auteur=?', (rsltcmb,))
        results = ''
        for row in cursor.fetchall():
            results += '\n'.join({
                'Auteur: {}'.format(row[1]),
                'Citation: {}'.format(row[2]),
                'Référence: {}'.format(row[3]),
                '-----------------------\n'
            })
            connexion.close()
           return results
    Mon formulaire toplevel pour l'affichage de la recherche

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    def result_quote():
      "" Returns the values of the database records """
        tpl_result = Toplevel()  # == Contructor Toplevel ==
        tpl_result.title(" Data display")
        tpl_result.geometry("1024x600")
        # Text area with scrollbar
        zonetext = tk.Text()
        zonetext = ScrolledText(tpl_result, width=120, height=35)
        zonetext.pack()
        resulreq = queryQuoteforauteur()
        zonetext.insert("0.0", resulreq)
        # end of the loop ---
    tpl_result.mainloop()
    Mon formulaire de recherche

    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
    def search_data():
        """
        Search by selection of a combobox
        """
    global tpl_search
    
        tpl_search = Toplevel()  # == Constructor Toplevel ==
    tpl_search.title(" Search by selection of a combobox")
        screen_x = int(tpl_search.winfo_screenwidth())
        screen_y = int(tpl_search.winfo_screenheight())
        tpl_search_x = 400
    tpl_search_y = 100
    pos_x = (screen_x // 2) - (tpl_search_x // 2)
        pos_y = (screen_y // 2) - (tpl_search_y // 2)
        geo = "{}x{}+{}+{}".format(tpl_search_x, tpl_search_y, pos_x, pos_y)
        tpl_search.geometry(geo)
        tpl_search.resizable(width=False, height=False)  # Editable window True or False
    tpl_search.configure(bg='Gray79')
        # ------------
    attribution_label = Label(tpl_search, text="Author", bg='Gray79', font=("Arial", 11, "bold"))
        attribution_label.place(x=100, y=25)
        global cmb_attribution # intérieur
    cmb_attribution = ttk.Combobox(tpl_search, values=cmb_auteursearch(), width=20, height=30,
    font=("Arial", 10, "bold"))
        cmb_attribution.bind('<<ComboboxSelected>>', callbackAuteur)
        cmb_attribution.place(x=100, y=46)
        # ----
    record_btn = Button(tpl_search, text='Launch', activebackground="SkyBlue1", font=("Arial", 8),
    command=lambda: result_quote())
        record_btn.place(x=280, y=46)
        # end of the loop ---
    tpl_search.mainloop()
    Voilà... beaucoup de galère que j'évite à d'autres

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

Discussions similaires

  1. macro pour sélectionner une valeur dans un TDC
    Par sebogoss dans le forum Macros et VBA Excel
    Réponses: 0
    Dernier message: 19/11/2009, 14h50
  2. Réponses: 7
    Dernier message: 27/05/2008, 13h59
  3. Réponses: 7
    Dernier message: 21/03/2007, 16h07
  4. [langage] Sélectionner une valeur dans une balise
    Par Melvine dans le forum Langage
    Réponses: 2
    Dernier message: 17/11/2006, 17h57
  5. Sélectionner une valeur dans un RxDBLookupCombo
    Par Oluha dans le forum Bases de données
    Réponses: 2
    Dernier message: 22/09/2005, 09h10

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