Flux rss
Collection CommentCaMarche.net
Rechercher : dans
Par : Pertinence Date Nom d'utilisateur
Statut : Non résolu

[python] problème fenêtre tkinter

Krytek13, le vendredi 17 novembre 2006 à 16:33:55
Bonjour,
je suis actuellement en train de créer un programme dans le cadre d'un projet informatique. Celui-ci doit lire un fichier contenant une succession de données sous forme e chiffres et les retrasncrire sous formes de rectangles de couleurs les uns à la suite des autres dans un canevas.
J'ai donc crée une interface graphique contenant divers éléments et entre autres, un bouton qui, lorsqu'on clique dessus', m'ouvre une nouvelle fenêtre contenant un canevas où s'affichent les rectangles. Jusque là, pas de problème, mais si je ferme cette nouvelle fenêtre et que je tente de la réouvrir en cliquant à nouveau sur le bouton, rien ne se passe hormis un message d'erreur dans le terminal d'IDLE : AttributeError: Tk instance has no __call__ method. Si quelqu'un pouvait m'aider...

Merci d'avance.
Répondre à Krytek13  Signaler ce message aux modérateurs Aller au dernier message

1


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
sebsauvage, le vendredi 17 novembre 2006 à 16:49:42
Hello.

Difficile à dire d'où ça peut venir sans le code source.

“Life is short - You need Python” -- Bruce Eckel, membre du comité ANSI C++
Répondre à sebsauvage

2


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
Krytek13, le vendredi 17 novembre 2006 à 16:59:57
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.
Répondre à Krytek13

3


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
Krytek13, le vendredi 17 novembre 2006 à 17:03:14
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.
Répondre à Krytek13

4


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
sebsauvage, le vendredi 17 novembre 2006 à 17:08:24
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:
http://sebsauvage.net/python/gui/index_fr.html
“Life is short - You need Python” -- Bruce Eckel, membre du comité ANSI C++
Répondre à sebsauvage

5


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
Krytek13, le vendredi 17 novembre 2006 à 17:21:18
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
Répondre à Krytek13

6


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
sebsauvage, le vendredi 17 novembre 2006 à 17:38:11
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.
“Life is short - You need Python” -- Bruce Eckel, membre du comité ANSI C++
Répondre à sebsauvage

7


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
Krytek13, le vendredi 17 novembre 2006 à 17:44:35
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 :

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...
Répondre à Krytek13

8


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
sebsauvage, le vendredi 17 novembre 2006 à 17:49:02
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.
“Life is short - You need Python” -- Bruce Eckel, membre du comité ANSI C++
Répondre à sebsauvage

9


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
Krytek13, le vendredi 17 novembre 2006 à 17:55:15
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.
Répondre à Krytek13

10


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
sebsauvage, le vendredi 17 novembre 2006 à 21:42:12
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)
“Life is short - You need Python” -- Bruce Eckel, membre du comité ANSI C++
Répondre à sebsauvage

11


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
Krytek13, le samedi 18 novembre 2006 à 13:54:26
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...
Répondre à Krytek13

12


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
 sebsauvage, le samedi 18 novembre 2006 à 19:33:01
Il vaut mieux le faire sous forme de classe, comme ça c'est plus facile à réutiliser.
“Life is short - You need Python” -- Bruce Eckel, membre du comité ANSI C++
Répondre à sebsauvage

Résultats pour [python] problème fenêtre tkinter

Problème d'Entry avec python tkinter (Résolu) Bonjour à tous, Je souhaiterais, à l'ouverture d'une fenêtre tkinter que s'affiche dans l'Entry la valeur d'un fichier txt. Je sais déjà l'enregistrer dans le fichier mais pas faire apparaçitre le contenu Code... www.commentcamarche.net/forum/affich-8198742-probleme-d-entry-avec-python-tkinter
[Python] Supprimer un objet d'une Frame (Résolu) Bonjour. Encore un problème en Python ! Avec Tkinter, j'instancie un objet de la classe Application, qui dérive de Frame. Avec une méthode, j'instancie plusieurs objets de la classe Pupitre, qui dérive de Frame également, avec comme... www.commentcamarche.net/forum/affich-2353343-python-supprimer-un-objet-d-une-frame
Python et Tkinter sous Kubuntu (Résolu) Hello, J'ai un petit souci pour appeler Tkinter avec Python : yoan@PRECISION:~/Desktop/python$ python Python 2.4.3 (#1, Aug 23 2006, 11:43:00) [GCC 4.0.3 (Ubuntu 4.0.3-1ubuntu5)] on linux2 Type "help", "copyright", "credits" or "license" for more... www.commentcamarche.net/forum/affich-2686821-python-et-tkinter-sous-kubuntu

Résultats pour [python] problème fenêtre tkinter

Comment bloquer les fenêtres CiD ?Dés que vous ouvrez une page Internet, vous vous retrouvez envahi(e) de fenêtres publicitaires nommées CiD, vous proposant de télécharger divers programmes, et vous ne savez plus quoi faire pour vous en débarrasser ? … Ces fenêtres révèlent en... www.commentcamarche.net/faq/sujet-5996-comment-bloquer-les-fenetres-cid
[popups] Ouverture de fenêtres internet publicitaires (pop-up)Il vous est devenu impossible de surfer sans qu’une avalanche de fenêtres publicitaires en tout genre ( Crazy Girls, SpywareSecure, pubs de Casino, achat de logiciels de protection, pubs pornographiques, ... ) viennent vous polluer l’écran, et malgré... www.commentcamarche.net/faq/sujet-2490-popups-ouverture-de-fenetres-internet-publicitaires-pop-up
Gestionnaires de fenêtres X11Gestionnaires de fenêtres AfterStep Blackbox FluxBox FVWM IceWM (Ice Window Manager) Metacity OpenBox Window Maker Sur le réseau Contrairement à certaines solutions propriétaires (Windows et Mac), GNU/Linux offre... www.commentcamarche.net/faq/sujet-5522-gestionnaires-de-fenetres-x11

Résultats pour [python] problème fenêtre tkinter

Python Tkinter liste de checkbutton (Résolu)Bonjour à tous, J'utilise depuis peu python ainsi que le module Tkinter pour l'interface graphique. Je souhaiterais faire apparaître dans une fenêtre à l'écran une liste de boutons à cocher. Je voudrais que ces boutons se trouvent dans... www.commentcamarche.net/forum/affich-6614131-python-tkinter-liste-de-checkbutton
Création de fenêtre avec python (Résolu)Bonjour, je suis en ce moment en train de lire le tutoriel python de Gérard Swinnen. Je suis à la partie où l'on apprend à faire des fenêtres. Quel librairie doit-je utiliser? Tkinter est-il une bonne librairie graphique? Merci www.commentcamarche.net/forum/affich-7904767-creation-de-fenetre-avec-python
[python]Problème de taille de fenêtre (Résolu)Bonjour, Je mets en place un petit programme destiné à faire un instantanée graphique des connections en cours sur le pc ainsi que les executables en cause. Pour cela,j'utilise python et le programme fonctionne sauf que la fenetre est très grande... www.commentcamarche.net/forum/affich-4965274-python-probleme-de-taille-de-fenetre

Résultats pour [python] problème fenêtre tkinter

Le fenêtrage de Microsoft WindowsLe vocabulaire relatif au fenêtrage Windows tient son nom (Windows = fenêtre en anglais) du fait qu'il constitue une interface graphique à multi-fenêtrage, c'est-à-dire que l'on peut ouvrir simultanément plusieurs fenêtres sous Windows. Pour les... www.commentcamarche.net/contents/win/winfenet.php3