58

当我尝试使用下面的代码将左上角的窗口图标从丑陋的红色“TK”更改为我自己的 favicon 时,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解决方案。

4

14 回答 14

61

您需要与favicon.ico脚本在同一文件夹或字典中,因为 python 仅在当前字典中搜索,或者您可以输入完整路径名。例如,这有效:

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()
于 2013-08-30T17:27:50.210 回答
21

此处建议的任何方法都行不通 - 错误“位图 xxx 未定义”永远存在。是的,我设置了正确的路径。

它的作用是这样的:

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

sp脚本路径和rootTk 根窗口在哪里。

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

于 2017-04-24T12:18:52.217 回答
10

这适用于我在 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'))
于 2018-07-21T13:53:14.573 回答
2

也被卡住了...

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

from tkinter import *
root.tk.call('wm', 'iconphoto', root._w, PhotoImage(file='resources/icon.png'))
于 2019-03-30T14:03:24.797 回答
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()

它应该像这样工作!

于 2016-01-13T08:45:33.720 回答
1

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

于 2016-11-03T21:56:30.780 回答
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 一起使用]

于 2018-07-25T09:16:35.667 回答
1

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

root.mainloop()

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

在这个例子中,python 需要的是一个图标文件,所以当你下载一个图标时.png它不起作用,因为它需要一个.ico文件。因此,您需要找到转换器将您的图标pngico.

于 2020-04-25T10:41:17.897 回答
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 中尝试过了。它奏效了。

于 2020-06-05T19:25:43.607 回答
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]
''
>>>
于 2017-12-24T05:44:01.090 回答
0
from tkinter import *
from PIL import ImageTk, Image

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

以上对我有用。

于 2019-04-11T22:55:16.807 回答
0

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

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

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

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

于 2020-09-14T07:49:52.847 回答
0

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

  • 您按ctrl+ shift+打开OSX 上p的终端cmd+ shift+ 。p
  • 在终端中,您键入:cd + 您正在工作的路径。例如:cd C:\User\Desktop\MyProject
于 2021-01-15T15:10:54.810 回答
0

首先将您的图像文件转换为照片图像

img = PhotoImage(file='your-icon')

于 2022-02-19T00:15:03.690 回答