Подтвердить что ты не робот

Значок окна установки

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

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

4b9b3361

Ответ 1

У вас не должно быть favicon.ico в той же папке, что и ваш script или, а именно, на вашем пути. Поместите полный путь. Например, это работает:

from tkinter import *
root = Tk()

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

Но это взрывается с той же ошибкой:

from tkinter import *
root = Tk()

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

Ответ 2

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

Что он сделал, это:

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

где sp - путь script, а root - корневое окно Tk.

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

Ответ 3

Это работает для меня с 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'))

Ответ 4

#!/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()

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

Ответ 5

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

Ответ 6

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

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

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

Ответ 7

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

Ответ 8

Таким образом, похоже, что 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

[email protected]:~ $ 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]
''
>>>

Ответ 9

from tkinter import *
from PIL import ImageTk, Image

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

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