IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Tkinter Python Discussion :

fonctions agissant sur tkinter


Sujet :

Tkinter Python

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2015
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2015
    Messages : 6
    Points : 7
    Points
    7
    Par défaut fonctions agissant sur tkinter
    Bonjour , dans le cadre d'un mini projet d'ISN j'ai a faire un pendu et cela sans utiliser la poo mais en utilisant des fonctions (je sais utiliser la poo et d’ailleurs ça serais énormément plus pratique mais je me limite au consignes du prof)

    Donc j'ai commencé ce que j'ai pu mais je n'arrive pas a agir sur les labels dans les fonctions appelés par un bouton... pourtant j'utilise bien global pour avoir accès aux objets en dehors de mes fonctions... voici des morceaux de code pour vous montrer le problème et l'erreur survenue.

    ici le code principal du jeu dans le fichier "launcher_jeu__pendu":

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    # -*- coding: utf-8 -*-
    import Tkinter
    from fonctions_du_jeu import *
     
    coups_restants=9
    mot_a_trouver = choisir_mot()
    mot_cacher = ["_"]*len(mot_a_trouver)
     
    fenetre = Tkinter.Tk()
     
    label_coups_restants = Tkinter.Label(fenetre,text="coups restants : 9").grid(row=0,columnspan=2)
    canvas = Tkinter.Canvas(fenetre,bg='ivory',height=300,width=250).grid(row=1,columnspan=2)
    label_infos = Tkinter.Label(fenetre,text="Nouvelle partie , entrez une lettre").grid(row=2,columnspan=2)
    label_mot_cacher = Tkinter.Label(fenetre,text=mot_cacher).grid(row=3)
    entree_utilisateur = Tkinter.Entry(fenetre)
    entree_utilisateur.bind("<Return>",valider)
    entree_utilisateur.grid(row=4)
    bouton_rejouer = Tkinter.Button(fenetre, text="Rejouer",command=rejouer).grid(row=4,column=1)
    bouton_valider = Tkinter.Button(fenetre, text="Valider", command = valider).grid(row=5)
    bouton_quitter = Tkinter.Button(fenetre, text="Quitter", command=fenetre.quit).grid(row=5,column=1)
     
    fenetre.mainloop()
    ici une erreur d’accès sur une simple variable (fichier "fonctions_du_jeu") :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    def valider(event=None):
        global coups_restants, canvas, mot_a_trouver, mot_cacher
        alphabet = ["abcdefghijklmnopqrsstuvwxyz"]
        if "".join(mot_cacher) != mot_a_trouver :
            print "blablabla..."
    avec l'erreur quand j’appelle la fonction :

    Exception in Tkinter callback
    Traceback (most recent call last):
    File "C:\Program Files (x86)\Python27\lib\lib-tk\Tkinter.py", line 1542, in __call__
    return self.func(*args)
    File "C:\Users\gaeta\Documents\python\jeu du pendu\fonctions_du_jeu.py", line 16, in valider
    if "".join(mot_cacher) != mot_a_trouver :
    NameError: global name 'mot_cacher' is not defined

    ensuite ici tentative d’accès a un label pour le modifier :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    def rejouer():
        global mot_a_trouver, mot_cacher, coups_restants, label_mot_cacher
        coups_restants=9
        mot_a_trouver = choisir_mot()
        mot_cacher = ["_"]*len(mot_a_trouver)
        label_mot_cacher.config(text=mot_cacher)
    et l'erreur quand j’appelle la fonction :

    Exception in Tkinter callback
    Traceback (most recent call last):
    File "C:\Program Files (x86)\Python27\lib\lib-tk\Tkinter.py", line 1542, in __call__
    return self.func(*args)
    File "C:\Users\gaeta\Documents\python\jeu du pendu\fonctions_du_jeu.py", line 76, in rejouer
    label_mot_cacher.config(text=mot_cacher)
    NameError: global name 'label_mot_cacher' is not defined

    J'ai également essayé avec cette méthode en passant les arguments à l'appel de la fonction grâce à un lambda;

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    bouton_valider = Tkinter.Button(fenetre, text="Valider", command = lambda: valider(coups_restants,canvas,mot_cacher,mot_a_trouver,label_infos,label_coups_restants,entree_utilisateur))
    bouton_valider.grid(row=5)
    et la fonction appelé :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    def valider(coups_restants, canevas, mot_cacher, mot_a_trouver,label_infos,label_coups_restants, entree_utilisateur, event=None):
        alphabet = ["abcdefghijklmnopqrsstuvwxyz"]
        if "".join(mot_cacher) != mot_a_trouver :
            if coups_restants > 0:
                if len(entree_utilisateur.get()) == 1:
                    if entree_utilisateur.get() in alphabet :
                        if entree_utilisateur.get().upper() in mot_a_trouver :
                            mot_cacher = placer_lettre(entree_utilisateur.get())
                            label_infos.config(text="Bravo !")
    Et là il me dit que entree_utilisateur et label_infos est du type none...

    en espérant avoir un peut d'aide... merci !

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 283
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 283
    Points : 36 770
    Points
    36 770
    Par défaut
    Salut,

    Vos soucis n'ont rien à voir avec tkinter: une variable "globale" n'est pas si globale que çà, elle n'est globale que pour le module dans lequel elle a été créée. "fonctions_du_jeu" et "launcher_jeu__pendu" sont des modules différents.
    Ca serait plus simple d'essayer de tout faire fonctionner avec tout dans le même script et de réfléchir à comment découper un code qui fonctionne en "modules" plus tard.

    Pour les "None", çà vient des enchaînements dans les constructions:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    bouton_rejouer = Tkinter.Button(fenetre, text="Rejouer",command=rejouer).grid(row=4,column=1)
    Et des choix de Python: seules les méthodes qui modifient un objet non mutable retournent un (nouvel) objet, les autres retournent "None" (ou le résultat documenté). Dans la pratique, vous êtes obligé d'écrire 2 lignes:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    bouton_rejouer = Tkinter.Button(fenetre, text="Rejouer",command=rejouer)
    bouton_rejouer.grid(row=4,column=1)
    Pour ne pas assigner "None" - le retour de .grid - à la variable.

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

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2015
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2015
    Messages : 6
    Points : 7
    Points
    7
    Par défaut
    Merci beaucoup ça fonctionne !

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

Discussions similaires

  1. Fonction dans une DLL agissant sur un TStringList
    Par Dr.Gang dans le forum C++Builder
    Réponses: 5
    Dernier message: 24/10/2009, 14h17
  2. Réponses: 5
    Dernier message: 13/07/2005, 10h03
  3. [VB.NET] Exécuter une fonction VB sur un Datagrid
    Par MiJack dans le forum Windows Forms
    Réponses: 3
    Dernier message: 24/09/2004, 14h45
  4. Fonction LEFT sur champ de type "text" : méthodes
    Par MatthieuQ dans le forum Langage SQL
    Réponses: 4
    Dernier message: 08/06/2004, 11h15
  5. pb avec la fonction boolean sur eclipse
    Par mcay dans le forum Eclipse Java
    Réponses: 3
    Dernier message: 31/05/2004, 09h37

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo