iconbitmap tkinter python 3
Establecer icono de ventana (7)
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]
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é con 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 la función iconbitmap
. ¡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 solución py2exe
o sth
.
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.
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.
Lo que funcionó es esto:
imgicon = PhotoImage(file=os.path.join(sp,''myicon.gif''))
root.tk.call(''wm'', ''iconphoto'', root._w, imgicon)
donde sp
es la ruta del script, y rootee la ventana raíz de Tk.
Es difícil entender cómo funciona (lo copié descaradamente de fedoraforums ) pero funciona
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''))
No debe tener favicon.ico
en la misma carpeta que su script o, concretamente, en su 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()
Por lo tanto, parece que 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]
''''
>>>
#!/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í!