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
Ç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.
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 ?
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)
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.
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
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.
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)
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()
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
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)
Eh bien il faut relire mon message précédent, la réponse à ta question y est...
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)
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.
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)
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...
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)
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
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)
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.
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)
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
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)
× 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.
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)
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)
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)
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)
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)
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)
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)
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)
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)