Partage
  • Partager sur Facebook
  • Partager sur Twitter

Problème Tkinter appel fichier.py

Sujet résolu
    18 septembre 2019 à 18:23:10

    Bonjour,

    voilà pour m'amuser j'ai coder une sorte de Space Invaders mais il m'est venu une idée en le finissant, je voudrais depuis une fenetre Tkinter et avec des Buttons dans un fichier py à part executer le fichier py du code du jeu mais je sais pas comment faire comprendre à Tkinter le fait d'ouvrir un autre fichier que le siens 

    voici mes deux fichiers,

    FICHIER DU CODE DU JEU :

    import turtle
    import os
    import math
    import random
    import pygame.mixer
    from pygame.locals import*
    
    pygame.mixer.init()
    
    fenetre = turtle.Screen()
    fenetre.setup(800,800)
    fenetre.bgcolor("black")
    fenetre.title("Space Invaders")
    fenetre.bgpic("Background1.gif")
    turtle.register_shape("Martien.gif")
    turtle.register_shape("Joueur1.gif")
    
    ##bordure_prim = turtle.Turtle()
    ##bordure_prim.speed(0)
    ##bordure_prim.color("white")
    ##bordure_prim.penup()
    ##bordure_prim.setposition(-300,-300)
    ##bordure_prim.pendown()
    ##bordure_prim.pensize(3)
    ##for taille in range(4):
    ##    bordure_prim.fd(600)
    ##    bordure_prim.lt(90)
    ##bordure_prim.hideturtle()
    
    pygame.mixer.music.load("BackSound.wav")
    pygame.mixer.music.play()
    volume = pygame.mixer.music.get_volume()
    pygame.mixer.music.set_volume(100)
    Son_Tirs = pygame.mixer.Sound("laser.wav")
    Son_Explosion = pygame.mixer.Sound("explosion.wav")
    SCORE = 0
    SCORE_prim = turtle.Turtle()
    SCORE_prim.speed(0)
    SCORE_prim.color("white")
    SCORE_prim.penup()
    SCORE_prim.setposition(-290,270)
    SCOREtxt = "Score : %s" %SCORE
    SCORE_prim.write(SCOREtxt, False, align="left", font=("Arial",14,"normal"))
    SCORE_prim.hideturtle()
    
    joueur = turtle.Turtle()
    joueur.color("blue")
    joueur.shape("Joueur1.gif")
    joueur.penup()
    joueur.speed(0)
    joueur.setposition(0,-250)
    joueur.setheading(90)
    vitesseJoueur = 15
    
    tirs = turtle.Turtle()
    tirs.color("yellow")
    tirs.shape("triangle")
    tirs.penup()
    tirs.speed(0)
    tirs.setheading(90)
    tirs.shapesize(0.5,0.5)
    tirs.hideturtle()
    vitesseTirs = 20
    StatusTirs = "pret"
    
    nombreDeMartiens = 5
    Bataillon = []
    for i in range(nombreDeMartiens):
        Bataillon.append(turtle.Turtle())
    for martiens in Bataillon:
        #martiens = turtle.Turtle()
        martiens.color("red")
        martiens.shape("Martien.gif")
        martiens.penup()
        martiens.speed(0)
        x = random.randint(-200,200)
        y = random.randint(100,250)
        martiens.setposition(x,y)
    vitesseMartiens = 2
    
    def depGauche():
        x = joueur.xcor()
        x -= vitesseJoueur
        if (x<-280):
            x = -280
        joueur.setx(x)
    
    def depDroite():
        x = joueur.xcor()
        x += vitesseJoueur
        if (x>280):
            x = 280
        joueur.setx(x)
    
    def Feu():
        global StatusTirs
        if (StatusTirs == "pret"):
            Son_Tirs.play()
            StatusTirs = "feu"
            x = joueur.xcor()
            y = joueur.ycor()+10
            tirs.setposition(x,y)
            tirs.showturtle()
    def CollisionAvecMartiens(x1,x2):
        zone = math.sqrt(math.pow(x1.xcor()-x2.xcor(),2)+math.pow(x1.ycor()-x2.ycor(),2))
        if (zone<15):
            return True
        else:
            return False
    
    turtle.listen()
    turtle.onkey(depGauche, "Left")
    turtle.onkey(depDroite, "Right")
    turtle.onkey(Feu, "space")
    
    while True:
        for martiens in Bataillon:
            x = martiens.xcor()
            x += vitesseMartiens
            martiens.setx(x)
    
            if (martiens.xcor()>280):
                for b in Bataillon:
                    y = b.ycor()
                    y -= 40
                    b.sety(y)
                vitesseMartiens *= -1
            if (martiens.xcor()<-280):
                for b in Bataillon:
                    y = b.ycor()
                    y -= 40
                    b.sety(y)
                vitesseMartiens *= -1
            if (CollisionAvecMartiens(tirs,martiens)):
                Son_Explosion.play()
                tirs.hideturtle()
                StatusTirs = "pret"
                tirs.setposition(0,-400)
                x = random.randint(-200,200)
                y = random.randint(100,250)
                martiens.setposition(x,y)
                SCORE += 10
                SCOREtxt = "Score : %s" %SCORE
                SCORE_prim.clear()
                SCORE_prim.write(SCOREtxt, False, align="left", font=("Arial",14,"normal"))
            if (CollisionAvecMartiens(joueur,martiens)):
                Son_Explosion.play()
                joueur.hideturtle()
                martiens.hideturtle()
                print("Game Over")
                break
        if (StatusTirs == "feu"):
            y = tirs.ycor()
            y += vitesseTirs
            tirs.sety(y)
        if (tirs.ycor()>275):
            tirs.hideturtle()
            StatusTirs = "pret"
    
        
    delay = raw_input("Tapez entrer pour fermer.")

    FICHIER DU CODE TKINTER:

    import turtle
    from tkinter import*
    import os
    import math
    import random
    import pygame.mixer
    from pygame.locals import*
    
    ChoixNiveau = Tk()
    ChoixNiveau_LVL1 = Label(ChoixNiveau,text="Niveau 1 : Earth Spacial")
    ImageBtnLVL1 = PhotoImage(file='BTNLVL1.gif')
    ChoixNiveau_Btn1 = Button(ChoixNiveau,image=ImageBtnLVL1,command=FICHIER_DU_JEU)
    ChoixNiveau_LVL1.pack()
    ChoixNiveau_Btn1.pack()
    ChoixNiveau.mainloop()





    • Partager sur Facebook
    • Partager sur Twitter
      18 septembre 2019 à 18:26:57

      La solution qui me semble là plus viable reste les threads, car les deux framework utilisent leur propre boucle événementielle.

      Voir sur ton moteur de recherche avec thread tkinter pygame

      • Partager sur Facebook
      • Partager sur Twitter

      Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
      La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

        18 septembre 2019 à 18:30:08

        Ouai j'y ai pensé mais j'utilise Turtle et non pygame
        • Partager sur Facebook
        • Partager sur Twitter
          18 septembre 2019 à 18:36:14

          Regarde du côté de TurtleScreen sur la doc, ça semble fait pour Tkinter
          • Partager sur Facebook
          • Partager sur Twitter

          Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
          La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

            18 septembre 2019 à 18:49:01

            Ouai mais attention moi j'ai deux fichiers ".py" différents j'ai mon fichier Tkinter et mon fichier Turtle ce que je veux c'est qu'a l'exécution mon fichier Tkinter me propose plusieurs choix via boutons et que quand je clique sur un bouton sa me ferme mon fichier Tkinter pour ouvrir le second fichier ".py" avec le code Turtle
            • Partager sur Facebook
            • Partager sur Twitter
              18 septembre 2019 à 19:36:57

              Ok, donc c'est encore plus simple, quel est le soucis au final ?

              Sur le principe, on crée un callback qui va exécuter ton autre fichier python via subprocess par exemple, et quitter tkinter.

              • Partager sur Facebook
              • Partager sur Twitter

              Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
              La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

                18 septembre 2019 à 19:44:08

                Mon soucis au final c'est que quand j'ai essayer le callback sa m'a fait sa :

                import turtle
                from tkinter import*
                import os
                import math
                import random
                import pygame.mixer
                from pygame.locals import*
                
                def LevelOne():
                    exec(open("./SpaceInvaders.py").read())
                    ChoixNiveau.destroy()
                    
                ChoixNiveau = Tk()
                ChoixNiveau_LVL1 = Label(ChoixNiveau,text="Niveau 1 : Earth Spacial")
                ImageBtnLVL1 = PhotoImage(file='BTNLVL1.gif')
                ChoixNiveau_Btn1 = Button(ChoixNiveau,image=ImageBtnLVL1,command=LevelOne)
                ChoixNiveau_LVL1.pack()
                ChoixNiveau_Btn1.pack()
                ChoixNiveau.mainloop()

                avec les erreurs suivantes :

                Exception in Tkinter callback

                Traceback (most recent call last):

                  File "C:\Users\steph\AppData\Local\Programs\Python\Python37\lib\tkinter\__init__.py", line 1705, in __call__

                    return self.func(*args)

                  File "C:\Users\steph\Desktop\Space Invaders\test.py", line 10, in LevelOne

                    exec(open("./SpaceInvaders.py").read())

                  File "<string>", line 14, in <module>

                  File "C:\Users\steph\AppData\Local\Programs\Python\Python37\lib\turtle.py", line 1482, in bgpic

                    self._setbgpic(self._bgpic, self._bgpics[picname])

                  File "C:\Users\steph\AppData\Local\Programs\Python\Python37\lib\turtle.py", line 738, in _setbgpic

                    self.cv.itemconfig(item, image=image)

                  File "<string>", line 1, in itemconfig

                  File "C:\Users\steph\AppData\Local\Programs\Python\Python37\lib\tkinter\__init__.py", line 2578, in itemconfigure

                    return self._configure(('itemconfigure', tagOrId), cnf, kw)

                  File "C:\Users\steph\AppData\Local\Programs\Python\Python37\lib\tkinter\__init__.py", line 1476, in _configure

                    self.tk.call(_flatten((self._w, cmd)) + self._options(cnf))

                _tkinter.TclError: image "pyimage3" doesn't exist



                • Partager sur Facebook
                • Partager sur Twitter
                  18 septembre 2019 à 19:56:38

                  Salut!

                  L'erreur "_tkinter.TclError: image "pyimage3" doesn't exist" est très courante quand tu utilise des Thread, parce que tkinter est pas vraiment thread safe.

                  L'une des options les plus simples consisterait à faire une classe afficher niveau, d'importer ton premier fichier .py et de lancer l'affichage de la classe.

                  Ou même carrément directement importer le fichier py pour qu'il se lance au tout début!

                  • Partager sur Facebook
                  • Partager sur Twitter
                    18 septembre 2019 à 20:54:52

                    Je pense que le problème vient du fait que tu supprimes une instance Tk dans un callback, tu devrais essayer avec une fenêtre de type Toplevel.

                    Tristan Starkl L'Immortel a écrit:

                    Salut!

                    L'erreur "_tkinter.TclError: image "pyimage3" doesn't exist" est très courante quand tu utilise des Thread, parce que tkinter est pas vraiment thread safe.

                    L'une des options les plus simples consisterait à faire une classe afficher niveau, d'importer ton premier fichier .py et de lancer l'affichage de la classe.

                    Ou même carrément directement importer le fichier py pour qu'il se lance au tout début!

                    Le problème c'est que je ne vois pas l'utilisation de thread dans son programme. Si ?

                    • Partager sur Facebook
                    • Partager sur Twitter

                    Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
                    La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

                      18 septembre 2019 à 21:00:18

                      Okay d'accord mais je fais comment du coup ??
                      • Partager sur Facebook
                      • Partager sur Twitter
                        18 septembre 2019 à 21:07:27

                        Tu regardes les tutos tkinter utilisant la classe Toplevel, tu fais des petits tests et tu adaptes à ton code. C'est ça la programmation, un travail de recherches et de tests pratiques...
                        • Partager sur Facebook
                        • Partager sur Twitter

                        Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
                        La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

                          18 septembre 2019 à 21:26:52

                          J'en suis pas a mon premier programme en Tkinter les cours OpenClassroom je les ai lu (en plus de mes cours en classe de BTS) j'aurais au moins souhaité une piste un peu plus précise xP
                          • Partager sur Facebook
                          • Partager sur Twitter
                            18 septembre 2019 à 22:57:01

                            Tk est la fenêtre principale, il te faudra une fenêtre secondaire où mettre ton bouton nommée Toplevel.

                            C'est cette fenêtre secondaire que tu devras détruire (méthode destroy) à la suite de l'exécution de ton autre fichier Python. Je ne suis pas sûr par contre que pour exécuter ton autre fichier, exec soit la bonne méthode, j'avais proposé le module subprocess.

                            Que faire de la fenêtre principale Tk ? Là cacher !

                            • Partager sur Facebook
                            • Partager sur Twitter

                            Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
                            La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

                              19 septembre 2019 à 0:34:50

                              Deux fenêtres ? Mais c'est illogique une seule devrait pouvoir suffir non ? Fin je veux dire c'est comme ci pour lancer un jeux pc par exemple un truc tout con le solitaire il m'ouvrait 3/4 fenêtre avant de lancer le launcher et même pas le jeu xP fin je vais essayer merci en tout cas je vais voir sa ^^
                              • Partager sur Facebook
                              • Partager sur Twitter
                                19 septembre 2019 à 7:53:01

                                Oui certainement, et quand je teste de mon côté, ça n'a pas l'air de déranger,

                                In [1]: from tkinter import *                                                   
                                
                                In [2]: def destroy(): 
                                   ...:     root.destroy() 
                                   ...:                                                                         
                                
                                In [3]: root = Tk()                                                             
                                
                                In [4]: button = Button(root, text='quit', command=destroy)                     
                                
                                In [5]: button.pack()                                                           
                                
                                In [6]: root.mainloop()                                                         
                                
                                

                                du coup je me demande bien d'où ça vient... peut-être devrais tu tester sans l'image pour voir si ça viendrait pas de là.

                                • Partager sur Facebook
                                • Partager sur Twitter

                                Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
                                La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

                                Problème Tkinter appel fichier.py

                                × 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