【问题标题】:tkinter TclError: error reading bitmap filetkinter TclError:读取位图文件时出错
【发布时间】:2012-06-25 23:01:02
【问题描述】:

我正在尝试像这样设置应用程序图标(python3 / tkinter):

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

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

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

我做错了什么?

【问题讨论】:

  • 我相信 .ico 文件对此不起作用(至少在 linux 上)。尝试改用.xbm.xpm 文件。
  • ...谢谢!不幸的是也没有用,也试过 .png
  • @Jacob 愚蠢的问题:你的图标实际上是在 /home/jacob/.icons/qle_icon.ico 吗? ;)
  • @gary 绝对不是一个愚蠢的问题,我检查了几次,因为当事情不起作用时,人们开始怀疑自己......

标签: python-3.x icons tkinter launcher


【解决方案1】:

问题不在于代码,而在于图标。我尝试使用 Gimp(一些 KDE 图标编辑器)以外的另一个程序创建一个 xbm,虽然它看起来非常丑陋,但它确实显示了一个图标。 我想我必须找到一个为我的 Python 程序提供“可理解”图标的创建者。


编辑

iconbitmap 方法原来是黑白的,所以根本没用。

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

root = Tk()
img = PhotoImage(file='your-icon')
root.tk.call('wm', 'iconphoto', root._w, img)

【讨论】:

  • 也适用于 Python2.7 !几天以来我一直在寻找这个。谢谢
  • 我正在尝试这样做,但我得到了这个'Traceback(最近一次调用最后):文件“C:\Python27\Calc.pyw”,第 58 行,在 img = PhotoImage(file ='icon!.ico') 文件 "C:\Python27\lib\lib-tk\Tkinter.py",第 3244 行,在 init Image.__init__(self, 'photo', name, cnf, master, **kw) 文件“C:\Python27\lib\lib-tk\Tkinter.py”,第 3200 行,在 init self.tk.call(('image', ' create', imgtype, name,) + options) TclError: could not identify data in image file "icon!.ico"'
  • Tkinter.PhotoImage 的文档说它只接受gifPPM/PGM 格式的图像。在 linux 机器上,它对我有用 .gif,但不是 .png
  • 也可以在带有.png 的窗口上工作。使用 PIL 枕头 2.5.1-win32-py27。
  • 你应该使用root.iconphoto(True, img),而不是调用tk。
【解决方案2】:

这是一个老问题,网上有很多关于它的文章,但所有内容要么不正确,要么不完整,所以在开始工作后,我认为记录下我的实际工作代码会很好在这里。

首先,您需要创建一个图标并将其保存为两种格式: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()

【讨论】:

  • 什么鬼,这是真实的生活吗? Tk on Linux 只支持垃圾图标?作为奖励,它不支持原生 Gtk 或 qt 小部件。有人应该如何认真对待它作为一个 GUI 库?
  • 你必须给我一大堆比这更多的信息。喜欢把我指向你的代码和你的图标文件。
【解决方案3】:

这将允许您使用 PNG 文件作为图标,并且它会渲染颜色。我使用 Python 3.4 在 Xubuntu 14.04、32 位上对其进行了测试(root 是您的 Tk 对象):

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

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

如果您将 True 更改为 False,那么它不会对非主窗口使用相同的图标。

请让我知道这是否适用于 Windows 和 Mac。

【讨论】:

    【解决方案4】:

    我试过了,但在 Windows 7 上我无法让它工作。

    找到了解决办法。

    使用 Jacob 的答案,但如果您使用的是我的操作系统(Windows 7),文件必须是 .gif

    使用 MS Paint 制作 64x64 的 gif,保存,使用文件路径和宾果游戏,就可以了。

    【讨论】:

      【解决方案5】:

      我希望这对你的跨平台能力有所帮助

      LOGO_PATH="pic/logo.ico"
      LOGO_LINUX_PATH="@pic/logo_1.xbm"  #do not forget "@" symbol and .xbm format for Ubuntu 
      root = Tk()
          if detect_screen_size().detect_os()=="Linux":
              root.iconbitmap(LOGO_LINUX_PATH)
          else:
              root.iconbitmap(LOGO_PATH)
      

      【讨论】:

        【解决方案6】:

        只需使用 r 字符串将目录转换为对我有用的原始文本:

        例如:

        app.iconbitmap(r'在此处输入你的路径')

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2016-04-09
          • 2020-11-04
          • 2022-01-04
          • 2018-10-05
          • 1970-01-01
          • 1970-01-01
          • 2020-07-28
          相关资源
          最近更新 更多