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

quand J'ai essayé de changer l'icône de la fenêtre dans le coin supérieur gauche de la laide rouge "TK" à 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')

l'icône devrait être "favicon".ico' (selon beaucoup de messages de forum partout dans le web). Mais malheureusement, cette ligne n'est à jeter l'erreur suivante:

Traceback (most recent call last):
  File "d:ladvclientmainapp.py", line 85, in <module>
    root.iconbitmap(bitmap='favicon.ico')
  File "C:Python33libtkinter__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 regardé 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 ignore le iconbitmap fonction. Mais cela n'explique pas pourquoi il déclenche une erreur!

il y a des façons "hackish" d'éviter ce problème, mais aucune n'est écrite pour Python 3.x.

donc ma dernière question Est: y a-t-il un moyen d'obtenir un icône personnalisée en utilisant Python 3.x et Tkinter?

aussi, ne me dites pas que je devrais utiliser une autre bibliothèque GUI. Je veux que mon programme fonctionne sur toutes les plateformes. Je veux aussi une version codée, pas un py2exe ou sth la solution.

34
demandé sur iCodez 2013-08-30 20:51:37

7 réponses

Vous ne devez pas avoir favicon.ico dans le même dossier que le script ou, à savoir, sur votre chemin. Mettre dans le chemin d'accès complet. Par exemple, cela fonctionne:

from tkinter import *
root = Tk()

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

Mais ce coups avec la même erreur:

from tkinter import *
root = Tk()

root.iconbitmap('py.ico')
root.mainloop()
37
répondu iCodez 2013-08-30 17:27:50

aucune façon ce qui est suggéré ici ne fonctionne - l'erreur "bitmap xxx Non défini" est toujours présente. Et oui, j'ai mis le chemin correct.

Qu'il travail est celle-ci:

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

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

il est difficile de comprendre comment cela fonctionne (je l'ai copié sans honte de fedoraforums) mais ça marche

12
répondu alessandro 2017-04-24 12:18:52
#!/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()

cela devrait fonctionner comme ça !

1
répondu Malek B. 2016-01-13 09:03:35

cela fonctionne pour moi avec Python3 sous 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'))
1
répondu user1353 2018-07-21 13:53:14

les deux codes fonctionnent bien avec moi sur python 3.7..... hope travaillera aussi pour vous!--3-->

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

une Autre méthode

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

[*NOTE: - python version-3 fonctionne avec tkinter et sous la version-3 I. e version-2 works with Tkinter]

1
répondu Er M S Dandyan 2018-07-25 09:28:31

assurez-vous que le .ico fichier n'est pas corrompu. J'ai eu la même erreur qui s'est effacée quand j'ai essayé une autre .fichier ico.

0
répondu Daniel 2016-11-03 21:56:30

de Sorte qu'il ressemble root.iconbitmap() ne supporte qu'un répertoire fixe.

sys.argv[0] renvoie le répertoire dans lequel 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'

EDIT:

Le seul problème est que cette méthode ne fonctionne pas sous 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
répondu Josua Robson 2018-06-07 04:27:00