Установить значок окна

Когда я попытался изменить значок окна в верхнем левом углу с ужасного красного "TK" на свой собственный значок, используя код ниже, Python выдал ошибку:

from tkinter import *
root = Tk()

#some buttons, widgets, a lot of stuff

root.iconbitmap('favicon.ico')

Это должно установить иконку '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

Что я уже сделал:

  • Я проверил путь - все на 100% правильно
  • Я пробовал другие форматы файлов, такие как .png или же .bmp - никто не работал
  • Я посмотрел эту проблему на многих сайтах

И в-третьих, effbot.org, мой любимый сайт о Tkinter, сказал мне, что Windows игнорирует iconbitmap функция. Но это не объясняет, почему выдает ошибку!

Есть несколько "хакерских" способов избежать этой проблемы, но ни один из них не написан для Python 3.x.

Итак, мой последний вопрос: есть ли способ получить пользовательский значок, используя Python 3.x и Tkinter?

Кроме того, не говорите мне, что я должен использовать другую библиотеку GUI. Я хочу, чтобы моя программа работала на любой платформе. Я также хочу кодированную версию, а не py2exe или же sth решение.

14 ответов

Решение

Вы не должны иметь favicon.ico in the same folder as your script or, namely, on your path. Put in the full pathname. Например, это работает:

from tkinter import *
root = Tk()

root.iconbitmap(r'c:\Python32\DLLs\py.ico')
root.mainloop()

But this blows up with your same error:

from tkinter import *
root = Tk()

root.iconbitmap('py.ico')
root.mainloop()

То, что здесь предлагается, никоим образом не работает - ошибка "битовая карта не определена" присутствует всегда. И да, я установил правильный путь к нему.

Что это сработало, так это:

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

где sp путь к сценарию, и root корневое окно Tk.

Трудно понять, как это работает (я беззастенчиво скопировал это из fedoraforums), но это работает

Это работает для меня с Python3 на Linux:

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'))

Застрял на этом тоже...

Наконец удалось установить значок, который я хотел, используя следующий код:

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

У меня тоже была такая же проблема, но я нашел решение.

root.mainloop()

from tkinter import *
    
# must add
root = Tk()
root.title("Calculator")
root.iconbitmap(r"image/icon.ico")
    
root.mainloop()

В этом примере питону нужен файл значка, поэтому при загрузке значка как .png это не сработает, потому что ему нужен .icoфайл. Итак, вам нужно найти конвертеры, чтобы преобразовать вашу иконку изpng к ico.

Попробуй это:

from tkinter import *
import os
import sys

root = Tk()
root.iconbitmap(os.path.join(sys.path[0], '<your-ico-file>'))

root.mainloop()

Примечание: заменить<your-ico-file> с именем используемого файла ico, иначе он не сработает.

Я пробовал это на Python 3. Это сработало.

Убедитесь, что файл.ico также не поврежден. Я получил ту же ошибку, которая исчезла, когда я попробовал другой файл.ico.

#!/usr/bin/env python
import tkinter as tk

class AppName(tk.Frame):
    def __init__(self, master=None):
        tk.Frame.__init__(self, master)
        self.grid()
        self.createWidgets()

    def createWidgets(self):
        self.quitButton = tk.Button(self, text='Quit', command=self.quit)
        self.quitButton.grid()

app = AppName()
app.master.title('Title here ...!')
app.master.iconbitmap('icon.ico')
app.mainloop()

это должно работать так!

from tkinter import *
from PIL import ImageTk, Image

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

Вышеуказанное сработало для меня.

Оба кода работают со мной на Python 3.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]

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

Решение 1. Преобразуйте свой .ico Файл в Интернете есть много сайтов там

Решение 2: преобразовать .ico Файл в фотошопе

Если вы или ваш редактор только что переименовали файл изображения в *.icoтогда это не сработает.
Если вы видите значок изображения из папки Windows/OS, значит, он работает.

Я использую Visual Studio Code. Чтобы "favicon.ico" заработал, вам нужно указать, в какой папке вы работаете.

  • Вы нажимаете ctrl+ shift+, pчтобы открыть терминал cmd+ shift+ p на OSX.
  • В терминале вы вводите: cd + путь, по которому вы работаете. Например: cd C:\User\Desktop\MyProject

Так выглядит 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]
''
>>>

СНАЧАЛА КОНВЕРТИРУЙТЕ ФАЙЛ ИЗОБРАЖЕНИЯ В ФОТОИЗОБРАЖЕНИЕ

img = PhotoImage(file='your-icon')

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