Установить значок окна
Когда я попытался изменить значок окна в верхнем левом углу с ужасного красного "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')