Используйте файл как объекты для Tk (). Iconbitmap () - PullRequest
1 голос
/ 18 ноября 2010

Я пишу программу с использованием Tkinter, которая должна быть в конечном итоге скомпилирована в исполняемый файл с использованием py2exe.Я хочу включить значок для использования на окнах.Он будет таким же, как я упаковал в качестве иконки для exe.Есть ли способ включить значок в Tkinter, либо находя exe-файл, либо используя файлоподобный объект?Я знаю, что win32api может найти текущий исполняемый файл exe, но я считаю, что py2exe извлекает исходный файл в temp, а затем запускает его, поэтому исходный exe не может быть найден таким образом.Я также подумал о том, чтобы поместить его во включаемую папку, но я не знаю, правильно ли будет установлен cwd для этого.Заранее спасибо за помощь!

Ответы [ 2 ]

3 голосов
/ 18 ноября 2010

Tk-изображения имеют опцию -data, которая позволяет встроить изображение в код.Вам просто нужно base64-кодировать изображение.Я думаю, что изображение должно быть в формате GIF.

Вот рабочий пример:

import Tkinter as tk
root = tk.Tk()
data = '''R0lGODlhIAAgALMAAAAAAAAAgHCAkC6LV76+vvXeswD/ANzc3DLNMubm+v/6zS9P
          T6Ai8P8A/////////yH5BAEAAAkALAAAAAAgACAAAAS00MlJq7046803AF3ofAYY
          fh8GIEvpoUZcmtOKAO5rLMva0rYVKqX5IEq3XDAZo1GGiOhw5rtJc09cVGo7orYw
          YtYo3d4+DBxJWuSCAQ30+vNTGcxnOIARj3eTYhJDQ3woDGl7foNiKBV7aYeEkHEi
          gnKFkk4ciYaImJqbkZ+PjZUjaJOElKanqJyRrJyZgSKkokOsNYa2q7mcirC5I5Fo
          fsK6hcHHgsSgx4a9yzXK0rrV19gRADs=
       '''
img = tk.PhotoImage(data=data)
label = tk.Label(image=img)
label.pack()
root.mainloop()
2 голосов
/ 18 ноября 2010

Вы можете встроить значок в двоичный файл py2exe с параметром icon_resources

setup(windows=[
    {'script':'toto.py', "icon_resources": [(1, "toto.ico")]},
    ],

Затем вы можете получить его с помощью Windows API

import win32gui, win32api, win32con
from ctypes import c_int, windll

hicon = win32gui.CreateIconFromResource(win32api.LoadResource(None, win32con.RT_ICON, 13), True)

и затем прикрепить кокно, если вы знаете его HWND.

windll.user32.SendMessageA(c_int(hwnd), c_int(win32con.WM_SETICON), c_int(win32con.ICON_SMALL), c_int(hicon))

Константа 13, используемая в LoadResource, была найдена с помощью инструмента, подобного ResourceHacker .В ResourceHacker это соответствует имени папки значка.Я не знаю, как он рассчитывается с помощью py2exe, и есть ли способ принудительно установить это значение.

Я также не знаю, существует ли для этого чистый способ TkInter, и если значок может бытьиспользуется как есть в окне tkinter.

Надеюсь, это поможет

...