Pregunta Establecer icono de ventana


Cuando traté de cambiar el ícono de la ventana en la esquina superior izquierda del feo rojo "TK" a mi propio favicon usando el siguiente código, Python lanzó un error:

from tkinter import *
root = Tk()

#some buttons, widgets, a lot of stuff

root.iconbitmap('favicon.ico')

Esto debería establecer el ícono a 'favicon.ico' (según muchas publicaciones del foro en toda la web). Pero desafortunadamente, todo lo que esta línea hace es arrojar el siguiente error:

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

Lo que ya hice

  • Revisé el camino - todo es 100% correcto
  • Probé otros formatos de archivo como .png o .bmp - ninguno funcionó
  • Busqué este problema en muchos sitios web

Y para el tercer punto, effbot.org, mi sitio favorito sobre Tkinter, me dijo que Windows ignora el iconbitmap función. ¡Pero esto no explica por qué arroja un error!

Hay algunas formas "hackish" para evitar ese problema, pero ninguno de ellos está escrito para Python 3.x.

Entonces mi última pregunta es: ¿hay alguna forma de obtener un icono personalizado usando Python 3.xy Tkinter?

Además, no me digas que debería usar otra biblioteca GUI. Quiero que mi programa funcione en todas las plataformas. También quiero una versión codificada, no una py2exe o sth solución.


32
2017-08-30 16:51


origen


Respuestas:


No debes tener favicon.ico en la misma carpeta que tu script o, concretamente, en tu ruta. Ponga la ruta completa. Por ejemplo, esto funciona:

from tkinter import *
root = Tk()

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

Pero esto explota con tu mismo error:

from tkinter import *
root = Tk()

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

34
2017-08-30 17:27



De ninguna manera lo que aquí se sugiere funciona: el error "bitmap xxx no definido" siempre está presente. Y sí, establecí el camino correcto para ello.

Que es hizo el trabajo es este:

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

dónde sp es la ruta de script, y root la ventana raíz de Tk.

Es difícil entender cómo funciona (lo copié descaradamente de fedoraforums) pero funciona


10
2018-04-24 12:18



#!/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()

¡debería funcionar así!


1
2018-01-13 08:45



Esto funciona para mí con Python3 en 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
2017-07-21 13:53



Ambos códigos funcionan bien conmigo en python 3.7 ... la esperanza también te servirá

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

y no olvides mantener "myfavicon.ico" en la misma carpeta donde está presente tu archivo de script de proyecto

Otro método

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

[* NOTA: - Python versión-3 funciona con tkinter y debajo de la versión-3, es decir, la versión-2 funciona con Tkinter]


1
2017-07-25 09:16



Asegúrese de que el archivo .ico no esté dañado también. Obtuve el mismo error que desapareció cuando probé un archivo .ico diferente.


0
2017-11-03 21:56



Entonces parece root.iconbitmap() solo admite un directorio fijo.
  sys.argv[0] devuelve el directorio desde el que se leyó el archivo, por lo que un código simple funcionaría para crear un directorio fijo.

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

Esta es la salida

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

EDITAR:
El único problema es que este método no funciona en 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
2017-12-24 05:44