A voir également:
- [python] problème fenêtre tkinter
- Citizen code python avis - Accueil - Outils
- Fenetre windows - Guide
- Fenêtre hors écran windows 11 - Guide
- Mcafee fenetre intempestive - Accueil - Piratage
- Fenetre de navigation privée - Guide
12 réponses
Voilà le problème:
Tu ne dois instancier qu'un seul Tk.
Et ce tk doit être le parent de toutes les fenêtre que tu créé par la suite.
(Tu devrais lire mon tutoriel)
Tu ne dois instancier qu'un seul Tk.
Et ce tk doit être le parent de toutes les fenêtre que tu créé par la suite.
(Tu devrais lire mon tutoriel)
dzd
mdr
Désolé, je viens de m'apercevoir que les "tabulations" n'ont pas été correctement collées. S'il y a un soucis je remettrait le code correctement.
Même en lançant mon programme avec la console au lieu de passer par IDLE, j'ai toujours le même problème.
Je te colle l'intégralité du message d'erreur ici :
Je pensais que j'avais un "nom_application.mainloop" quelque part mais appremment ca vient pas de ça. J'ai essayé avec et sans ma fonction d'affichage des rectangles vu qu'elle est n'est pas nécessaire à l'affichage du canevas mais avec ou sans le problème persiste...
Je te colle l'intégralité du message d'erreur ici :
Exception in Tkinter callback Traceback (most recent call last): File "C:\Program Files\Python\lib\lib-tk\Tkinter.py", line 1345, in __call__ return self.func(*args) File "C:\Program Files\Python\Intgra8.py", line 522, in pressSupportCGH support() AttributeError: Tk instance has no __call__ method
Je pensais que j'avais un "nom_application.mainloop" quelque part mais appremment ca vient pas de ça. J'ai essayé avec et sans ma fonction d'affichage des rectangles vu qu'elle est n'est pas nécessaire à l'affichage du canevas mais avec ou sans le problème persiste...
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
je mets le bout de code qui appelle la fonction d'ouverture de la fenêtre avec le canevas pour les rectangles ainsi que la fonction qui permet leur formation, en espérant que ça sera suffisant...
def support():
global support
support = Tk()
support.title("Etat des autosomes pour chaque prélèvement du jeu de données étudié")
graph()
support.mainloop()
def pressSupportCGH():
support()
def graph():
global canevas
panneauGraph = Frame(support, width = 1000, height = 1000, padx = 4, pady = 4, bd = 3, bg = "black", relief = GROOVE)
canevas = Canvas(panneauGraph, width = 500, height = 500, bg = "white")
scrollHori3 = Scrollbar(support, orient = HORIZONTAL, command = canevas.xview)
scrollVert3 = Scrollbar(support, orient = VERTICAL, command = canevas.yview)
legendCanevas = Canvas(panneauGraph, width = 50, height = 50, bg = "black")
barreDeMenu = Menu(support)
menuFermer = Menu(barreDeMenu)
legendCanevas.create_text(8, 12, font = ("Arial", 12, "bold"), fill = "white", text = "Légende : ", anchor=W)
legendCanevas.create_text(200, 32, font = ("Arial", 10),fill = "white", text = "Gain de matériel génétique :", anchor = W)
legendCanevas.create_rectangle(380, 23, 385, 42, fill = "green")
legendCanevas.create_text(535, 32, font = ("Arial", 10),fill = "white", text = "Perte de matériel génétique :", anchor = W)
legendCanevas.create_rectangle(720, 23, 725, 42, fill = "red")
legendCanevas.create_text(900, 32, font = ("Arial", 10),fill = "white", text = "Données manquantes :", anchor = W)
legendCanevas.create_rectangle(1055, 23, 1060, 42, fill = "blue")
menuFermer.add_command(label = "Fermer la fenêtre", command = pressBoutonFermer)
barreDeMenu.add_cascade(label = "Fermer", menu = menuFermer)
canevas.configure(xscrollcommand = scrollHori3.set)
canevas.configure(yscrollcommand = scrollVert3.set)
support.configure(menu = barreDeMenu)
scrollVert3.pack(side = RIGHT, fill = Y)
scrollHori3.pack(side = BOTTOM, fill = X)
panneauGraph.pack(expand = True, fill = BOTH)
canevas.pack(expand = True, side = TOP, fill = BOTH)
legendCanevas.pack(side = BOTTOM, fill = BOTH)
afficheGraph()
############################################################ Affichage Graph ############################################################
def error():
if dico_general == []:
tkMessageBow.showerror(message = "Erreur")
return
def afficheGraph():
error()
#reponse = 'n'
#TravSurBruteOrNet(reponse)
canevas.delete(ALL)
# taille necessaire dans le canevas (utile pour les scrollbars)
taille_x = 0
taille_y = len(dico_general)
# indices pour l'affichage
x = 80 # marge a gauche pour le nom #faire une fonction pour adapter le x au nom le plus long + un espace
y = 10 # marge du haut
# numero de la mesure (pour assigner le numero de la mesure a chaque rectangle (colonne->tag))
num_gene = 1
# parcours du de l'index des noms et du dictionnaire
for nom in index_nom_seq:
i=dico_general[nom][1]
for a in dico_general[nom][1]:
if len(i[1])>taille_x: # pour recherche de la plus longue ligne (pour l'affichage)
taille_x = len(i[1])
canevas.create_text(5, y+8, font = ("Arial", 8), text = nom, anchor = W, tag = "nom")
# parcours des donnees
for j in dico_general[nom][1]:
if j == '-1':
color = "red"
elif j == '1':
color = "green"
elif j == '9':
color = "blue"
else:
color = canevas.cget("bg") # on recupere la couleur de fond du canvas
# dessin d'un rectangle pour chaque mesure, de la couleur correspondant au resultat
canevas.create_rectangle(x, y, x+5, y+15, fill = color, tag = ("rect", i[0], str(num_gene))) #si on rajoute width = 0, les contours disparaissent
x += 5 # decalage horizontal pour le dessin
num_gene += 1
y += 15 # decalage vertical pour le dessin (chgt de ligne)
x = 80 # marge pour le nom (on revient au debut de ligne)
num_gene = 1 # reinit du numero de la mesure
canevas.configure(scrollregion = (0, 0, taille_x*5+200, taille_y*15+30)) # pour activer les barres et preciser la taille d'affichage
Merci.
def support():
global support
support = Tk()
support.title("Etat des autosomes pour chaque prélèvement du jeu de données étudié")
graph()
support.mainloop()
def pressSupportCGH():
support()
def graph():
global canevas
panneauGraph = Frame(support, width = 1000, height = 1000, padx = 4, pady = 4, bd = 3, bg = "black", relief = GROOVE)
canevas = Canvas(panneauGraph, width = 500, height = 500, bg = "white")
scrollHori3 = Scrollbar(support, orient = HORIZONTAL, command = canevas.xview)
scrollVert3 = Scrollbar(support, orient = VERTICAL, command = canevas.yview)
legendCanevas = Canvas(panneauGraph, width = 50, height = 50, bg = "black")
barreDeMenu = Menu(support)
menuFermer = Menu(barreDeMenu)
legendCanevas.create_text(8, 12, font = ("Arial", 12, "bold"), fill = "white", text = "Légende : ", anchor=W)
legendCanevas.create_text(200, 32, font = ("Arial", 10),fill = "white", text = "Gain de matériel génétique :", anchor = W)
legendCanevas.create_rectangle(380, 23, 385, 42, fill = "green")
legendCanevas.create_text(535, 32, font = ("Arial", 10),fill = "white", text = "Perte de matériel génétique :", anchor = W)
legendCanevas.create_rectangle(720, 23, 725, 42, fill = "red")
legendCanevas.create_text(900, 32, font = ("Arial", 10),fill = "white", text = "Données manquantes :", anchor = W)
legendCanevas.create_rectangle(1055, 23, 1060, 42, fill = "blue")
menuFermer.add_command(label = "Fermer la fenêtre", command = pressBoutonFermer)
barreDeMenu.add_cascade(label = "Fermer", menu = menuFermer)
canevas.configure(xscrollcommand = scrollHori3.set)
canevas.configure(yscrollcommand = scrollVert3.set)
support.configure(menu = barreDeMenu)
scrollVert3.pack(side = RIGHT, fill = Y)
scrollHori3.pack(side = BOTTOM, fill = X)
panneauGraph.pack(expand = True, fill = BOTH)
canevas.pack(expand = True, side = TOP, fill = BOTH)
legendCanevas.pack(side = BOTTOM, fill = BOTH)
afficheGraph()
############################################################ Affichage Graph ############################################################
def error():
if dico_general == []:
tkMessageBow.showerror(message = "Erreur")
return
def afficheGraph():
error()
#reponse = 'n'
#TravSurBruteOrNet(reponse)
canevas.delete(ALL)
# taille necessaire dans le canevas (utile pour les scrollbars)
taille_x = 0
taille_y = len(dico_general)
# indices pour l'affichage
x = 80 # marge a gauche pour le nom #faire une fonction pour adapter le x au nom le plus long + un espace
y = 10 # marge du haut
# numero de la mesure (pour assigner le numero de la mesure a chaque rectangle (colonne->tag))
num_gene = 1
# parcours du de l'index des noms et du dictionnaire
for nom in index_nom_seq:
i=dico_general[nom][1]
for a in dico_general[nom][1]:
if len(i[1])>taille_x: # pour recherche de la plus longue ligne (pour l'affichage)
taille_x = len(i[1])
canevas.create_text(5, y+8, font = ("Arial", 8), text = nom, anchor = W, tag = "nom")
# parcours des donnees
for j in dico_general[nom][1]:
if j == '-1':
color = "red"
elif j == '1':
color = "green"
elif j == '9':
color = "blue"
else:
color = canevas.cget("bg") # on recupere la couleur de fond du canvas
# dessin d'un rectangle pour chaque mesure, de la couleur correspondant au resultat
canevas.create_rectangle(x, y, x+5, y+15, fill = color, tag = ("rect", i[0], str(num_gene))) #si on rajoute width = 0, les contours disparaissent
x += 5 # decalage horizontal pour le dessin
num_gene += 1
y += 15 # decalage vertical pour le dessin (chgt de ligne)
x = 80 # marge pour le nom (on revient au debut de ligne)
num_gene = 1 # reinit du numero de la mesure
canevas.configure(scrollregion = (0, 0, taille_x*5+200, taille_y*15+30)) # pour activer les barres et preciser la taille d'affichage
Merci.
Si possible, met ton code dans une balise < code>
PS: A tout hasard, j'ai fait un document qui conseille sur la manière de développer une appli Tk:
https://sebsauvage.net/python/gui/index_fr.html
PS: A tout hasard, j'ai fait un document qui conseille sur la manière de développer une appli Tk:
https://sebsauvage.net/python/gui/index_fr.html
def support(): global support support = Tk() support.title("Etat des autosomes pour chaque prélèvement du jeu de données étudié") graph() support.mainloop() def pressSupportCGH(): support() def graph(): global canevas panneauGraph = Frame(support, width = 1000, height = 1000, padx = 4, pady = 4, bd = 3, bg = "black", relief = GROOVE) canevas = Canvas(panneauGraph, width = 500, height = 500, bg = "white") scrollHori3 = Scrollbar(support, orient = HORIZONTAL, command = canevas.xview) scrollVert3 = Scrollbar(support, orient = VERTICAL, command = canevas.yview) legendCanevas = Canvas(panneauGraph, width = 50, height = 50, bg = "black") barreDeMenu = Menu(support) menuFermer = Menu(barreDeMenu) legendCanevas.create_text(8, 12, font = ("Arial", 12, "bold"), fill = "white", text = "Légende : ", anchor=W) legendCanevas.create_text(200, 32, font = ("Arial", 10),fill = "white", text = "Gain de matériel génétique :", anchor = W) legendCanevas.create_rectangle(380, 23, 385, 42, fill = "green") legendCanevas.create_text(535, 32, font = ("Arial", 10),fill = "white", text = "Perte de matériel génétique :", anchor = W) legendCanevas.create_rectangle(720, 23, 725, 42, fill = "red") legendCanevas.create_text(900, 32, font = ("Arial", 10),fill = "white", text = "Données manquantes :", anchor = W) legendCanevas.create_rectangle(1055, 23, 1060, 42, fill = "blue") menuFermer.add_command(label = "Fermer la fenêtre", command = pressBoutonFermer) barreDeMenu.add_cascade(label = "Fermer", menu = menuFermer) canevas.configure(xscrollcommand = scrollHori3.set) canevas.configure(yscrollcommand = scrollVert3.set) support.configure(menu = barreDeMenu) scrollVert3.pack(side = RIGHT, fill = Y) scrollHori3.pack(side = BOTTOM, fill = X) panneauGraph.pack(expand = True, fill = BOTH) canevas.pack(expand = True, side = TOP, fill = BOTH) legendCanevas.pack(side = BOTTOM, fill = BOTH) afficheGraph() ############################################################ Affichage Graph ############################################################ def error(): if dico_general == []: tkMessageBow.showerror(message = "Erreur") return def afficheGraph(): error() #reponse = 'n' #TravSurBruteOrNet(reponse) canevas.delete(ALL) # taille necessaire dans le canevas (utile pour les scrollbars) taille_x = 0 taille_y = len(dico_general) # indices pour l'affichage x = 80 # marge a gauche pour le nom #faire une fonction pour adapter le x au nom le plus long + un espace y = 10 # marge du haut # numero de la mesure (pour assigner le numero de la mesure a chaque rectangle (colonne->tag)) num_gene = 1 # parcours du de l'index des noms et du dictionnaire ################ ################ ################ for nom in index_nom_seq: ##################### ##################### ##################### i=dico_general[nom][1] for a in dico_general[nom][1]: if len(i[1])>taille_x: # pour recherche de la plus longue ligne (pour l'affichage) taille_x = len(i[1]) canevas.create_text(5, y+8, font = ("Arial", 8), text = nom, anchor = W, tag = "nom") # parcours des donnees for j in dico_general[nom][1]: if j == '-1': color = "red" elif j == '1': color = "green" elif j == '9': color = "blue" else: color = canevas.cget("bg") # on recupere la couleur de fond du canvas # dessin d'un rectangle pour chaque mesure, de la couleur correspondant au resultat canevas.create_rectangle(x, y, x+5, y+15, fill = color, tag = ("rect", i[0], str(num_gene))) #si on rajoute width = 0, les contours disparaissent x += 5 # decalage horizontal pour le dessin num_gene += 1 y += 15 # decalage vertical pour le dessin (chgt de ligne) x = 80 # marge pour le nom (on revient au debut de ligne) num_gene = 1 # reinit du numero de la mesure canevas.configure(scrollregion = (0, 0, taille_x*5+200, taille_y*15+30)) # pour activer les barres et preciser la taille d'affichage
Voilà, en espérant que ce sera plus clair et que tu trouveras une solution à mon problème.
Merci
Conseil:
Fais tourrner ton appli en dehors d'IDLE. IDLE est lui-même en tk et ça peut interférer avec les programmes tk.
Ensuite, sans la pile d'appel complète lors de l'erreur, impossible de savoir d'où vient le problème.
Fais tourrner ton appli en dehors d'IDLE. IDLE est lui-même en tk et ça peut interférer avec les programmes tk.
Ensuite, sans la pile d'appel complète lors de l'erreur, impossible de savoir d'où vient le problème.
def support(): global support
c'est le genre de chose qui risque de prêter à confusion.
c'est quoi support ?
Une fonction ou autre chose ?
Evite d'utiliser des global: c'est probablement un micmac de ce genre qui est la cause de tes problèmes.
Tu devrais faire une classe principale qui s'occupera de créer et garder la référence des différentes fenêtre.
support c'est juste le nom de ma nouvelle fenêtre :
application = Tk() ==> c'est ma fenêtre principale et
support = Tk() ==> ma nouvelle fenêtre où se trouve le canevas dans lequel s'affichent les rectangles.
application = Tk() ==> c'est ma fenêtre principale et
support = Tk() ==> ma nouvelle fenêtre où se trouve le canevas dans lequel s'affichent les rectangles.
Merci beaucoup pour ta réponse, je comprends bien ce qui se passe maintenant mais le problème c'est que je fais comment dans ce cas ? je passe par une "class" ? j'y comprends rien à ce système et je crois ,pas que j'aurai le temps de tout modifier en conséquencd vu que je dois remettre mon prog au prof pour lundi...