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:
.png
ou .bmp
- aucun n'a fonctionné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.
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()
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)
où 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
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'))
#!/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!
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'))
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]
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.
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]
''
>>>
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.