tkinter TclError:读取位图文件时出错

Jac*_*ijm 18 icons tkinter launcher python-3.x

我试图像这样设置一个应用程序图标(python3/tkinter):

Interface()
root.title("Quicklist Editor")
root.iconbitmap('@/home/jacob/.icons/qle_icon.ico')
root.resizable(0, 0)
root.mainloop()
Run Code Online (Sandbox Code Playgroud)

无论我做什么,我都会收到一条错误消息(闲置),说:

return self.tk.call('wm', 'iconbitmap', self._w, bitmap)
_tkinter.TclError: error reading bitmap file "/home/jacob/.icons/qle_icon.ico"
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么?

Jac*_*ijm 53

问题不是代码,而是图标.我尝试xbm使用另一个程序创建一个比Gimp(一些KDE图标编辑器),虽然它看起来很可怕,但它确实显示了一个图标.我想我必须找到一个为我的Python程序提供"可理解"图标的创建者.


编辑

iconbitmap方法被证明只能是黑白的,所以它毕竟是无用的.

经过长时间的搜索,我找到了为Python 3设置应用程序图标颜色的解决方案(在Linux上).我在这里找到:

root = Tk()
img = PhotoImage(file='your-icon')
root.tk.call('wm', 'iconphoto', root._w, img)
Run Code Online (Sandbox Code Playgroud)

  • 也适用于Python2.7!几天以来我一直在寻找这个.谢谢 (2认同)
  • Tkinter.PhotoImage的文档说它只接受gif或PPM / PGM格式的图像。在Linux机器上,它适用于`.gif`,但不适用于`.png`。 (2认同)
  • 也适用于带有“.png”的 Windows。使用PIL枕头-2.5.1-win32-py27。 (2认同)
  • 您应该使用 `root.iconphoto(True, img)`,而不是调用 tk。 (2认同)

Lee*_*ker 15

这是一个古老的问题,网上有很多关于它的东西,但是所有这些都是不正确或不完整的,所以让它开始工作我认为在这里记录我的实际工作代码会很好.

首先,您需要创建一个图标并将其保存为两种格式:Windows"ico"和Unix"xbm".64 x 64是一个很好的尺寸.XBM是1位格式 - 像素只是打开或关闭,所以没有颜色,没有灰色.tkinter的Linux实现只接受XBM,即使每个Linux桌面都支持真实图标,所以你只是运气不好.此外,XBM规范对于"on"位是表示黑色还是白色是不明确的,因此您可能必须将某些桌面的XBM反转.Gimp很适合创造这些.

然后将图标放在标题栏中,使用此代码(Python 3):

import os
from tkinter import *
from tkinter.ttk import *

root = Tk()
root.title("My Application")
if "nt" == os.name:
    root.wm_iconbitmap(bitmap = "myicon.ico")
else:
    root.wm_iconbitmap(bitmap = "@myicon.xbm")

root.mainloop()
Run Code Online (Sandbox Code Playgroud)

  • 这是什么鬼,这就是现实生活吗?Linux 上的 Tk 只支持垃圾图标?另外,它不支持原生 Gtk 或 qt 小部件。怎么会有人认真对待它作为一个 GUI 库呢? (2认同)

Mic*_*ied 7

我试过这个,我无法使用Windows 7工作.

找到了解决办法.

使用雅各布的答案,但文件必须是 .gif如果您正在使用我的操作系统,则(Windows 7).

使用MS绘制一个64x64 gif,保存它,使用文件路径和宾果游戏,工作.


Shu*_*ule 5

这将允许您将PNG文件用作图标,并且它确实呈现颜色.我在Xubuntu 14.04上测试了它,32位用Python 3.4(root是你的Tk对象):

import sys, os
program_directory=sys.path[0]
root.iconphoto(True, PhotoImage(file=os.path.join(program_directory, "test.png")))
Run Code Online (Sandbox Code Playgroud)

(如果要test.png在所有上下文中的相同位置搜索,查找程序目录很重要.os.path.join是一种跨平台的方式添加test.png到程序目录中.)

如果将True更改为False,则不会对不是主窗口的窗口使用相同的图标.

如果这适用于Windows和Mac,请告诉我.