tkinter TclError: ошибка чтения файла растрового изображения

Я пытаюсь установить значок приложения (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"

Что я делаю неправильно?

8 ответов

Решение

Проблема не в коде, а в значке. Я пытался создать xbm с другой программой, кроме Gimp (некоторый редактор иконок KDE), и, хотя она выглядит ужасно уродливо, она показывает значок. Я думаю, мне нужно найти создателя, который дает "понятную" иконку для моей программы на Python.


редактировать

iconbitmap Метод оказался только черно-белым, так что в конце концов он был бесполезен.

После долгих поисков я нашел решение установить цвет иконки приложения для Python 3 (в Linux). Я нашел это здесь:

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

Это старый вопрос, и в Интернете много чего написано об этом, но все это либо неверно, либо неполно, поэтому, приняв его за работу, я подумал, что было бы хорошо записать мой действующий рабочий код здесь.

Во-первых, вам нужно создать значок и сохранить его в двух форматах: Windows "ICO" и Unix "XBM". 64 х 64 - это хороший размер. XBM - это 1-битный формат - пиксели просто включены или выключены, поэтому нет цветов, нет серых. Linux-реализации tkinter принимают только XBM, хотя каждый рабочий стол Linux поддерживает настоящие значки, так что вам просто не повезло. Кроме того, спецификация XBM неоднозначна относительно того, представляют ли "включенные" биты черный или белый, поэтому вам может потребоваться инвертировать 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")

Это позволит вам использовать 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")))

(Поиск каталога программы важен, если вы хотите, чтобы он выполнял поиск test.png в одном месте во всех контекстах. os.path.join это кроссплатформенный способ добавить test.png в каталог программы.)

Если вы измените True на False, он не будет использовать тот же значок для окон, которые не являются основными.

Пожалуйста, дайте мне знать, если это работает на Windows и Mac.

Я попробовал это, и я не мог заставить его работать с Windows 7.

Нашел исправление.

Используйте ответ Джейкоба, но файл должен быть .gif если вы используете мою ОС, (Windows 7) она появляется.

Сделать 64x64 gif с помощью MS Paint, сохранить его, использовать путь к файлу и бинго, работает.

Надеюсь, это поможет вам в кроссплатформенности

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)

Я удивлен, увидев, что это такой старый вопрос без хороших ответов, не в течение восьми лет! Я тоже хочу свою собственную иконку для моей «быстрой» программы tkinter.

Что у меня работает в Linux и Python3:

      #!/usr/bin/env python
import tkinter
from PIL import Image, ImageTk

root = tkinter.Tk()
im = Image.open('junk.png')
photo = ImageTk.PhotoImage(im)
root.wm_iconphoto(True, photo)
root.mainloop()

Ключ, кажется, использует Image и ImageTk. Я не нашел решений, которые работали без них.

Для меня сработало простое использование строки r для преобразования каталога в необработанный текст:

бывший:

app.iconbitmap(введите здесь свой путь)

В моем случае Ubuntu 20.04, python 3.6 (conda), командаiconbitmap(bitmap=icon_path)не удалось с этой ошибкой. В конце концов, я помещаю команду сtry-exceptзаблокировать и все заработало; Я вижу красочное изображение.

Другие вопросы по тегам