Partage
  • Partager sur Facebook
  • Partager sur Twitter

Afficher données Sqlite3 dans widget text Tkinter

Sujet résolu
    24 octobre 2019 à 0:03:22

    Bonjour,

    Je souhaite pouvoir après avoir récupéré des données dans ma table AVEC PYTHON 3, les récupérer dans une fenêtre Tkinter et dans un widget type "text" afin ensuite de paramétrer un scrollbar.
    Mais là il me manque une notion, car j'ai ce message d'erreur. pouvez-vous s'il vous plaît m'aider.

    Exception in Tkinter callback
    Traceback (most recent call last):
      File "C:\Users\xxxxx\AppData\Local\Programs\Python\Python37\lib\tkinter\__init__.py", line 1705, in __call__
        return self.func(*args)
      File "c:\xxxxxx\xxxxxx_database_projet-04\R�cup�ration des donn�es sqlite_02.py", line 17, in result_citation
        print("Auteur : ",rows[1]) # Choix de l'indice position
    IndexError: string index out of range 


    Voici mon code :

    # -*- coding: utf-8 -*-
    
    from tkinter import *
    import sqlite3
    import tkinter as tk
    import tkinter.ttk as ttk
    
    root = Tk()
    root.geometry('450x300')
    
    def result_citation():
        connexion = sqlite3.connect('mnesis.db')
        curseur = connexion.cursor()  
        curseur.execute ("SELECT * FROM tb_citation")
        result = curseur.fetchall() # requête
        for rows in str(result):
            print("Auteur : ",rows[1]) # Choix de l'indice position 
            print("Citation : ",rows[2]) # Choix de l'indice position 
            print("Référence : ",rows[3]) # Choix de l'indice position 
            print("----------------------------------") # Choix de l'indice position 
        labelCitation = Label(root, text="Résultat des données citation" ).pack() 
        citation_result = Text(root,result_citation).pack()
    
    Buton = Button(root,command=result_citation).pack()
    
    root.mainloop()

    Merci beaucoup par avance.

    -
    Edité par lagratteCchouette 27 octobre 2019 à 9:40:21

    • Partager sur Facebook
    • Partager sur Twitter
      24 octobre 2019 à 10:21:28

      Bonjour,

      Ça doit être à cause de ta conversion du result en String, qui n'a pas vraiment de sens. Quand tu fais "curseur.fetchall()', tu obtiens une liste sur laquelle tu peux itérer. Quand tu convertis cette liste en string, il n'existe que la première position, la position 0.

          for rows in result:
              print("Auteur : ",rows[1]) # Choix de l'indice position
              print("Citation : ",rows[2]) # Choix de l'indice position
              print("Référence : ",rows[3]) # Choix de l'indice position
              print("----------------------------------") # Choix de l'indice position 

      Fais comme ci-dessus et ça ne devrait pas poser de problème.

      • Partager sur Facebook
      • Partager sur Twitter
        24 octobre 2019 à 13:23:10

        Ok, je si j'ai bien compris voici mon nouveau code.

        # -*- coding: utf-8 -*-
        
        from tkinter import *
        import sqlite3
        import tkinter as tk
        import tkinter.ttk as ttk
        
        def result_citation():
            connexion = sqlite3.connect('mnesis.db')
            curseur = connexion.cursor()  
            curseur.execute ("SELECT * FROM tb_citation")
            result = curseur.fetchall() # requête
            for rows in result:
                print("Auteur : ",rows[1]) # Choix de l'indice position 
                print("Citation : ",rows[2]) 
                print("Référence : ",rows[3])
                print("----------------------------------") 
            
        root = Tk()
        root.geometry('450x300')
        
        Buton = Button(root,text="Résulat",command=result_citation).pack()
        labelCitation = Label(root, text="Résultat des données citation").pack() 
        citation_result = Text(root,text=result_citation).pack()
        
        root.mainloop()

         mais il me reste un message d'erreur.

        _tkinter.TclError: unknown option "-text"





        • Partager sur Facebook
        • Partager sur Twitter
          24 octobre 2019 à 13:35:55

          Bonjour,

          Tu aurais pu encore plus simplifié ton code en retirant les importations de tk et ttk car ils ne semblent pas utilisées.

          Je ne suis pas sûr que dans la doc du widget Text se trouve le paramètre text ?

          • Partager sur Facebook
          • Partager sur Twitter

          Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
          La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

            24 octobre 2019 à 13:47:25

            Essaie de donner un peu plus de détails sur l'erreur affichée (numéro de ligne, etc.), car tu as deux lignes qui sont concernées par l'option "text".

            labelCitation = Label(root, text="Résultat des données citation").pack()
            citation_result = Text(root,text=result_citation).pack()

            Néanmoins, il semblerait que ce soit la deuxième ligne sur la fonction Text, comme tu peux le voir sur la documentation de Tkinter Text. Pour insérer du texte, regarde au niveau de la méthode "insert" sur un objet Text (plus de détails dans le même lien que je t'ai fourni).

            insert(index [,string]...)

            This method inserts strings at the specified index location.

            -
            Edité par DrBul 24 octobre 2019 à 13:48:29

            • Partager sur Facebook
            • Partager sur Twitter
              24 octobre 2019 à 16:18:00

              Merci Luffy hi hi,

              Bien en gros ce que je suis en train de faire c'est une base de donnée sqlite3 avec une interface que j'ai réalisée avec menu etc...

              J'arrive à enregistrer des données et maintenant je test la partie du la fonction de récupération avant de l'intégrer dans mon programme (que je vais te mettre la fin, ce qui te permettra de mieux comprendre) avant ensuite d'essayer de développer un moteur de recherche (étape II).

              Mais je n'arrive pas à comprendre la logique, car si je désactive la ligne 24, ma fenêtre apparaît bien et quand je clic sur le bouton mes données sont bien restituées dans la console. Mais alors pour restituer ces données dans ma fenêtre et qui plus est, je pense que c'est mieux dans un champ "text" pour avoir après à paramétrer un scrollbar... là je patine en logique  car c'est bien la ligne 24 qui est concernée.

              Si il y a plus simple... je suis preneur.

              Alors désolé j'avais oublié de mettre l'ensemble du message d'erreur.

              Traceback (most recent call last):
                File "c:\xxxxx\menesis_database_projet-04\R�cup�ration des donn�es sqlite_03b.py", line 24, in <module>
                  citation_result = Text(root,text=result_citation).pack()
                File "C:\Users\xxxxxxx\AppData\Local\Programs\Python\Python37\lib\tkinter\__init__.py", line 3101, in __init__
                  Widget.__init__(self, master, 'text', cnf, kw)
                File "C:\Users\xxxxxx\AppData\Local\Programs\Python\Python37\lib\tkinter\__init__.py", line 2299, in __init__
                  (widgetName, self._w) + extra + self._options(cnf))
              _tkinter.TclError: unknown option "-text"

              Pour mon code de programme dans lequel je veux l'intégrer après, le voici :

              # -*- coding: utf-8 -*-
              
              from tkinter import *
              import tkinter as tk
              import tkinter.ttk as ttk
              from main_sql import * # syntaxe pour appeller un autre fichier py + fonction
              from tkinter import font
              from PIL import Image, ImageTk # module image
              
              
              class HoverButton(tk.Button):
                  def __init__(self, master, **kw):
                      tk.Button.__init__(self,master=master,**kw)
                      self.defaultBackground = self["background"]
                      self.bind("<Enter>", self.on_enter)
                      self.bind("<Leave>", self.on_leave)
              
                  def on_enter(self, e):
                      self["background"] = self["activebackground"]
              
                  def on_leave(self, e):
                      self["background"] = self.defaultBackground
              
              
              def cmb_nomsauteur(event=None):
                  connexion = sqlite3.connect('mnesis.db')
                  cursor = connexion.cursor()
                  cursor.execute('SELECT auteur_auteur FROM tb_auteur')
                  data = []
                  for row in cursor.fetchall():
                      data.append(row[0])
                  return data
                     
               
              def runauteur():
                  global boutonEnregistrer
                  toplevelAuteur = Toplevel()  #== Contructeur Toplevel ==
                  toplevelAuteur.title(" Bienvenue dans la saisie des auteurs")
                  screen_x = int(toplevelAuteur.winfo_screenwidth())
                  screen_y = int(toplevelAuteur.winfo_screenheight())
                  toplevelAuteur_x = 1260
                  toplevelAuteur_y = 720
                  pos_x = (screen_x // 2) - (toplevelAuteur_x // 2)
                  pos_y = (screen_y // 2) - (toplevelAuteur_y // 2)
                  geo = "{}x{}+{}+{}".format(toplevelAuteur_x, toplevelAuteur_y, pos_x, pos_y)
                  toplevelAuteur.geometry(geo)
                  toplevelAuteur.resizable(width=False,height=False) # Fenêtre modifiable True or False
                  toplevelAuteur.configure(bg='Gray79')
                  labelAuteur = Label(toplevelAuteur, text="Auteur",bg='Gray79', font=("Arial", 12,"bold"))
                  labelAuteur.place(x=30,y=38)
                  entreeAuteur = Entry (toplevelAuteur, width="50",font=("Arial", 12,"bold"))
                  entreeAuteur.place(x=30,y=65)
                  labelInfo = Label(toplevelAuteur, text="Information",bg='Gray79', font=("Arial", 12,"bold"))
                  labelInfo.place(x=30,y=100)
                  entreeInfo = Text(toplevelAuteur, width="149", height="30")
                  entreeInfo.place(x=30,y=127)
                  boutonEnregistrer = HoverButton(toplevelAuteur, text='Enregistrer', activebackground="SkyBlue1", command=lambda : enregisterAuteur(entreeAuteur.get(), entreeInfo.get('1.0', END)))  
                  boutonEnregistrer.pack(side=BOTTOM, anchor=SE, padx=20, pady=20) #boutonEnregistrer.place(x=700,y=400)
              
              
              def runcitation():
                  global boutonEnregistrer
                  toplevelCitation = Toplevel()  #== Contructeur Toplevel ==
                  toplevelCitation.title(" Bienvenue dans la saisie des citations")
                  screen_x = int(toplevelCitation.winfo_screenwidth())
                  screen_y = int(toplevelCitation.winfo_screenheight())
                  toplevelCitation_x = 1260
                  toplevelCitation_y = 720
                  pos_x = (screen_x // 2) - (toplevelCitation_x // 2)
                  pos_y = (screen_y // 2) - (toplevelCitation_y // 2)
                  geo = "{}x{}+{}+{}".format(toplevelCitation_x, toplevelCitation_y, pos_x, pos_y)
                  toplevelCitation.geometry(geo)
                  toplevelCitation.resizable(width=False,height=False) # Fenêtre modifiable True or False
                  toplevelCitation.configure(bg='lightblue3')
                  #---
                  labelCitation_Auteur = Label(toplevelCitation, text="Auteur",bg='lightblue3', font=("Arial", 12,"bold"))
                  labelCitation_Auteur.place(x=30,y=38)
                  # Combobox noms des auteurs     
                  combobox = ttk.Combobox(toplevelCitation, values=cmb_nomsauteur(), width=35, font=("Arial", 14,"bold")) # Récupération des valeurs de la fonction def cmb_nomsauteur():
                  combobox.bind('<<ComboboxSelected>>', cmb_nomsauteur)
                  combobox.place(x=30,y=65)
                  #------------       
                  labelCitation = Label(toplevelCitation, text="Citation",bg='lightblue3', font=("Arial", 12,"bold"))
                  labelCitation.place(x=30,y=100)
                  entreeCitation = Text(toplevelCitation, width="149", height="28")
                  entreeCitation.place(x=30,y=127)
                  labelReference = Label(toplevelCitation, text="Référence",bg='lightblue3', font=("Arial", 12,"bold"))
                  labelReference.place(x=30,y=593)
                  entreeReference = Text(toplevelCitation, width="149", height="1")
                  entreeReference.place(x=30,y=620)
                  # get => thetext = text.get ('1.0', 'end') clea veut de la 1ère à 'end' la fin de la dernière ligne
                  boutonEnregistrer_citation = Button(toplevelCitation, text='Enregistrer', command=lambda : enregisterCitation(combobox.get(), entreeCitation.get('1.0', END), entreeReference.get('1.0', END)))
                  boutonEnregistrer_citation.pack(side=BOTTOM, anchor=SE, padx=20, pady=20) 
              
              #================== Création de la fénêtre principale ================
              fenetre_pce =Tk() # Fenêtre prinicpale
              fenetre_pce.title("Menesis... se souvenir !")
              screen_x = int(fenetre_pce.winfo_screenwidth())   # Fonction centrer fenêtre
              screen_y = int(fenetre_pce.winfo_screenheight())
              fenetre_pce_x = 1600
              fenetre_pce_y = 900
              pos_x = (screen_x // 2) - (fenetre_pce_x // 2)
              pos_y = (screen_y // 2) - (fenetre_pce_y // 2)
              geo = "{}x{}+{}+{}".format(fenetre_pce_x, fenetre_pce_y, pos_x, pos_y)   # Attention le 1er facteur est x ensuite +
              fenetre_pce.geometry(geo)
              fenetre_pce.resizable(width=False,height=False) # Fenêtre modifiable True or False
              fenetre_pce.iconbitmap("img/search.ico") ### Changement de l'icone de la fenêtre [l'icone doit être placé dans le répertoire racine de l'application ou un autre répertoire img/...]
              
              #=================== Création d'un menu ==============================
              menubar = Menu(fenetre_pce,borderwidth=20, relief=GROOVE) # Création de la FRAME pour placer les menus dans le constructeur  ==> fenetre =Tk() 
              menuFichier = Menu(menubar, tearoff=0) # Création du menu "Fichier"
              menubar.add_cascade(label="Fichier", menu=menuFichier) # Rattachement des commandes au menu "Fichier"
              menuFichier.add_command(label="Créer")
              menuFichier.add_command(label="Ouvrir",)
              menuFichier.add_command(label="Editer")
              menuFichier.add_separator() # Ligne de séparation
              menuFichier.add_command(label="Quitter", command=fenetre_pce.quit)
              
              menuEdition = Menu(menubar, tearoff=0)
              menubar.add_cascade(label="Edition", menu=menuEdition)
              menuEdition.add_command(label="Couper")
              menuEdition.add_command(label="Copier")
              menuEdition.add_command(label="Coller")
              menuEdition.add_command(label="Créer")
              
              menuAuteur = Menu(menubar, tearoff=0)
              menubar.add_cascade(label="Auteur", menu=menuAuteur)
              menuAuteur.add_command(label="Créer", command=runauteur)
              menuAuteur.add_command(label="Consulter")
              
              menuCitation = Menu(menubar, tearoff=0)
              menubar.add_cascade(label="Citation", menu=menuCitation)
              menuCitation.add_command(label="Créer", command=runcitation)
              menuCitation.add_command(label="Consulter")
              
              menuAide = Menu(menubar, tearoff=0)
              menubar.add_cascade(label="Aide", menu=menuAide)
              menuAide.add_command(label="A propos") 
              
              fenetre_pce.config(menu=menubar) # Configuration et print menu
              #----------------------------------------------------------------
              #Citation accueil
              labelcitation1 = Label(fenetre_pce, text="'Le souvenir est le parfum de l'âme' - Georges Sand", font=("Arial", 14,"bold")).pack()
              # Fond d'écram accueil
              frontimage = ImageTk.PhotoImage(Image.open("img/connaissance_1600-900.jpg") ) # image de fond page d'accueil
              frontimagelabel = Label(fenetre_pce, image=frontimage).pack(expand=1)
              
              
              
              #== Fermeture de la boucle principale ==
              fenetre_pce.mainloop() # Boucle principale
              
              
              
              





              • Partager sur Facebook
              • Partager sur Twitter
                24 octobre 2019 à 17:45:06

                lagratteCchouette a écrit:

                Mais je n'arrive pas à comprendre la logique, car si je désactive la ligne 24, ma fenêtre apparaît bien et quand je clic sur le bouton mes données sont bien restituées dans la console. Mais alors pour restituer ces données dans ma fenêtre et qui plus est, je pense que c'est mieux dans un champ "text" pour avoir après à paramétrer un scrollbar... là je patine en logique  car c'est bien la ligne 24 qui est concernée.

                Le widget Text n'est pas forcément adapté, même si avec la méthode insert on peut y insérer du texte... je choisirai plutôt du côté du widget Message.

                Dans ce dernier, ça tombe bien tu as le paramètre text:D

                • Partager sur Facebook
                • Partager sur Twitter

                Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
                La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

                  24 octobre 2019 à 18:15:00

                  Merci,

                  Mais je n'arrive toujours pas faire apparaître dans mon widget les données récupérées de Sqlite3 ave le widget message. Qu'est-ce que je n'ai pas bien saisie ?

                  # -*- coding: utf-8 -*-
                  
                  from tkinter import *
                  import sqlite3
                  import tkinter as tk
                  import tkinter.ttk as ttk
                  
                  def result_citation():
                      connexion = sqlite3.connect('mnesis.db')
                      curseur = connexion.cursor()  
                      curseur.execute ("SELECT * FROM tb_citation")
                      result = curseur.fetchall() # requête
                      for rows in result:
                          print("Auteur : ",rows[1]) # Choix de l'indice position 
                          print("Citation : ",rows[2]) 
                          print("Référence : ",rows[3])
                          print("----------------------------------") 
                      
                  root = Tk()
                  root.geometry('450x300')
                  
                  Buton = Button(root,text="Résulat",command=result_citation).pack()
                  labelCitation = Label(root, text="Résultat des données citation").pack() 
                  
                  #citation_result = Text(root,text=result_citation).pack()
                  citation_result = Message(root, text=result_citation,width=50).pack()
                  
                  root.mainloop()
                  



                  • Partager sur Facebook
                  • Partager sur Twitter
                    24 octobre 2019 à 18:16:59

                    Le texte doit être le résultat de result_citation() et non result_citation je pense.

                    Sauf que rien n'est retournée dans cette fonction, juste de l'affichage.

                    -
                    Edité par fred1599 24 octobre 2019 à 19:05:20

                    • Partager sur Facebook
                    • Partager sur Twitter

                    Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
                    La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

                      24 octobre 2019 à 19:18:29

                      Merci, j'ai effectivement modifié mon code :

                      citation_result = Message(root, text=result_citation(),width=50).pack()

                      Mais a part un affichage dans la console je n'ai rien dans ma fenêtre tkinter.

                      Là... une chose m'échappe, pourtant je pense être logique... où est le bug selon vous ?



                      • Partager sur Facebook
                      • Partager sur Twitter
                        24 octobre 2019 à 19:31:35

                        Eh bien il faut relire mon message précédent, la réponse à ta question y est...
                        • Partager sur Facebook
                        • Partager sur Twitter

                        Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
                        La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

                          24 octobre 2019 à 19:45:24

                          Oui, merci mais je ne comprends pas.
                          • Partager sur Facebook
                          • Partager sur Twitter
                            25 octobre 2019 à 7:40:51

                            Ta fonction doit retourner une valeur et non l'afficher. Si tu ne comprends toujours pas, alors il faut se tourner vers un tutoriel sur les fonctions et voir la différence entre print et return.
                            • Partager sur Facebook
                            • Partager sur Twitter

                            Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
                            La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

                              27 octobre 2019 à 8:58:43

                              Bonjour,

                              Après avoir suivi la piste... est-ce que cela peu ressembler à ça ?

                              # -*- coding: utf-8 -*-
                               
                              from tkinter import *
                              import sqlite3
                              import tkinter as tk
                              import tkinter.ttk as ttk
                               
                              def result_citation(rows):
                                  connexion = sqlite3.connect('mnesis.db')
                                  curseur = connexion.cursor() 
                                  resultDatabase=curseur.execute ("SELECT * FROM tb_citation")
                                  for rows in resultDatabase.fetchall():
                                      return rows
                              
                              def affiche(rows):
                                  zonetext= Text(root).pack()
                                  zonetext.config( font=('arial',12))
                                  print(rows)
                                  zonetext.insert(END,rows) # la solution est bien là
                                  zonetext.after(1000,result_citation)
                                     
                              root=Tk()
                              root.geometry('800x400')
                              root.title('Récupération et insertion des données database')
                              
                              
                              btn_afficherDtB=Button(root,text='afficher database data', command=affiche).pack
                              label = Label(root,Text=affiche()).pack()
                              
                              root.mainloop()

                              mais j'ai ce message :

                              Traceback (most recent call last):
                                File "c:\xxx\xxx_database_projet-04\R�cup�ration des donn�es sqlite_01c.py", line 28, in <module>
                                  label = Label(root,Text=affiche()).pack()
                              TypeError: affiche() missing 1 required positional argument: 'rows'





                              • Partager sur Facebook
                              • Partager sur Twitter
                                27 octobre 2019 à 9:03:12

                                lagratteCchouette a écrit:

                                mais j'ai ce message :

                                Traceback (most recent call last):
                                  File "c:\xxx\xxx_database_projet-04\R�cup�ration des donn�es sqlite_01c.py", line 28, in <module>
                                    label = Label(root,Text=affiche()).pack()
                                TypeError: affiche() missing 1 required positional argument: 'rows'

                                Eh bien apparemment la fonction affiche prend un argument, hors ligne 28, il n'y en a pas...



                                • Partager sur Facebook
                                • Partager sur Twitter

                                Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
                                La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

                                  27 octobre 2019 à 9:37:06

                                  Ah merci,

                                  Mais là pourriez-vous m'aider à finaliser s'il vous plaît, merci beaucoup par avance.

                                  Est-ce aussi que la structure de mon programme est bien conforme par rapport à ce que je souhaite faire ?

                                  -
                                  Edité par lagratteCchouette 27 octobre 2019 à 9:39:20

                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                    27 octobre 2019 à 10:51:01

                                    En gros le principe par rapport à votre code précédent (pas le dernier), c'est de faire de la concaténation... Si vous ne connaissez pas les bases, il faut guère aller plus loin et reprendre un tutoriel qui va vous remettre en mémoire tout cela.

                                    def result_citation():
                                        connexion = sqlite3.connect('mnesis.db')
                                        curseur = connexion.cursor() 
                                        curseur.execute ("SELECT * FROM tb_citation")
                                        result = curseur.fetchall() # requête
                                        results = ''
                                        for rows in result:
                                            results += '\n'.join([
                                                'Auteur: {}'.format(rows[1]),
                                                'Citation: {}'.format(rows[2]),
                                                'Référence: {}'.format(rows[3]),
                                                '----------------------------------\n'
                                            ])
                                        return results

                                    Le code ci-dessus n'est pas testé, mais me semble être suffisamment intuitif comme idée, car les modifications n'étaient pas nombreuses.

                                    -
                                    Edité par fred1599 27 octobre 2019 à 12:25:09

                                    • Partager sur Facebook
                                    • Partager sur Twitter

                                    Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
                                    La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

                                      22 novembre 2019 à 18:08:50

                                      Bonjour,

                                      J'ai travaillé le code, mais je n'arrive toujours pas à afficher et pourtant je n'ai pas de message d'erreur.

                                      Mon code se trouve de la ligne 108 à 143, merci pour l'aide...

                                      def result_citation():
                                          tpl_result_cit = Toplevel()  #== Constructeur Toplevel ==
                                          tpl_result_cit.title(" Bienvenue dans la saisie des citations")
                                          screen_x = int(tpl_result_cit.winfo_screenwidth())
                                          screen_y = int(tpl_result_cit.winfo_screenheight())
                                          toplevelCitation_x = 1024
                                          toplevelCitation_y = 600
                                          pos_x = (screen_x // 2) - (toplevelCitation_x // 2)
                                          pos_y = (screen_y // 2) - (toplevelCitation_y // 2)
                                          geo = "{}x{}+{}+{}".format(toplevelCitation_x, toplevelCitation_y, pos_x, pos_y)
                                          tpl_result_cit.geometry(geo)
                                          tpl_result_cit.resizable(width=False,height=False) 
                                          tpl_result_cit.configure(bg='lightblue3')
                                          labelxxx = Label(tpl_result_cit, text="Citation",bg='lightblue3', font=("Arial", 12,"bold"))
                                          # Connexion à la base de donnée
                                          connexion = sqlite3.connect('mnesis.db')
                                          curseur = connexion.cursor()
                                          curseur.execute ("SELECT * FROM tb_citation")
                                          resultDataBase = curseur.fetchall() # requête
                                          results = ''
                                          for rows in resultDataBase:
                                              results += '\n'.join([
                                                  'Auteur: {}'.format(rows[1]),
                                                  'Citation: {}'.format(rows[2]),
                                                  'Référence: {}'.format(rows[3]),
                                                  '-----------------------\n'
                                              ])
                                      
                                          connexion.close()
                                          return results
                                          # Insertion zone de texte des données
                                          zonetext = tk.Text() 
                                          zonetext = ScrolledText(tpl_result_cit, width=105, height=25).pack()
                                          results = tk.StringVar()
                                          results = result_citation()
                                          zonetext.insert("0.0",results)
                                         

                                      Et voilà mon code complet

                                      # -*- coding: utf-8 -*-
                                      from mod_sqlite3 import * # syntaxe pour appeller un autre fichier py + fonction
                                      from tkinter import *
                                      import tkinter as tk
                                      import tkinter.ttk as ttk
                                      from tkinter import font
                                      from PIL import Image, ImageTk # module image
                                      from tkinter.scrolledtext import * 
                                      
                                      class HoverButton(tk.Button):
                                          def __init__(self, master, **kw):
                                              tk.Button.__init__(self,master=master,**kw)
                                              self.defaultBackground = self["background"]
                                              self.bind("<Enter>", self.on_enter)
                                              self.bind("<Leave>", self.on_leave)
                                      
                                          def on_enter(self, e):
                                              self["background"] = self["activebackground"]
                                      
                                          def on_leave(self, e):
                                              self["background"] = self.defaultBackground
                                      
                                      
                                      def cmb_nomsauteur(event=None):
                                          connexion = sqlite3.connect('mnesis.db')
                                          cursor = connexion.cursor()
                                          cursor.execute('SELECT auteur_auteur FROM tb_auteur')
                                          data = []
                                          for row in cursor.fetchall():
                                              data.append(row[0])
                                          return data
                                             
                                       
                                      def runauteur():
                                          #global boutonEnregistrer
                                          toplevel_auteur = Toplevel()  #== Contructeur Toplevel ==
                                          toplevel_auteur.title(" Bienvenue dans la saisie des auteurs")
                                          screen_x = int(toplevel_auteur.winfo_screenwidth())
                                          screen_y = int(toplevel_auteur.winfo_screenheight())
                                          toplevelAuteur_x = 1024
                                          toplevelAuteur_y = 600
                                          pos_x = (screen_x // 2) - (toplevelAuteur_x // 2)
                                          pos_y = (screen_y // 2) - (toplevelAuteur_y // 2)
                                          geo = "{}x{}+{}+{}".format(toplevelAuteur_x, toplevelAuteur_y, pos_x, pos_y)
                                          toplevel_auteur.geometry(geo)
                                          toplevel_auteur.resizable(width=False,height=False) # Fenêtre modifiable True or False
                                          toplevel_auteur.configure(bg='Gray79')
                                          labelAuteur = Label(toplevel_auteur, text="Auteur",bg='Gray79', font=("Arial", 12,"bold"))
                                          labelAuteur.place(x=30,y=38)
                                          entreeAuteur = Entry (toplevel_auteur, width="50",font=("Arial", 12,"bold"))
                                          entreeAuteur.place(x=30,y=65)
                                          labelInfo = Label(toplevel_auteur, text="Information",bg='Gray79', font=("Arial", 12,"bold"))
                                          labelInfo.place(x=30,y=100)
                                          entreeInfo = Text(toplevel_auteur, width="120", height="25")
                                          entreeInfo.place(x=30,y=127)
                                          boutonEnregistrer = HoverButton(toplevel_auteur, text='Enregistrer', activebackground="SkyBlue1", command=lambda : enregister_auteur(entreeAuteur.get(), entreeInfo.get('1.0', END)))  
                                          boutonEnregistrer.pack(side=BOTTOM, anchor=SE, padx=20, pady=20) #boutonEnregistrer.place(x=700,y=400)
                                      
                                      class HoverButton2(tk.Button):
                                          def __init__(self, master, **kw):
                                              tk.Button.__init__(self,master=master,**kw)
                                              self.defaultBackground = self["background"]
                                              self.bind("<Enter>", self.on_enter)
                                              self.bind("<Leave>", self.on_leave)
                                      
                                          def on_enter(self, e):
                                              self["background"] = self["activebackground"]
                                      
                                          def on_leave(self, e):
                                              self["background"] = self.defaultBackground
                                      
                                      
                                      def runcitation():
                                          #global boutonEnregistrer
                                          toplevel_citation = Toplevel()  # == Contructeur Toplevel ==
                                          toplevel_citation.title(" Bienvenue dans la saisie des citations")
                                          screen_x = int(toplevel_citation.winfo_screenwidth())
                                          screen_y = int(toplevel_citation.winfo_screenheight())
                                          toplevelCitation_x = 1024
                                          toplevelCitation_y = 600
                                          pos_x = (screen_x // 2) - (toplevelCitation_x // 2)
                                          pos_y = (screen_y // 2) - (toplevelCitation_y // 2)
                                          geo = "{}x{}+{}+{}".format(toplevelCitation_x, toplevelCitation_y, pos_x, pos_y)
                                          toplevel_citation.geometry(geo)
                                          toplevel_citation.resizable(width=False,height=False) # Fenêtre modifiable True or False
                                          toplevel_citation.configure(bg='lightblue3')
                                          #---
                                          labelCitation_Auteur = Label(toplevel_citation, text="Auteur",bg='lightblue3', font=("Arial", 12,"bold"))
                                          labelCitation_Auteur.place(x=30,y=38)
                                          # Combobox noms des auteurs     
                                          combobox = ttk.Combobox(toplevel_citation, values=cmb_nomsauteur(), width=35, font=("Arial", 14,"bold")) # Récupération des valeurs de la fonction def cmb_nomsauteur():
                                          combobox.bind('<<ComboboxSelected>>', cmb_nomsauteur)
                                          combobox.place(x=30,y=65)
                                          #------------       
                                          labelCitation = Label(toplevel_citation, text="Citation",bg='lightblue3', font=("Arial", 12,"bold"))
                                          labelCitation.place(x=30,y=100)
                                          entreeCitation = Text(toplevel_citation, width="120", height="22")
                                          entreeCitation.place(x=30,y=127)
                                          labelReference = Label(toplevel_citation, text="R�f�rence",bg='lightblue3', font=("Arial", 12,"bold"))
                                          labelReference.place(x=30,y=485)
                                          entreeReference = Text(toplevel_citation, width="120", height="1")
                                          entreeReference.place(x=30,y=512)
                                          # get => thetext = text.get ('1.0', 'end') cela veut dire ('1.0') de la 1ère à 'end' la fin de la dernière ligne
                                          boutonEnregistrer = HoverButton2(toplevel_citation, text='Enregistrer', command=lambda : enregister_citation(combobox.get(), entreeCitation.get('1.0', END), entreeReference.get('1.0', END)))
                                          boutonEnregistrer.pack(side=BOTTOM, anchor=SE, padx=20, pady=20) 
                                      
                                      
                                      def result_citation():
                                          tpl_result_cit = Toplevel()  #== Constructeur Toplevel ==
                                          tpl_result_cit.title(" Bienvenue dans la saisie des citations")
                                          screen_x = int(tpl_result_cit.winfo_screenwidth())
                                          screen_y = int(tpl_result_cit.winfo_screenheight())
                                          toplevelCitation_x = 1024
                                          toplevelCitation_y = 600
                                          pos_x = (screen_x // 2) - (toplevelCitation_x // 2)
                                          pos_y = (screen_y // 2) - (toplevelCitation_y // 2)
                                          geo = "{}x{}+{}+{}".format(toplevelCitation_x, toplevelCitation_y, pos_x, pos_y)
                                          tpl_result_cit.geometry(geo)
                                          tpl_result_cit.resizable(width=False,height=False) 
                                          tpl_result_cit.configure(bg='lightblue3')
                                          labelxxx = Label(tpl_result_cit, text="Citation",bg='lightblue3', font=("Arial", 12,"bold"))
                                          # Connexion à la base de donnée
                                          connexion = sqlite3.connect('mnesis.db')
                                          curseur = connexion.cursor()
                                          curseur.execute ("SELECT * FROM tb_citation")
                                          resultDataBase = curseur.fetchall() # requête
                                          results = ''
                                          for rows in resultDataBase:
                                              results += '\n'.join([
                                                  'Auteur: {}'.format(rows[1]),
                                                  'Citation: {}'.format(rows[2]),
                                                  'Référence: {}'.format(rows[3]),
                                                  '-----------------------\n'
                                              ])
                                      
                                          connexion.close()
                                          return results
                                          # Insertion zone de texte des données
                                          zonetext = tk.Text() 
                                          zonetext = ScrolledText(tpl_result_cit, width=105, height=25).pack()
                                          results = tk.StringVar()
                                          results = result_citation()
                                          zonetext.insert("0.0",results)
                                         
                                         
                                      #================== Création de la fenêtre principale ================
                                      fenetre_pce =Tk() # Fenêtre prinicpale
                                      fenetre_pce.title("Menesis... se souvenir !")
                                      screen_x = int(fenetre_pce.winfo_screenwidth())   # Fonction centrer fenêtre
                                      screen_y = int(fenetre_pce.winfo_screenheight())
                                      fenetre_pce_x = 1260
                                      fenetre_pce_y = 768
                                      pos_x = (screen_x // 2) - (fenetre_pce_x // 2)
                                      pos_y = (screen_y // 2) - (fenetre_pce_y // 2)
                                      geo = "{}x{}+{}+{}".format(fenetre_pce_x, fenetre_pce_y, pos_x, pos_y)   # Attention le 1er facteur est x ensuite +
                                      fenetre_pce.geometry(geo)
                                      fenetre_pce.resizable(width=True,height=True) # Fenêtre modifiable True or False
                                      fenetre_pce.iconbitmap("img/search.ico") ### Changement de l'icone de la fenêtre [l'icone doit être placé dans le répertoire racine de l'application ou un autre répertoire img/...]
                                      
                                      #=================== Création d'un menu ==============================
                                      menubar = Menu(fenetre_pce,borderwidth=20, relief=GROOVE) # Création de la FRAME pour placer les menus dans le constructeur  ==> fenetre =Tk() 
                                      menuFichier = Menu(menubar, tearoff=0) # Cr�ation du menu "Fichier"
                                      menubar.add_cascade(label="Fichier", menu=menuFichier) # Rattachement des commandes au menu "Fichier"
                                      menuFichier.add_command(label="Créer")
                                      menuFichier.add_command(label="Ouvrir",)
                                      menuFichier.add_command(label="Editer")
                                      menuFichier.add_separator() # Ligne de séparation
                                      menuFichier.add_command(label="Quitter", command=fenetre_pce.quit)
                                      
                                      menuEdition = Menu(menubar, tearoff=0)
                                      menubar.add_cascade(label="Edition", menu=menuEdition)
                                      menuEdition.add_command(label="Couper")
                                      menuEdition.add_command(label="Copier")
                                      menuEdition.add_command(label="Coller")
                                      menuEdition.add_command(label="Créer")
                                      
                                      menuAuteur = Menu(menubar, tearoff=0)
                                      menubar.add_cascade(label="Auteur", menu=menuAuteur)
                                      menuAuteur.add_command(label="Créer", command=runauteur)
                                      menuAuteur.add_command(label="Consulter")
                                      
                                      menuCitation = Menu(menubar, tearoff=0)
                                      menubar.add_cascade(label="Citation", menu=menuCitation)
                                      menuCitation.add_command(label="Créer", command=runcitation)
                                      menuCitation.add_command(label="Consulter", command=result_citation)
                                      
                                      menuAide = Menu(menubar, tearoff=0)
                                      menubar.add_cascade(label="Aide", menu=menuAide)
                                      menuAide.add_command(label="A propos") 
                                      
                                      fenetre_pce.config(menu=menubar) # Configuration et print menu
                                      #----------------------------------------------------------------
                                      #Citation accueil
                                      labelcitation1 = Label(fenetre_pce, text="'Le souvenir est le parfum de l'âme - v05' - Georges Sand", font=("Arial", 14,"bold")).pack()
                                      # Fond d'écram accueil
                                      frontimage = ImageTk.PhotoImage(Image.open("img/connaissance_1260-720.jpg") ) # image de fond page d'accueil
                                      frontimagelabel = Label(fenetre_pce, image=frontimage).pack(expand=1)
                                      
                                      
                                      #== Fermeture de la boucle principale ==
                                      fenetre_pce.mainloop() # Boucle principale
                                      
                                      
                                      
                                      




                                      -
                                      Edité par lagratteCchouette 23 novembre 2019 à 14:22:27

                                      • Partager sur Facebook
                                      • Partager sur Twitter
                                        23 novembre 2019 à 20:58:43

                                        Comme je l'ai dis, apprenez les bases ! Sans cela, il est difficile d'aider.

                                        Pour preuve, comment ne pas savoir que dès lors où on place un return dans une fonction, on quitte la fonction ? Si ce n'est un manque certains de documentation et de recherche.

                                        Copier coller mon code et y ajouter de la glue pour y coller des aberrances ne va pas vous aider à résoudre votre problème. Vous devez comprendre ce que j'ai fais, pourquoi je l'ai fais et le résultat de cette fonction. Ensuite vous l'adaptez à votre cas, car comme je l'ai dis, je ne suis même pas sûr que se soit fonctionnel, c'est à vous de tester, sur un petit code, puis sur votre projet.

                                        Ça demande de l'investissement, il n'y a pas de magie dans tout ça, rien ne s'invente, on part de l'existant.

                                        • Partager sur Facebook
                                        • Partager sur Twitter

                                        Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
                                        La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

                                          24 novembre 2019 à 16:46:31

                                          Je comprends, merci.

                                          Effectivement cela doit être fait en 2 étapes.

                                          Mais où trouver un tuto complet "projet" plutôt que des bouts de codes un peu partout... C'est là mon souci.

                                          Connaissez-vous quelqu'un qui donne des cours "projets" ?

                                          A votre avis ?

                                          -
                                          Edité par lagratteCchouette 24 novembre 2019 à 16:56:09

                                          • Partager sur Facebook
                                          • Partager sur Twitter
                                            24 novembre 2019 à 17:42:50

                                            lagratteCchouette a écrit:

                                            Je comprends, merci.

                                            Effectivement cela doit être fait en 2 étapes.

                                            Mais où trouver un tuto complet "projet" plutôt que des bouts de codes un peu partout... C'est là mon souci.

                                            Connaissez-vous quelqu'un qui donne des cours "projets" ?

                                            A votre avis ?

                                            Vous ne trouverez pas de cours "projet" juste tombant sur un projet que vous faîtes déjà... Votre problème est "technique", c'est à dire la maîtrise du langage.

                                            Commencez par faire de petites choses avec juste python, sans partir avec des notions de BDD qui vont agrandir votre cercle de compétences inutilement.

                                            Une fois que les bases seront là, vous comprendrez beaucoup mieux divers écosystèmes autour de python. Ça prendra un peu de temps au début, mais après vous aurez un gain de temps dans la compréhension de tout ce qui se trouve autour.

                                            Faîtes votre choix, mais il sera difficile de compter sur des membres pour vous expliquer ce que des centaines de tutoriels expliquent déjà.

                                            Pour commencer, pourquoi pas partir du tutoriel officiel ? Il est en français maintenant, plus rien ne vous retient ;)

                                            • Partager sur Facebook
                                            • Partager sur Twitter

                                            Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
                                            La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

                                              24 novembre 2019 à 18:51:03

                                              Super merci beaucoup pour vos conseils avisés.

                                              Bien à vous !

                                              • Partager sur Facebook
                                              • Partager sur Twitter

                                              Afficher données Sqlite3 dans widget text Tkinter

                                              × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                                              × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                                              • Editeur
                                              • Markdown