设置窗口图标

Cru*_*xel 46 python tkinter windows-7 python-3.x tkinter.iconbitmap

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

from tkinter import *
root = Tk()

#some buttons, widgets, a lot of stuff

root.iconbitmap('favicon.ico')
Run Code Online (Sandbox Code Playgroud)

这应该将图标设置为'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
Run Code Online (Sandbox Code Playgroud)

我已经做了什么:

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

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

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

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

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

iCo*_*dez 52

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

from tkinter import *
root = Tk()

root.iconbitmap(r'c:\Python32\DLLs\py.ico')
root.mainloop()
Run Code Online (Sandbox Code Playgroud)

但这会引发同样的错误:

from tkinter import *
root = Tk()

root.iconbitmap('py.ico')
root.mainloop()
Run Code Online (Sandbox Code Playgroud)

  • 我已经使用了`os.path`和其中包含的函数来获取.ico图标文件(肯定存在)的完整路径,但它*仍然*给了我一个错误的回溯:_tkinter.TclError:bitmap"/ usr/local/src/py/project/media/Question-Shield.ico"未定义 (6认同)
  • 伙计,你很棒(或者我有点愚蠢).只剩下一个问题了吗?是否有可能动态加载路径而不是固定路径?因为这会给我更多的自由:) (3认同)
  • 动态路径选项对我有用。我正在使用 Python 3.4.3。我想知道您是否可以通过导入操作系统模块并使用“root.iconbitmap(os.path.abspath('py.ico'))”来绕过该错误? (2认同)

ale*_*dro 19

这里没有办法建议 - 错误"位图xxx未定义"永远存在.是的,我设置了正确的路径.

所做的工作是这样的:

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

sp脚本路径在哪里,以及rootTk根窗口.

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


小智 6

这适用于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'))
Run Code Online (Sandbox Code Playgroud)