Установить значок tkinter в Mac OS - PullRequest
0 голосов
/ 16 октября 2018

Я пытаюсь изменить значок, который появляется в моем приложении tk для Mac OS.Последний раз, когда я проверял этот код, работал для Windows.Цель состоит в том, чтобы это решение работало на всех платформах.

root = tk.Tk()
app = Application(master=root)

app.master.iconbitmap("my_icon.ico")

app.mainloop()

Код добавляет значок по умолчанию для файла .pdf, который не соответствует моему предназначению.Путь к my_icon.ico правильный.Почему это не работает для Mac OS?Есть ли окончательное решение, которое будет работать кроссплатформенно?

Ответы [ 3 ]

0 голосов
/ 22 октября 2018

Согласно документации tk tcl вы можете попробовать wm iconphoto.Похоже, что он может поддерживать OSX, а также упоминает установить размер файла около 512x512 для плавного рендеринга в MAC.

У меня нет MAC, поэтому я не могу проверить это, но сделаю попытку и дайте мне знать, еслиэто помогло.

Обновление:

Как отметил @ l'L'l, вы можете попробовать root.iconphoto(True, img).Я не могу проверить его сам из-за отсутствия Mac.

import tkinter as tk

root = tk.Tk()
img = tk.Image("photo", file="icon.gif")
# root.iconphoto(True, img) # you may also want to try this.
root.tk.call('wm','iconphoto', root._w, img)

root.mainloop()

Вот соответствующий текст из документации здесь :

wm iconphoto window?-дефолт?изображение1? изображение2 ...?Устанавливает значок заголовка окна на основе именованных фотоизображений.Если указан -default, он также применяется ко всем созданным в будущем уровням.Данные на изображениях принимаются в качестве моментального снимка во время вызова.Если изображения впоследствии изменяются, это не отражается на значках заголовка.Допускается использование нескольких изображений, чтобы можно было предоставлять изображения разных размеров (например, 16x16 и 32x32).Диспетчер окон может масштабировать предоставленные значки до соответствующего размера.В Windows изображения упакованы в структуру значков Windows.Это переопределит ico, указанный для wm iconbitmap, и наоборот.

В X изображения упорядочены в свойство _NET_WM_ICON X, которое поддерживается большинством современных оконных менеджеров.Wm iconbitmap может существовать одновременно.Рекомендуется использовать не более двух значков, располагая сначала значок большего размера.

На Macintosh первое вызываемое изображение загружается в собственный формат значков OSX и становится значком приложения в диалоговых окнах, Dock.и другие контексты.На уровне сценария команда примет только первое изображение, переданное в параметрах, поскольку поддержка нескольких размеров / разрешений в macOS выходит за рамки Tk.Разработчики должны использовать самый большой значок, который они могут поддерживать (предпочтительно 512 пикселей), чтобы обеспечить плавный рендеринг на Mac.

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

Если приведенные выше документы точны, они также должны работать на MAC.

enter image description here

0 голосов
/ 06 марта 2019

Если вы используете Mac OS, вам нужно использовать изображение .icns вместо .ico.

вы можете использовать:

from tkinter import Tk
from platform import system

platformD = system()
if platformD == 'Darwin':

    logo_image = 'images/logo.icns'

elif platformD == 'Windows':

    logo_image = 'images/logo.ico'

else:

    logo_image = 'images/logo.xbm'

root = Tk()
root.title("My App")
root.iconbitmap(logo_image)
root.resizable(0, 0)
root.mainloop()

0 голосов
/ 16 октября 2018

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

Вы можете использовать py2app.

Py2app превратит вашу программу в .app, что означает, что она запускается как приложение (потому что оноявляется).При использовании tkinter это обычно то, что вы хотите в конце, потому что GUI обычно превращаются в приложения для простоты использования.Вы можете прочитать документацию по py2app здесь или прочитать неофициальное, но более понятное (на мой взгляд) руководство здесь .Я также подведу итог, как выполнить процесс.

Первая установка py2app: введите это в командной строке:

sudo pip install -U py2app

В случае успеха вы должны получить py2app.Если нет, то одной из проблем может быть то, что у вас нет pip.Вы можете скачать его с помощью другой команды:

sudo easy_install pip

Шаг первый: Создайте файл с именем setup.py в том же словаре, что и программа.

Шаг второй: Поместите это в файл.

from setuptools import setup

#APP would be the name of the file your code is in.
APP = ['example.py']
DATA_FILES = []
#The Magic is in OPTIONS.
OPTIONS = {
    'argv_emulation': False,
    'iconfile': 'app.icns', #change app.icns to the image file name!!!
    }

setup(
    app=APP,
    name='Your app’s name', #change to anything
    data_files=DATA_FILES,
    options={'py2app': OPTIONS},
    setup_requires=['py2app'],
)

Шаг 3: Затем откройте терминал bash в словаре, в котором находится файл, и введите следующую команду:

python setup.py py2app -A

-A заставляет приложение отвечать на обновления вкод, но делает приложение недоступным.Когда вы закончите разработку, повторите команду, на этот раз без -A, например:

python setup.py py2app

Примечание: вам может понадобиться использовать команду python3 setup.py py2... вместо python setup.py py2... для питона3 py2app.

Шаг 4. Перейдите к the dictionary your code is in/dist.В этой папке будет ваше приложение.(Папка dist должна была быть создана на третьем этапе при запуске команды)

Для пользователей Windows: py2app не то, что следует использовать, вместо этого используйте py2exe .

...