Partage
  • Partager sur Facebook
  • Partager sur Twitter

Problème : StringVar non communicante

Tkinter

Sujet résolu
    8 février 2015 à 22:49:04

    Salut :)

    Débutant, j'ai codé un petit jeu sur Tkinter

    Tout fonctionne, sauf le label en bas de la fenêtre : il ne s'affiche pas !!

    J'utilise une StringVar pour pouvoir l'actualiser dans ma fonction move().

    On dirai qu'il n'y a pas de communication entre le var.set() et le label.

    Lignes concernées : 

    • [Ligne 237] : label : "demarrer", en particulier "text=var.get()"
    • [Lignes 25 et 32] : fonction : "move()"
    • [Ligne 217] : innitialisation : "var = StringVar()"

    J'attend votre aide ! 

    Merci :)

    from tkinter import*
    from math import*
    
    
    
    
    
    #########################################################################
    #########################                   #############################
    #########################     PROCEDURES    #############################
    #########################                   #############################
    #########################################################################
    
    
    #Fonctions d'animation
    
    def start(event):
        "démarre le jeu quand on appuit sur espace, déclenche move()"
        global flag
        flag='d'
        move()
    
    
    
    def move():
        "fonction d'animation principale"
        global flag, x1, y1, b, erreur, niveau
        can1.delete("all")
        croix()
        distance()
        erreur_detect()
        var.set(str('        Démarrer : [espace]                        Jouer : [flèches]                  NIVEAU : [{}]'.format(niveau)))
        if erreur:
           limite()
        else:
            if flag=='d':
                x1=x1+1
            elif flag=='g':
                x1=x1-1
            elif flag=='b':
                y1=y1+1
            elif flag=='h':
                y1=y1-1
            if flag=='s':
                niveau+=1
                clignote()
            elif flag=='d' or flag=='g' or flag=='b' or flag=='h':
                edit_cercles()
                can1.after(10, move)
        
    
    
    def clignote():
        "fonction de clignotement quand il y a victoire, appellée dans move()"
        global x, b
        if x==0:
            can1.create_rectangle(0,0,500,500, fill='red', outline='red')
            x=1
        elif x==1:
            can1.create_rectangle(0,0,500,500, fill='white', outline='white')
            x=0
        b+=1
        if not b>20:
            can1.after(50, clignote)
        else:
            x, b = 0, 0
            initialisation()
            return
            
            
            
    
    def initialisation():
        global x1, y1, x2, y2, flag, erreur
        x1, y1 = 10, 10
        x2, y2 = x1, y1
        erreur=False
        can1.delete("all")
        croix()
        edit_cercles()
        flag='peaceandlove'
    
    
    #fonctions d'édition
    
    def edit_cercles():
        "affiche les cercles selon x1 et y1"
        global x1, y1, red, blue, yellow, green
        can1.create_oval(x1, y1, x1+40, y1+40, fill=red, outline=red)
        can1.create_oval(500-x1, 500-y1, 500-x1-40, 500-y1-40, fill=blue, outline=blue)
        can1.create_oval(500-x1, y1, 500-x1-40, y1+40, fill=green, outline=green)
        can1.create_oval(x1, 500-y1, x1+40, 500-y1-40, fill=yellow, outline=yellow)
    
    def croix():
        "affiche les quatre croix selon x2 et y2"
        global x2, y2, red, blue, yellow, green
        #hg_bd
        can1.create_line(x2, y2, x2+40, y2+40, width=2, fill=blue)
        can1.create_line(500-x2-40, y2, 500-x2, y2+40, width=2, fill=yellow)
        can1.create_line(x2, 500-y2-40, x2+40, 500-y2, width=2, fill=green)
        can1.create_line(500-x2-40, 500-y2-40, 500-x2, 500-y2, width=2, fill=red)
        #bg_hd
        can1.create_line(x2, y2+40, x2+40, y2, width=2, fill=blue)
        can1.create_line(500-x2-40, y2+40, 500-x2, y2, width=2, fill=yellow)
        can1.create_line(x2, 500-y2, x2+40, 500-y2-40, width=2, fill=green)
        can1.create_line(500-x2-40, 500-y2, 500-x2, 500-y2-40, width=2, fill=red)
    
    def croix_anim():
        "Animation épaisseur de la croix pour erreur"
        global compteurCroix
        if compteurCroix<50:
            can1.create_line(0,0,500,500, fill='red', width=compteurCroix*2)
            can1.create_line(0,500,500,0, fill='red', width=compteurCroix*2)
            compteurCroix+=1
            can1.after(1, croix_anim)
        else:
            compteurCroix=0
            return
    
            
    
    
    #commandes de déplacement
    
    def droite(event):
        global flag
        flag='d'
    
    def gauche(event):
        global flag
        flag='g'
    
    def bas(event):
        global flag
        flag='b'
    
    def haut(event):
        global flag
        flag='h'
    
    
    #Fonction de calcul
    
    def distance():
        "calule les distances et coordonnées des points comparés, détecte la victoire"
        global x1, x2, y1, y2, dist, distLim, flag
        a1, b1, a2, b2 = x1+20, y1+20, 500-x2-20, 500-y2-20
        dist = sqrt(pow((a2-a1), 2)+pow((b2-b1), 2))
        if dist<distLim:
            flag='s'
    
    
    def erreur_detect():
        global erreur, x1, y1
        if x1<0 or x1>460 or y1<0 or y1>460:
            erreur=True
    
    def limite():
        "détecte la position limite et active la transition + réinistialation"
        global x1, y1, flag
        can1.delete("all")
        #can1.create_rectangle(0,0,500,500, fill='black')
        croix_anim()
        can1.after(1000, initialisation)
        return
    
    #Autre
    
    def fermer(event):
        master.destroy()
        
    
    
    
    
            
        
        
        
    
    
    #########################################################################
    #########################                   #############################
    #########################       MAIN        #############################
    #########################                   #############################
    #########################################################################
    
    
    #innitialisation des variables (globales)
    
    flag='d'
    
    x1, y1 = 10, 10
    x2, y2 = x1, y1
    dist=0
    dist=float(dist)
    distLim=10*sqrt(2)
    b=0
    x=0
    compteurCroix=0
    
    erreur=False
    
    niveau=1
    
    red, blue, yellow, green = '#c0392b', '#2980b9', '#f1c40f', '#2ecc71'
    colFond, colQuit = '#1abc9c', '#34495e'
    
    
    
    
    #création de la fenêtre
    master=Tk()
    master.configure(bg=colFond)
    
    #StringVar
    var = StringVar()
    
    #Aire de jeu
    can1=Canvas(master, width=500, height=500, bg='white')
    can1.pack(side=TOP)
    
    #Affichage innitial avant démarage avec <espace>
    
    initialisation()
    
    fofo=Frame(master, padx=10, pady=5, bg=colQuit)
    fofo.pack(side=RIGHT)
    
    
    
    
    txtquit = Label(fofo, text='Quitter', bg=colQuit, fg='white')
    txtquit.pack()
    txtquit.bind("<Button-1>", fermer)
    
    demarrer = Label(master, text=var.get(), fg='white', bg=colFond)
    demarrer.pack(side=LEFT)
    
    
    #Gestion des évenements
    master.bind("<Left>", gauche)
    master.bind("<Right>", droite)
    master.bind("<Down>", bas)
    master.bind("<Up>", haut)
    master.bind("<space>", start)
    
    
    #Démarrage du réceptionnaire d'évennements
    master.mainloop()
    master.destroy()
    



    -
    Edité par JackPote 8 février 2015 à 22:57:31

    • Partager sur Facebook
    • Partager sur Twitter
    "Du couscous à noël, ça c'est une idée", Kant
      8 février 2015 à 23:09:06

      J'ai trouvé !

      Pour les textes variables, il faut mettre "textvariable=x" et non pas "text=x" dans le label

      :D

      -
      Edité par JackPote 8 février 2015 à 23:09:24

      • Partager sur Facebook
      • Partager sur Twitter
      "Du couscous à noël, ça c'est une idée", Kant

      Problème : StringVar non communicante

      × 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.
      • Editeur
      • Markdown