Partage
  • Partager sur Facebook
  • Partager sur Twitter

Changer l'icone fenêtre Tkinter avex cx_freeze

Sujet résolu
    21 mai 2015 à 11:24:31

    Salut à tous,

    J'ai un soucis pour modifier l'icone tkinter de mes interfaces lorsque j'utilise cx_freeze. Lorsque je lance mon programme depuis l'IDLE Python il n'y a aucun problème, je n'ai plus l'icone tkinter mais bien celle que j'ai définie. Or, une fois tout "compilé" avec cx_freeze, l'icone de mon exe est bien modifié mais mon programme ne se lance plus, avec une erreur :

    Traceback (most recent call last):

    File "C:\Python27\lib\site-packages\cx_Freeze\initscripts\Console.py", line 27, in <module>

        exec(code, m.__dict__)

    File "krypton.py", line 20, in <module>

    File "C:\Python27\lib\lib-tk\Tkinter.py", line 1643, in wrm_iconbitmap

        return self.tk.call('wm', 'iconbitmap', self._w, bitmap)

    TclError: bitmap "test.ico" not defined

    Je vous mets le script python puis le setup cx_freeze

    Script python

    # -*- coding: utf-8 -*-
    
    from interface import *
    
    def quitter():
        root.destroy()
     
    def creer():
        
        Interface()
                  
    root = tk.Tk()
    root.wm_title("Krypton")
    root.wm_iconbitmap("test.ico")
    Button(root, text="New Window", command=creer,padx = 5, pady = 30).pack(side=LEFT)
    Button(root, text="Quit", command=quitter, padx = 30, pady = 30).pack(side=RIGHT)
    root.mainloop()
    

    Setup cx_freeze

    #!/usr/bin/python
    # -*- coding: utf-8 -*-
    # Python 3
     
    """
    Icone sous Windows: il faut:
    => un xxx.ico pour integration dans le exe, avec "icon=xxx.ico"
    => un xxx.png pour integration avec PyQt4 + demander la recopie avec includefiles.
    """
     
    import sys, os
    from cx_Freeze import setup, Executable
     
    #############################################################################
    # preparation des options
     
    # chemins de recherche des modules
    # ajouter d'autres chemins (absolus) si necessaire: sys.path + ["chemin1", "chemin2"]
    path = sys.path
     
    # options d'inclusion/exclusion des modules
    includes = []  # nommer les modules non trouves par cx_freeze
    excludes = []
    packages = ["scipy.special._ufuncs_cxx","scipy.linalg","scipy.integrate","scipy.sparse.csgraph._validation","FileDialog"]  # nommer les packages utilises
     
    # copier les fichiers non-Python et/ou repertoires et leur contenu:
    includefiles = ["test.ico"]
     
    if sys.platform == "win32":
        pass
        # includefiles += [...] : ajouter les recopies specifiques à Windows
    elif sys.platform == "linux2":
        pass
        # includefiles += [...] : ajouter les recopies specifiques à Linux
    else:
        pass
        # includefiles += [...] : cas du Mac OSX non traite ici
     
    # pour que les bibliotheques binaires de /usr/lib soient recopiees aussi sous Linux
    binpathincludes = []
    if sys.platform == "linux2":
        binpathincludes += ["/usr/lib"]
     
    # niveau d'optimisation pour la compilation en bytecodes
    optimize = 0
     
    # si True, n'affiche que les warning et les erreurs pendant le traitement cx_freeze
    silent = True
     
    # construction du dictionnaire des options
    options = {"path": path,
               "includes": includes,
               "excludes": excludes,
               "packages": packages,
               "include_files": includefiles,
               "bin_path_includes": binpathincludes,
               "create_shared_zip": False,  # <= ne pas generer de fichier zip
               "include_in_shared_zip": False,  # <= ne pas generer de fichier zip
               "compressed": False,  # <= ne pas generer de fichier zip
               "optimize": optimize,
               "silent": silent
               }
     
    # pour inclure sous Windows les dll system de Windows necessaires
    if sys.platform == "win32":
        options["include_msvcr"] = True
     
    #############################################################################
    # preparation des cibles
    base = None
    if sys.platform == "win32":
        base = "Win32GUI"  # pour application graphique sous Windows
        # base = "Console" # pour application en console sous Windows
     
    icone = None
    if sys.platform == "win32":
        icone = "test.ico"
     
    cible_1 = Executable(
        script="krypton.py",
        base=base,
        compress=False,  # <= ne pas generer de fichier zip
        copyDependentFiles=True,
        appendScriptToExe=True,
        appendScriptToLibrary=False,  # <= ne pas generer de fichier zip
        icon= "test.ico"
        #icon_resources: [(1, "test.ico")]
        )
     
    #cible_2 = Executable(
     #   script="monprogramme2.pyw",
      #  base=base,
       # compress=False,
        #copyDependentFiles=True,
        #appendScriptToExe=True,
        #appendScriptToLibrary=False,
        #icon=icone
        #)
     
    #############################################################################
    # creation du setup
    setup(
        name="monprogramme",
        version="1.00",
        description="monprogramme",
        author="auteurduprogramme",
        options={"build_exe": options},
        executables=[cible_1]
        )
    

    Merci d'avance !

    Edit : Je précise que je suis sous python 2.7

    -
    Edité par Fizbanoide 21 mai 2015 à 11:36:07

    • Partager sur Facebook
    • Partager sur Twitter
      22 mai 2015 à 8:37:46

      Personne n'a une idée ?
      • Partager sur Facebook
      • Partager sur Twitter
        22 mai 2015 à 9:35:08

        Salut :magicien:

        Il faut que tu passes par une image intermédiaire comme ici

        root = tk.Tk()
        root.wm_title("Krypton")
        img = tk.PhotoImage("test.ico")
        root.tk.call('wm','iconphoto',root._w,img)
        #D'autres solutions sont proposées à toi de toruver 

        Pourquoi ça fait ça ?

        Tout simplement l'appel de .wm_iconbitmap va aller modifier la variable wm.bitmap qui est ni plus ni moins qu'une image. En passant en paramètres une chaîne de caractère il annonce fièrement qu'il ne ocnnait pas cette bitmap car elle n'est pas définie. En passant par une image il reconnaitra la bitmap et saura l'appliquer.

        Le seul doute qu'il me reste c'est le fait que tu codes sous 2.7 ... :D

        -
        Edité par IQbrod 22 mai 2015 à 9:40:00

        • Partager sur Facebook
        • Partager sur Twitter
        OpenClassrooms retire tellement d'aiguilles de nos pieds qu'on pourrait ne plus trouver le foin de notre botte :)
          22 mai 2015 à 9:56:36

          Alors, j'ai trouvé une solution plus ou moins similaire, je vous mets les scripts :

          Script python :

          # -*- coding: utf-8 -*-
          
          from interface import *
          import base64
          
          def quitter():
              root.destroy()
           
          def creer():
              
              Interface()
                        
          root = tk.Tk()
          root.wm_title("Krypton")
          
          iconfile = "test.ico" # appico.xbm sous linux
          
          root.iconbitmap(iconfile) #'@'+iconfile sous linux
          
          Button(root, text="New Window", command=creer,padx = 5, pady = 30).pack(side=LEFT)
          Button(root, text="Quit", command=quitter, padx = 30, pady = 30).pack(side=RIGHT)
          root.mainloop()
          

          Setup :

          #!/usr/bin/python
          # -*- coding: utf-8 -*-
          # Python 3
           
          """
          Icone sous Windows: il faut:
          => un xxx.ico pour integration dans le exe, avec "icon=xxx.ico"
          => un xxx.png pour integration avec PyQt4 + demander la recopie avec includefiles.
          """
           
          import sys, os
          from cx_Freeze import setup, Executable
           
          #############################################################################
          # preparation des options
           
          # chemins de recherche des modules
          # ajouter d'autres chemins (absolus) si necessaire: sys.path + ["chemin1", "chemin2"]
          path = sys.path
           
          # options d'inclusion/exclusion des modules
          includes = []  # nommer les modules non trouves par cx_freeze
          excludes = []
          packages = ["scipy.special._ufuncs_cxx","scipy.linalg","scipy.integrate","scipy.sparse.csgraph._validation","FileDialog"]  # nommer les packages utilises
           
          # copier les fichiers non-Python et/ou repertoires et leur contenu:
          includefiles = ["test.ico"]
           
          if sys.platform == "win32":
              pass
              # includefiles += [...] : ajouter les recopies specifiques à Windows
          elif sys.platform == "linux2":
              pass
              # includefiles += [...] : ajouter les recopies specifiques à Linux
          else:
              pass
              # includefiles += [...] : cas du Mac OSX non traite ici
           
          # pour que les bibliotheques binaires de /usr/lib soient recopiees aussi sous Linux
          binpathincludes = []
          if sys.platform == "linux2":
              binpathincludes += ["/usr/lib"]
           
          # niveau d'optimisation pour la compilation en bytecodes
          optimize = 0
           
          # si True, n'affiche que les warning et les erreurs pendant le traitement cx_freeze
          silent = True
           
          # construction du dictionnaire des options
          options = {"path": path,
                     "includes": includes,
                     "excludes": excludes,
                     "packages": packages,
                     "include_files": includefiles,
                     "bin_path_includes": binpathincludes,
                     "create_shared_zip": False,  # <= ne pas generer de fichier zip
                     "include_in_shared_zip": False,  # <= ne pas generer de fichier zip
                     "compressed": False,  # <= ne pas generer de fichier zip
                     "optimize": optimize,
                     "silent": silent
                     }
           
          # pour inclure sous Windows les dll system de Windows necessaires
          if sys.platform == "win32":
              options["include_msvcr"] = True
           
          #############################################################################
          # preparation des cibles
          base = None
          if sys.platform == "win32":
              base = "Win32GUI"  # pour application graphique sous Windows
              # base = "Console" # pour application en console sous Windows
           
          icone = None
          if sys.platform == "win32":
              icone = "test.bmp"
           
          cible_1 = Executable(
              script="krypton.py",
              base=base,
              compress=False,  # <= ne pas generer de fichier zip
              copyDependentFiles=True,
              appendScriptToExe=True,
              appendScriptToLibrary=False,  # <= ne pas generer de fichier zip
              icon= "test.ico"
              #icon_resources: [(1, "test.ico")]
              )
           
          #cible_2 = Executable(
           #   script="monprogramme2.pyw",
            #  base=base,
             # compress=False,
              #copyDependentFiles=True,
              #appendScriptToExe=True,
              #appendScriptToLibrary=False,
              #icon=icone
              #)
           
          #############################################################################
          # creation du setup
          setup(
              name="monprogramme",
              version="1.00",
              description="monprogramme",
              author="auteurduprogramme",
              options={"build_exe":options},
              executables=[cible_1]
              )
          

          De cette maniere il définit bien mon icone avec iconbitmap dans mon script python ce qui lui permet de le reconnaitre plus tard ( si j'ai bien compris :p ). Après dans le setup il faut aussi ajouter le nom de l'icone dans includefiles, sinon il ne le trouve pas.

          Merci pour ta réponse en tout cas ;)


          • Partager sur Facebook
          • Partager sur Twitter

          Changer l'icone fenêtre Tkinter avex cx_freeze

          × 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