web-dev-qa-db-fra.com

tkinter TclError: erreur de lecture du fichier bitmap

J'essaie de définir une icône d'application (python3/tkinter) comme ceci:

Interface()
root.title("Quicklist Editor")
root.iconbitmap('@/home/jacob/.icons/qle_icon.ico')
root.resizable(0, 0)
root.mainloop()

peu importe ce que je fais, je reçois toujours un message d'erreur (inactif) disant:

return self.tk.call('wm', 'iconbitmap', self._w, bitmap)
_tkinter.TclError: error reading bitmap file "/home/jacob/.icons/qle_icon.ico"

Qu'est-ce que je fais mal?

19
Jacob Vlijm

Le problème n'est pas le code, mais l'icône. J'ai essayé de créer un xbm avec un autre programme que Gimp (un éditeur d'icônes de KDE), et bien qu'il semble terriblement laid, il affiche une icône. Je suppose que je dois trouver un créateur qui donne une icône "compréhensible" pour mon programme Python.


Éditer

La méthode iconbitmap s'est avérée être uniquement en noir et blanc, elle était donc inutile après tout.

Après une longue recherche, j'ai trouvé la solution pour définir la couleur de l'icône d'une application pour Python 3 (sous Linux). Je l'ai trouvée ici :

root = Tk()
img = PhotoImage(file='your-icon')
root.tk.call('wm', 'iconphoto', root._w, img)
53
Jacob Vlijm

C'est une vieille question, et il y a beaucoup de choses écrites à ce sujet sur le Web, mais tout cela est soit incorrect, soit incomplet, donc après l'avoir fait fonctionner, j'ai pensé qu'il serait bon d'enregistrer mon code de travail réel ici.

Tout d'abord, vous devrez créer une icône et l'enregistrer sous deux formats: Windows "ico" et Unix "xbm". 64 x 64 est une bonne taille. XBM est un format 1 bit - pixels juste allumés ou éteints, donc pas de couleurs, pas de gris. Les implémentations Linux de tkinter n'acceptent que XBM même si chaque bureau Linux prend en charge de vraies icônes, vous n'avez donc pas de chance. En outre, la spécification XBM est ambiguë quant à savoir si les bits "on" représentent le noir ou le blanc, vous devrez donc peut-être inverser le XBM pour certains bureaux. Gimp est bon pour les créer.

Ensuite, pour mettre l'icône dans votre barre de titre, utilisez ce code (Python 3):

import os
from tkinter import *
from tkinter.ttk import *

root = Tk()
root.title("My Application")
if "nt" == os.name:
    root.wm_iconbitmap(bitmap = "myicon.ico")
else:
    root.wm_iconbitmap(bitmap = "@myicon.xbm")

root.mainloop()
15
Lee Daniel Crocker

J'ai essayé cela et je n'ai pas pu le faire fonctionner avec Windows 7.

Trouvé un correctif.

Utilisez la réponse de Jacob, mais le fichier doit être un .gif si vous utilisez mon système d'exploitation, (Windows 7), il apparaît.

Faire un gif 64x64 en utilisant MS Paint, l'enregistrer, utiliser le chemin du fichier et le bingo, ça marche.

7
Micrified

Cela vous permettra d'utiliser des fichiers PNG sous forme d'icônes et rendra la couleur. Je l'ai testé sur Xubuntu 14.04, 32 bits avec Python 3.4 (root est votre Tk objet):

import sys, os
program_directory=sys.path[0]
root.iconphoto(True, PhotoImage(file=os.path.join(program_directory, "test.png")))

(La recherche du répertoire du programme est importante si vous voulez qu'il recherche test.png au même emplacement dans tous les contextes. os.path.join est un moyen multiplateforme d'ajouter test.png dans le répertoire du programme.)

Si vous changez Vrai en Faux, il n'utilisera pas la même icône pour les fenêtres qui ne sont pas les principales.

Veuillez me faire savoir si cela fonctionne sur Windows et Mac.

5
Shule

J'espère que cela vous aide pour la capacité multiplateforme

LOGO_PATH="pic/logo.ico"
LOGO_LINUX_PATH="@pic/logo_1.xbm"  #do not forget "@" symbol and .xbm format for Ubuntu 
root = Tk()
    if detect_screen_size().detect_os()=="Linux":
        root.iconbitmap(LOGO_LINUX_PATH)
    else:
        root.iconbitmap(LOGO_PATH)
0
ashwin ram kumar