[Python] mauvais affichage
Répondre à la discussion
Affichage des résultats 1 à 3 sur 3

[Python] mauvais affichage



  1. #1
    Scryper

    [Python] mauvais affichage


    ------

    Bonjour,

    Je travaille sur un petit exercice mais j'ai des problèmes lorsque je veux actualiser le canvas.
    Le code :
    Code:
    from tkinter import *
    from time import *
    from random import randint
    from math import floor
    
    def vitrine() :
        global obj_1, obj_2, obj_3, obj_4, img_1, img_2, img_3, img_4
        liste_objets = []
        prix = 0
        total = 0
        for i in range(4) :
            n = randint(1, 9)
            if n not in liste_objets :
                liste_objets.append(n)
                fichier = "G:\\Python\\Livre\\Images\\Projet 7\\objet" + str(n) + ".gif"
                if i == 1 :
                    img_1 = PhotoImage(file = fichier)
                elif i == 2 :
                    img_2 = PhotoImage(file = fichier)
                elif i == 3 :
                    img_3 = PhotoImage(file = fichier)
                else :
                    img_4 = PhotoImage(file = fichier)
            else :
                i -= 1
            if n == 1 : prix += 120
            elif n == 2 : prix += 70
            elif n == 3 : prix += 20
            elif n == 4 : prix += 40
            elif n == 5 : prix += 30
            elif n == 6 : prix += 6
            elif n == 7 : prix += 70
            elif n == 8 : prix += 30
            else : prix += 20
        canv.itemconfig(obj_1, image = img_1)
        canv.itemconfig(obj_2, image = img_2)
        canv.itemconfig(obj_3, image = img_3)
        canv.itemconfig(obj_4, image = img_4)
        r = randint(-10, 10)
        total = floor(prix + r * prix / 100)
        print(total) # print test
        return total
    
    def actualiser(temps_f, continuer) :
        global temps_restant, canv
        if continuer :
            temps_r = temps_f - time()
            temps_r_str = str(temps_r)
            if temps_r >= 10 :
                canv.itemconfig(temps_restant, text = "Il vous reste " + temps_r_str[:2] + " secondes")
            else :
                canv.itemconfig(temps_restant, text = "Il vous reste " + temps_r_str[0] + " secondes")
            fen.after(1000, lambda : actualiser(temps_f, True))
            if temps_f - time() <= 0 :
                canv.itemconfig(temps_restant, text = "Vous avez perdu !")
                fen.after(2000, fen.destroy)
            if temps_r >= 10 :
                img = PhotoImage(file = "G:\\Python\\Livre\\Images\\Projet 7\\billet" + temps_r_str[:2] + ".gif")
            if temps_r <= 10 and temps_r >= 0 :
                img = PhotoImage(file = "G:\\Python\\Livre\\Images\\Projet 7\\billet" + temps_r_str[0] + ".gif")
            canv.itemconfig(billet, image = img)
            canv.update()
        else :
            fen.after(2000, fen.destroy)
    
    def valider(evt) :
        global entry_prix_vitrine, tot, canv
        prop = int(entry_prix_vitrine.get())
        entry_prix_vitrine.delete(0, END)
        victoire = False
        if tot < prop :
            img_moins = PhotoImage(file = "G:\\Python\\Livre\\Images\\Projet 7\\moins.gif")
            canv.itemconfig(bonhomme_plus_moins, image = img_moins)
            print("moins")#  print test
        elif tot > prop :
            img_plus = PhotoImage(file = "G:\\Python\\Livre\\Images\\Projet 7\\plus.gif")
            canv.itemconfig(bonhomme_plus_moins, image = img_plus)
            print("plus") # print test
        else :
            img_bravo = PhotoImage(file = "G:\\Python\\Livre\\Images\\Projet 7\\bravo.gif")
            canv.itemconfig(bonhomme_plus_moins, image  = img_bravo)
            canv.itemconfig(temps_restant, text = "Vous avez gagné !")
            victoire = True
            print("gagné") # print test
        if victoire :
            actualiser(0, False)
        canv.update()
    
    fen = Tk()
    fen.title("Le juste prix")
    fen.geometry("800x550")
    fen.resizable(width = False, height = False)
    
    canv = Canvas(fen, width = 800, height = 800)
    canv.pack()
    
    fond = PhotoImage(file = "G:\\Python\\Livre\\Images\\Projet 7\\fond.gif")
    canv.create_image(0, 0, image = fond, anchor = 'nw')
    
    obj_1 = canv.create_image(300, 100, anchor = 'nw')
    obj_2 = canv.create_image(550, 100, anchor = 'nw')
    obj_3 = canv.create_image(300, 300, anchor = 'nw')
    obj_4 = canv.create_image(550, 300, anchor = 'nw')
    billet = canv.create_image(10, 70, anchor = 'nw')
    
    debut = PhotoImage(file = "G:\\Python\\Livre\Images\\Projet 7\\debut.gif")
    bonhomme_plus_moins = canv.create_image(10, 200, image = debut, anchor = 'nw')
    
    entry_prix_vitrine = Entry(fen, width = 20)
    entry_prix_vitrine.place(x = 50, y = 40)
    entry_prix_vitrine.bind('<Return>', valider)
    entry_prix_vitrine.focus()
    
    canv.create_text(40, 15, text = "Entrez le montant de la vitrine :", anchor = 'nw')
    
    temps_restant = canv.create_text(50, 65, text = "", anchor = 'nw')
    
    temps_fin = time() + 30
    
    tot = vitrine()
    actualiser(temps_fin, True)
    
    fen.mainloop()
    Les problèmes :
    L'image du bonhomme_plus_moins disparait quand j'entre une proposition (alors que ça devrait mettre soit un bonhomme qui dit "plus", "moins" ou "gagné"), et l'image des billets qui rétrécissent au fur et à mesure n'apparait pas non plus.
    J'ai longtemps cherché comment résoudre le problème, sans succès.

    Merci !

    -----

  2. #2
    umfred

    Re : [Python] mauvais affichage

    en bidouillant un peu, il faut rajouter img_plus, img_moins et img_bravo dans les global de valider (ou de n'utiliser qu'un seul identifiant d'image pour les 3 images) pour que cela fonctionne. (et pas besoin du canv.update())

    De plus, il y a un bug dans la sélection des images (boucle for) si plusieurs fois le même nombre sort du randint: il faut transformer la boucle for en boucle while, si tu veux absolument avoir 4 articles, sinon il faut gérer les cas générant des erreurs.
    Dernière modification par umfred ; 25/08/2017 à 22h43.

  3. #3
    umfred

    Re : [Python] mauvais affichage

    je ne l'ai pas précisé, mais même chose pour l'image des billets, en rajoutant "img" dans les global de "actualiser", cela fonctionne

Discussions similaires

  1. [Python] subprocess, lancer un autre programme avec python
    Par Loupsio dans le forum Programmation et langages, Algorithmique
    Réponses: 10
    Dernier message: 30/11/2016, 18h56
  2. en python le multi tache n'est pas possible alors pourquoi les threads existent sur python?
    Par docEmmettBrown dans le forum Programmation et langages, Algorithmique
    Réponses: 5
    Dernier message: 10/06/2015, 15h47
  3. Mauvais transfo, ou mauvais montage :S
    Par isda dans le forum Électronique
    Réponses: 4
    Dernier message: 28/12/2010, 14h22
  4. [Brun] mauvais affichage telephone
    Par marc.mcd dans le forum Dépannage
    Réponses: 1
    Dernier message: 11/06/2009, 11h06