设置窗口图标

时间:2013-08-30 16:51:38

标签: python windows-7 python-3.x tkinter favicon

当我尝试使用下面的代码将丑陋的红色“TK”左上角的窗口图标更改为我自己的图标时,Python发出错误:

from tkinter import *
root = Tk()

#some buttons, widgets, a lot of stuff

root.iconbitmap('favicon.ico')

这应该将图标设置为'favicon.ico'(根据网络上的很多论坛帖子)。但遗憾的是,所有这一行都会引发以下错误:

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

我已经做了什么:

  • 我检查了路径 - 一切都是100%正确
  • 我尝试了其他文件格式,例如.png.bmp - 无效
  • 我在很多网站上看到了这个问题

第三点,我最喜欢的关于Tkinter的网站effbot.org告诉我,Windows忽略了iconbitmap功能。 但这并不能解释为什么会抛出错误!

有一些“hackish”方法可以避免这个问题,但是没有一种是为Python 3.x编写的。

所以我的最后一个问题是:有没有办法使用Python 3.x和Tkinter获取自定义图标?

另外,不要告诉我应该使用另一个GUI库。我希望我的程序能够在每个平台上运行。我还想要一个编码版本,而不是py2exesth解决方案。

13 个答案:

答案 0 :(得分:45)

您不得将favicon.ico与脚本放在同一文件夹中,也就是说,在路径上。输入完整的路径名。例如,这有效:

from tkinter import *
root = Tk()

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

但这会引发同样的错误:

from tkinter import *
root = Tk()

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

答案 1 :(得分:17)

这里建议的方法无效 - 错误“位图xxx未定义”始终存在。是的,我设置了正确的路径。

所做的工作是:

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

其中sp是脚本路径,root是Tk根窗口。

很难理解它是如何工作的(我无耻地从fedoraforums复制它)但是它有效

答案 2 :(得分:2)

这对Linux上的Python3来说适用:

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'))

答案 3 :(得分:1)

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

它应该像这样工作!

答案 4 :(得分:1)

这两个代码在python 3.7上都可以正常工作.....希望同样适用于你

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

并且不要忘记将“ myfavicon.ico”保留在项目脚本文件所在的文件夹中

另一种方法

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

[*注意:-python版本3适用于tkinter,低于版本3,即版本2适用于Tkinter]

答案 5 :(得分:1)

也卡住了...

最后使用以下代码成功设置了我想要的图标:

from tkinter import *
root.tk.call('wm', 'iconphoto', root._w, PhotoImage(file='resources/icon.png'))

答案 6 :(得分:1)

我也有同样的问题,但是我找到了解决方法。

root.mainloop()

from tkinter import *
    
# must add
root = Tk()
root.title("Calculator")
root.iconbitmap(r"image/icon.ico")
    
root.mainloop()

在该示例中,python需要的是一个图标文件,因此当您将图标下载为.png时将无法正常工作,因为它需要一个.ico文件。因此,您需要找到将图标从png转换为ico的转换器。

答案 7 :(得分:1)

尝试一下:

from tkinter import *
import os
import sys

root = Tk()
root.iconbitmap(os.path.join(sys.path[0], '<your-ico-file>'))

root.mainloop()

注意:<your-ico-file>替换为您正在使用的ico文件的名称,否则它将无法正常工作。

我已经在Python 3中进行了尝试。

答案 8 :(得分:0)

确保.ico文件也没有损坏。当我尝试使用不同的.ico文件时,我得到了同样的错误。

答案 9 :(得分:0)

所以看起来root.iconbitmap()只支持固定目录。
sys.argv[0]返回从中读取文件的目录,因此一个简单的代码可用于创建固定目录。

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

这是输出

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

修改:
唯一的问题是这种方法不适用于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]
''
>>>

答案 10 :(得分:0)

from tkinter import *
from PIL import ImageTk, Image

Tk.call('wm', 'iconphoto', Tk._w, ImageTk.PhotoImage(Image.open('./resources/favicon.ico')))

以上对我有用。

答案 11 :(得分:0)

我最近遇到了这个问题,没有找到任何非常相关的答案,所以我决定为此设立一个SO帐户。

解决方案1:在线转换.ico文件,那里有很多站点

解决方案2:在Photoshop中转换.ico文件

如果您或您的编辑器刚刚将图像文件重命名为*.ico,那么它将无法正常工作。
如果您从Windows / OS文件夹中看到图像图标,则说明该图标正常工作

答案 12 :(得分:0)

我使用的是 Visual Studio Code。要使“favicon.ico”工作,您需要指定您在哪个文件夹中工作。

  • 你按下 ctrl + shift + p 打开终端 cmd+shift+{{1 }} 在 OSX 上。
  • 在终端中,您输入:cd + 您正在工作的路径。例如:cd C:\User\Desktop\MyProject