web-dev-qa-db-fra.com

Définir l'icône de la fenêtre

Lorsque j'ai essayé de changer l'icône de la fenêtre dans le coin supérieur gauche du "TK" rouge moche en mon propre favicon en utilisant le code ci-dessous, Python a lancé une erreur:

from tkinter import *
root = Tk()

#some buttons, widgets, a lot of stuff

root.iconbitmap('favicon.ico')

Cela devrait définir l’icône sur 'favicon.ico' (selon beaucoup de messages de forum sur le Web). Mais malheureusement, cette ligne ne génère que l'erreur suivante:

Traceback (most recent call last):
  File "d:\ladvclient\mainapp.py", line 85, in <module>
    root.iconbitmap(bitmap='favicon.ico')
  File "C:\Python33\lib\tkinter\__init__.py", line 1637, in wm_iconbitmap
    return self.tk.call('wm', 'iconbitmap', self._w, bitmap)
_tkinter.TclError: bitmap "favicon.ico" not defined

Ce que j'ai déjà fait:

  • J'ai vérifié le chemin - tout est correct à 100%
  • J'ai essayé d'autres formats de fichiers comme .png ou .bmp - aucun n'a fonctionné
  • J'ai cherché ce problème sur de nombreux sites Web

Et pour le troisième point, effbot.org, mon site préféré sur Tkinter, m’a dit que Windows ignorait la fonction iconbitmap. Mais cela n’explique pas pourquoi cela jette une erreur!

Il existe quelques moyens "astucieux" pour éviter ce problème, mais aucun d’entre eux n’est écrit pour Python 3.x.

Ma dernière question est donc la suivante: y at-il un moyen d’obtenir une icône personnalisée en utilisant Python 3.x et Tkinter?

En outre, ne me dites pas que je devrais utiliser une autre bibliothèque d'interface graphique. Je veux que mon programme fonctionne sur toutes les plateformes. Je veux aussi une version codée, pas une py2exe ou sth solution.

42
CrushedPixel

Vous ne devez pas avoir favicon.ico dans le même dossier que votre script ou, notamment, sur votre chemin. Mettez le chemin complet. Par exemple, cela fonctionne:

from tkinter import *
root = Tk()

root.iconbitmap(r'c:\Python32\DLLs\py.ico')
root.mainloop()

Mais cela explose avec la même erreur:

from tkinter import *
root = Tk()

root.iconbitmap('py.ico')
root.mainloop()
48
iCodez

En aucun cas ce qui est suggéré ici ne fonctionne - l'erreur "bitmap xxx non défini" est toujours présente. Et oui, je lui ai tracé le bon chemin.

Ce que cela a fait est le suivant:

imgicon = PhotoImage(file=os.path.join(sp,'myicon.gif'))
root.tk.call('wm', 'iconphoto', root._w, imgicon)  

sp est le chemin du script et root la fenêtre racine de Tk.

Il est difficile de comprendre comment cela fonctionne (je l’ai copié sans vergogne de fedoraforums ) mais cela fonctionne

18
alessandro

Cela fonctionne pour moi avec Python3 sur Linux:

import tkinter as tk

# Create Tk window
root = tk.Tk()

# Add icon from GIF file where my GIF is called 'icon.gif' and
# is in the same directory as this .py file
root.tk.call('wm', 'iconphoto', root._w, tk.PhotoImage(file='icon.gif'))
4
Steve Daulton
#!/usr/bin/env python
import tkinter as tk

class AppName(tk.Frame):
    def __init__(self, master=None):
        tk.Frame.__init__(self, master)
        self.grid()
        self.createWidgets()

    def createWidgets(self):
        self.quitButton = tk.Button(self, text='Quit', command=self.quit)
        self.quitButton.grid()

app = AppName()
app.master.title('Title here ...!')
app.master.iconbitmap('icon.ico')
app.mainloop()

ça devrait marcher comme ça!

1
Malek B.

Est resté coincé là aussi ...

Enfin réussi à définir l'icône que je voulais en utilisant le code suivant:

from tkinter import *
root.tk.call('wm', 'iconphoto', root._w, PhotoImage(file='resources/icon.png'))
1
Yuval Farkash

Les deux codes fonctionnent bien avec moi sur python 3,7 ..... j'espère que cela fonctionnera aussi pour u

import tkinter as tk
m=tk.Tk()
m.iconbitmap("myfavicon.ico")
m.title("SALAH Tutorials")
m.mainloop()

et n'oubliez pas de conserver "myfavicon.ico" dans le même dossier que votre fichier de script de projet

Une autre méthode

from tkinter import *
m=Tk()
m.iconbitmap("myfavicon.ico")
m.title("SALAH Tutorials")
m.mainloop()

[* NOTE: - python la version 3 fonctionne avec tkinter et en dessous de la version 3, c'est-à-dire que la version 2 fonctionne avec Tkinter]

1
Er M S Dandyan

Assurez-vous également que le fichier .ico n'est pas corrompu. J'ai eu la même erreur qui a disparu quand j'ai essayé un fichier .ico différent.

0
Daniel

Donc, il semble que root.iconbitmap() ne supporte qu'un répertoire fixe.
sys.argv[0] renvoie le répertoire à partir duquel le fichier a été lu afin qu'un code simple fonctionne pour créer un répertoire fixe.

import sys
def get_dir(src):
    dir = sys.argv[0]
    dir = dir.split('/')
    dir.pop(-1)
    dir = '/'.join(dir)
    dir = dir+'/'+src
    return dir

C'est la sortie

>>> get_dir('test.txt')
'C:/Users/Josua/Desktop/test.txt'

MODIFIER:
Le seul problème est que cette méthode ne fonctionne pas sur Linux

josua@raspberrypi:~ $ python
Python 2.7.9 (default, Sep 17 2016, 20:26:04) [GCC 4.9.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import sys
>>> sys.argv[0]
''
>>>
0
Josua Robson
from tkinter import *
from PIL import ImageTk, Image

Tk.call('wm', 'iconphoto', Tk._w, ImageTk.PhotoImage(Image.open('./resources/favicon.ico')))

Ce qui précède a fonctionné pour moi.

0
Tarun Kolla