Python 为什么不是';设置窗口时定义的t.ico文件';s图标?

Python 为什么不是';设置窗口时定义的t.ico文件';s图标?,python,python-3.x,tkinter,windows-7,tkinter.iconbitmap,Python,Python 3.x,Tkinter,Windows 7,Tkinter.iconbitmap,当我试图使用下面的代码将左上角的窗口图标从难看的红色“TK”更改为我自己的favicon时,Python抛出了一个错误: from tkinter import * root = Tk() #some buttons, widgets, a lot of stuff root.iconbitmap('favicon.ico') 这应该将图标设置为“favicon.ico”(根据网络上的许多论坛帖子)。但不幸的是,这行所做的只是抛出以下错误: 回溯(最近一次呼叫最后一次): 文件“d:\la

当我试图使用下面的代码将左上角的窗口图标从难看的红色“TK”更改为我自己的favicon时,Python抛出了一个错误:

from tkinter import *
root = Tk()

#some buttons, widgets, a lot of stuff

root.iconbitmap('favicon.ico')
这应该将图标设置为“favicon.ico”(根据网络上的许多论坛帖子)。但不幸的是,这行所做的只是抛出以下错误:

回溯(最近一次呼叫最后一次):
文件“d:\ladvclient\mainapp.py”,第85行,在
root.iconbitmap(位图='favicon.ico')
文件“C:\Python33\lib\tkinter\\uuuu init\uuuuu.py”,第1637行,在wm_iconbitmap中
返回self.tk.call('wm','iconbitmap',self.\w,位图)
_tkinter.TclError:未定义位图“favicon.ico”
我已经做了:

  • 我检查了路径-一切都是100%正确的
  • 我尝试了其他文件格式,如
    .png
    .bmp
    ——都不起作用
  • 我在许多网站上查找了这个问题
关于第三点,我最喜欢的Tkinter网站effbot.org告诉我Windows忽略了
iconbitmap
功能。 但这并不能解释为什么它会抛出错误

有一些“黑客”方法可以避免这个问题,但没有一种是为Python3.x编写的

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


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

您需要将
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()

它应该是这样工作的

确保.ico文件也没有损坏。当我尝试另一个.ico文件时,出现了相同的错误。

此处建议的方法不起作用-错误“位图xxx未定义”始终存在。是的,我为它设定了正确的路径

它所起的作用是:

imgicon = PhotoImage(file=os.path.join(sp,'myicon.gif'))
root.tk.call('wm', 'iconphoto', root._w, imgicon)  
其中,
sp
是脚本路径,
root
是Tk 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]
''
>>>

这对我在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'))

这两个代码在Python3.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一起使用]

在这一点上也被卡住了

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

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

上述方法对我很有效。

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

root.mainloop()
从tkinter导入*
#必须加上
root=Tk()
root.title(“计算器”)
root.iconbitmap(r“image/icon.ico”)
root.mainloop()
在本例中,python需要的是一个图标文件,因此当您将图标作为
.png
加载时,它将无法工作,因为它需要一个
.ico
文件。因此,您需要找到转换器,将图标从
png
转换为
ico

试试以下方法:

从tkinter导入*
导入操作系统
导入系统
root=Tk()
root.iconbitmap(os.path.join(sys.path[0],“”))
root.mainloop()
注意:用您正在使用的ico文件名替换
,否则它将无法工作


我在Python3中尝试过这一点。它起作用了。

我最近遇到了这个问题,并且没有发现任何与此相关的答案,所以我决定对此做出解释

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

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

如果您或您的编辑器刚刚将图像文件重命名为
*.ico
,那么它将无法工作。

如果您看到Windows/OS文件夹中的图像图标,则它正在工作

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

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

是否在运行脚本的文件夹中?另一方面,你必须提供完整的路径。另外,当你可以做的另一件事是将格式更改为
.gif
,我认为这是tkinter唯一接受的格式。@enginefree-No.tkinter也接受
.ico
。伙计,你很棒(或者我只是有点笨)。只剩下一个问题了?动态加载路径而不是固定路径是否容易?因为这会给我更多的自由:)@crushedpoixel-你所做的并不愚蠢。事实上,如果favicon.ico在这条路上,它应该会起作用。无论如何,我想您可以使用
os
模块构建一些动态的东西,在某些目录中查找
.ico
文件。但是,这可能会导致您加载错误的图像,这将使您感到尴尬。我的建议是选择您想要的图标,然后将其保留在脚本中。我只需要知道一件事——当我没有指定路径时,Python认为这意味着哪条路径?比如在我告诉Python在哪里搜索之前,Python在我的计算机上搜索了“favicon.ico”吗?我使用了
os.path
from tkinter import *
root.tk.call('wm', 'iconphoto', root._w, PhotoImage(file='resources/icon.png'))
from tkinter import *
from PIL import ImageTk, Image

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