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

GUI Python Discussion :

Problème sur python avec tkinter


Sujet :

GUI Python

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Lycéen
    Inscrit en
    Mai 2016
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Aveyron (Midi Pyrénées)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Mai 2016
    Messages : 7
    Points : 6
    Points
    6
    Par défaut Problème sur python avec tkinter
    Bonjour

    Voila je rencontre un problème dit je ne comprends pas l'origine avec mon code. Théoriquement les bottons situes a cotés de la grille de sudoku permettant d'écrire dans la grille.
    Mais depuis que j'ai codé une fenêtre, en guise de page d'accueil impossible d'écrire dans ma grille avec mes boutons.


    Sans page d'accueil :
    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
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    from tkinter import*
    from random import*
    ecriture=("comic sans ms",13)
    nbcase=4
    case=100
    x0,y0=9,9
    chifre=[1,2,3,4]
     
     
    def fin ():
        fenetre.quit()
        fenetre.destroy()
     
    def grille():
        for i in range(nbcase+1):
            Can.create_line(x0+case*i, y0,x0+case*i,y0 + nbcase*case)
            Can.create_line(x0, y0+case*i,x0+nbcase*case ,y0+case*i)
     
    def place_number(event):
        TexteC.delete("0.0",END)# on efface l'écriture précédente
        TexteC.insert(END,"clic detecte en x="+str(event.x) + " et y = " + str(event.y))
        a=(event.x)//100 #ici a est censé récupéré la position du clic pour ce qui est des abscisses
        b=(event.y)//100 #ici b fait la même chose que b mais pour lees ordonnées
        text = current
        Can.create_text(a,b,text=text) #ici la fonction est censé afficher le texte au coordonées a et b
        Can.create_text((a+0.5)*100+10,(b+0.5)*100+10,text=text) #ici on ajoute 0,5 à a et b pour centrer le nombre dans la case
     
     
    def jouer(event):
        global trouve
        [i,j]=correspond(event.x,event.y)
        if i in range(nb) and j in range (nb):   # on ne fait rien si le click est hors grille
            Can.create_rectangle(x0 +c*j,y0+c*i,x0 +c*(j+1),y0+c*(i+1),fill=coul(i,j))
     
     
    current = None
     
    def display(x):
        def wrap():
            global current
            current = x
        return wrap
     
     
    fenetre=Tk()
    Cadre=Frame(fenetre)
    Texte1=Label(fenetre,text="Jeu du Sudoku",fg="red",font=ecriture)
    BouttonQuit=Button(fenetre,text="quitter", command=fin)
    BouttonJouer=Button(fenetre,text="jouer", command=grille)
    TexteC=Text(fenetre,height=25,width=25)
    Can=Canvas(Cadre,height=500,width=500,bg="white")
    Bouton1=Button(fenetre,text="1",command=display('1'))
     
     
    Texte1.grid(row=0,column=0)
    BouttonQuit.grid(row=50, column=100)
    Cadre.grid(row=1,column=0)
    Can.grid(row=2, column=0)
    BouttonJouer.grid(row=0, column=50)
    TexteC.grid(row=1, column=3)
    Bouton1.grid(row=45,column=49)
     
     
    Can.bind("<Button-1>",place_number)
     
    fenetre.mainloop()
    Maintenant avec mon semblant de page d'accueil :
    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
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    from tkinter import*
    from random import*
    ecriture=("comic sans ms",13)
    nbcase=4
    case=100
    x0,y0=9,9
    chifre=[1,2,3,4]
     
     
    def zut():
        ntm=Toplevel()
        def fin ():
            fenetre.quit()
            fenetre.destroy()
     
        def grille():
            for i in range(nbcase+1):
                Can.create_line(x0+case*i, y0,x0+case*i,y0 + nbcase*case)
                Can.create_line(x0, y0+case*i,x0+nbcase*case ,y0+case*i)
     
        def place_number(event):
            TexteC.delete("0.0",END)# on efface l'écriture précédente
            TexteC.insert(END,"clic detecte en x="+str(event.x) + " et y = " + str(event.y))
            a=(event.x)//100 #ici a est censé récupéré la position du clic pour ce qui est des abscisses
            b=(event.y)//100 #ici b fait la même chose que b mais pour lees ordonnées
            text = current
            Can.create_text(a,b,text=text) #ici la fonction est censé afficher le texte au coordonées a et b
            Can.create_text((a+0.5)*100+10,(b+0.5)*100+10,text=text) #ici on ajoute 0,5 à a et b pour centrer le nombre dans la case
     
        def jouer(event):
            global trouve
            [i,j]=correspond(event.x,event.y)
            if i in range(nb) and j in range (nb):   # on ne fait rien si le click est hors grille
                Can.create_rectangle(x0 +c*j,y0+c*i,x0 +c*(j+1),y0+c*(i+1),fill=coul(i,j))
     
        current = None
     
        def display(x):
            def wrap():
                global current
                current = x
            return wrap
     
        Cadre=Frame(ntm)
        Texte1=Label(ntm,text="Jeu du Sudoku",fg="red",font=ecriture)
        BouttonQuit=Button(ntm,text="quitter", command=fin)
        BouttonJouer=Button(ntm,text="jouer", command=grille)
        TexteC=Text(ntm,height=25,width=25)
        Can=Canvas(ntm,height=500,width=500,bg="white")
        Bouton1=Button(ntm,text="1",command=display('1'))
        Bouton2=Button(ntm,text="2",command=display('2'))
        Bouton3=Button(ntm,text="3",command=display('3'))
        Bouton4=Button(ntm,text="4",command=display('4'))
     
        Texte1.grid(row=0,column=0)
        BouttonQuit.grid(row=50, column=100)
        Cadre.grid(row=1,column=0)
        Can.grid(row=1, column=0)
        BouttonJouer.grid(row=0, column=50)
        TexteC.grid(row=1, column=3)
        Bouton1.grid(row=45, column=49)
        Bouton2.grid(row=45, column=48)
        Bouton3.grid(row=45, column=47)
        Bouton4.grid(row=45, column=46)
     
        Can.bind("<Button-1>",place_number)
     
     
     
    fenetre=Tk()
     
     
     
    Texte=Label(fenetre,text="Bienvenue dans le jeu de sudoku",fg="red")
    Texte.grid(row=0,column=3)
     
    Boutoniveau1=Button(fenetre,text="Niveau 1",command=zut)
    Boutoniveau1.grid(row=2,column=3)
     
     
    fenetre.mainloop()

  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,

    Citation Envoyé par Le chaos Voir le message
    Voila je rencontre un problème dit je ne comprends pas l'origine avec mon code. Théoriquement les bottons situes a cotés de la grille de sudoku permettant d'écrire dans la grille.
    Mais depuis que j'ai codé une fenêtre, en guise de page d'accueil impossible d'écrire dans ma grille avec mes boutons.
    Vous avez surtout poussé une bonne partie de votre code dans une fonction.
    Et ces quelques lignes de code changent de sens:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
        current = None
     
        def display(x):
            def wrap():
                global current
                current = x
            return wrap
    En effet, vous déclarez une variable locale "current" mais wrap va modifier la variable globale "current" (c'est différent).
    Du coup, votre dernière mouture de "place_number" crée un item text avec un texte vide...

    remplacez global par nonlocal (ou virez la ligne current = None, mais pas les deux).

    - 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
    Lycéen
    Inscrit en
    Mai 2016
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Aveyron (Midi Pyrénées)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Mai 2016
    Messages : 7
    Points : 6
    Points
    6
    Par défaut
    Le problème c'est qu'en modifiant global par nonlocal. Mon programme ne se lance plus, la console m'affiche comme erreur:
    Syntax error: no binding for nonlocal 'current' found

  4. #4
    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
    Citation Envoyé par Le chaos Voir le message
    Le problème c'est qu'en modifiant global par nonlocal. Mon programme ne se lance plus, la console m'affiche comme erreur:
    Syntax error: no binding for nonlocal 'current' found
    C'est parce que vous avez aussi supprimé la ligne "current = None". Dans ce cas, il faut garder "global".
    La différence est que "global" va pouvoir créer la variable dans le module si elle n'existe pas encore.
    Pour les fonctions, l'espace est beaucoup plus contraint: nonlocal veut pouvoir la trouver.

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

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Lycéen
    Inscrit en
    Mai 2016
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Aveyron (Midi Pyrénées)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Mai 2016
    Messages : 7
    Points : 6
    Points
    6
    Par défaut
    J'avais juste remplacé global par non local, mais en laissant global et en supprimant current=none cela fonctionne.
    Merci pour l'aide.

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

Discussions similaires

  1. [Python 3.X] Problème sur python avec tkinter
    Par Le chaos dans le forum GUI
    Réponses: 3
    Dernier message: 19/05/2016, 20h51
  2. [WD17] un petit problème sur etat avec saisie
    Par hadaf dans le forum WinDev
    Réponses: 4
    Dernier message: 16/07/2013, 10h24
  3. Problème sur Dcount avec une clause where
    Par robyseb dans le forum VBA Access
    Réponses: 9
    Dernier message: 18/08/2011, 22h39
  4. Problème sur split avec regex
    Par fr1man dans le forum Collection et Stream
    Réponses: 4
    Dernier message: 07/05/2009, 13h46
  5. [débutant]petit problème sur formulaire avec onglets
    Par Christophe93250 dans le forum Access
    Réponses: 2
    Dernier message: 06/01/2006, 10h46

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