Перейти к содержимому

Как сделать иконку приложения в python

  • автор:

Как добавить .py файлу иконку?

Makaroshka007

Используйте pyinstaller для компиляции!
В окно терминала:
pyinstaller —onefile —icon=icon.ico main.py
onefile если вам нужен только .exe
Вместо icon.ico путь к вашей заранее выбранной иконке!

Ответ написан более трёх лет назад
Комментировать
Нравится 1 Комментировать
Ответы на вопрос 0
Ваш ответ на вопрос

Войдите, чтобы написать ответ

python

  • Python

Опять коги! Выдаёт ошибку, как её убрать?

  • 1 подписчик
  • 34 минуты назад
  • 30 просмотров

python

  • Python
  • +1 ещё

Как заставить селениум просто открыть страницу и ждать?

  • 1 подписчик
  • 2 часа назад
  • 212 просмотров

PyQt5 иконка для приложения

Пытаюсь установить иконку для приложения.
Именно, чтобы отображалась на панели задач, а не на окне приложения. Всё ни как. Буду благодарен если поможете. main.py:

from PyQt5 import QtGui from PyQt5 import QtWidgets import sys app = QtWidgets.QApplication(sys.argv) app.setWindowIcon(QtGui.QIcon('bug.ico')) window = QtWidgets.QWidget() window.setWindowIcon(QtGui.QIcon('bug.ico')) window.show() sys.exit(app.exec_()) 

введите сюда описание изображения

картинка:

Отслеживать
73.5k 110 110 золотых знаков 38 38 серебряных знаков 55 55 бронзовых знаков
задан 19 мая 2020 в 12:53
177 2 2 серебряных знака 7 7 бронзовых знаков
19 мая 2020 в 13:07
а для виндовс 10 есть ?
19 мая 2020 в 13:48

3 ответа 3

Сортировка: Сброс на вариант по умолчанию

Когда вы запускаете приложение, Windows смотрит на исполняемый файл и пытается угадать, к какой application group оно принадлежит.

По умолчанию все скрипты Python сгруппированы в одну и ту же группу «Python» , поэтому будет отображаться значок Python.

Чтобы это не происходило, нам нужно предоставить Windows другой идентификатор приложения.

Код ниже делает это, вызывая QtWin.setCurrentProcessExplicitAppUserModelID() с пользовательским идентификатором приложения.

import sys from PyQt5 import QtGui from PyQt5 import QtWidgets try: # Включите в блок try/except, если вы также нацелены на Mac/Linux from PyQt5.QtWinExtras import QtWin # . myappid = 'mycompany.myproduct.subproduct.version' # . QtWin.setCurrentProcessExplicitAppUserModelID(myappid) # . except ImportError: pass # .. или так .. # . #import ctypes #myappid = 'mycompany.myproduct.subproduct.version' #ctypes.windll.shell32.SetCurrentProcessExplicitAppUserModelID(myappid) app = QtWidgets.QApplication(sys.argv) app.setWindowIcon(QtGui.QIcon('BLBwO.png')) window = QtWidgets.QWidget() window.setWindowIcon(QtGui.QIcon('BLBwO.png')) window.show() sys.exit(app.exec_()) 

Как в PyQt5 через Qt Designer поменять иконку программы в панели задач компьютера и можно ли запустить программу написанную на python на компьютере без среды разработки для данного языка?

Добрый день! Не подскажите как в PyQt5 через Qt Designer поменять иконку программы в панели задач компьютера и можно ли запустить программу написанную на python на компьютере без среды разработки для данного языка?

Рекомендуем хостинг TIMEWEB

Рекомендуем хостинг TIMEWEB

Стабильный хостинг, на котором располагается социальная сеть EVILEG. Для проектов на Django рекомендуем VDS хостинг.

Подписка на обсуждение 2
Подписка на раздел 43

Вам это нравится? Поделитесь в социальных сетях!

Evgenii Legotckoi

  • Evgenii Legotckoi
  • #
  • 29 октября 2019 г. 10:04

Уточните сразу, под какую операционную систему пишите.
А вообще интерпретатор языка обязательно нужен. Как вариант можно поискать ещё информацию о компиляции программы в бинарник, тогда ещё можно будет наверное обойти проблему установки интерпретатора.

  • Евгений_Канусовский@1981
  • #
  • 29 октября 2019 г. 10:06

Evgenii Legotckoi

  • Evgenii Legotckoi
  • #
  • 29 октября 2019 г. 10:20

Не знаю, насчёт дизайнера, но вы пробовали в коде использовать setWindowIcon?

Ещё я бы погуглил про использование RC_ICONS в PyQt5, очень хорошо бы погуглил, поскольку в первых ссылках я не нашёл адекватной информации об этом.

  • Евгений_Канусовский@1981
  • #
  • 29 октября 2019 г. 10:24

Пробывал, пишет: ModuleNotFoundError: No module named ‘ikona_rc’, хотя он лежит в папке проекта

Evgenii Legotckoi

  • Evgenii Legotckoi → Евгений_Канусовский@1981
  • #
  • 29 октября 2019 г. 10:28

Вам нужно скомпилировать ресурсы, как внешние ресурсы. Думаю, что PyQt5 не компилирует их автоматически.

pyrcc5 ikona.qrc -o ikona_rc.py

  • Евгений_Канусовский@1981
  • #
  • 29 октября 2019 г. 10:35

Evgenii Legotckoi

  • Evgenii Legotckoi → Евгений_Канусовский@1981
  • #
  • 29 октября 2019 г. 10:41

Вот более полный вариант подключения ресурсов в PyQt5

генерируем внешний ресурс из файла ресурсов

pyrcc5 -o resources.py resources.qrc

import resources

Чтобы использовать ресурс в своем коде, вы должны использовать префикс ":/":

Пример. Должно работать примерно таким образом.

from PyQt5.QtCore import * from PyQt5.QtGui import * import resources pixmap = QPixamp(":/newPrefix/download.jpeg")

То есть нужно сначала скомпилировать ресурсник, а потом подключить его в проекте.

  • Евгений_Канусовский@1981
  • #
  • 29 октября 2019 г. 11:32

Этот процесс автоматически прописывает Qt Designer, но иконка меняется только на самой форме программы, в панели задач иконка остается питоновской. Видимо лучше на это забить))

Evgenii Legotckoi

  • Evgenii Legotckoi → Евгений_Канусовский@1981
  • #
  • 29 октября 2019 г. 11:35

Ясно, надо искать тогда в направлении RC_ICONS. Эта штука при компиляции в Qt/C++ добавляет иконку в бинарник, она и отображается в панели задач.
Так что остаётся искать решение в этом направлении и зачитывать документацию на PyQt5 до дыр.

  • Евгений_Канусовский@1981
  • #
  • 29 октября 2019 г. 11:41

Согласен с Вами Евгений, может получится через бинарники, попробую

Evgenii Legotckoi

  • Evgenii Legotckoi → Евгений_Канусовский@1981
  • #
  • 29 октября 2019 г. 11:46
  • (ред.)

я не совсем это имел ввиду. Дело в том, что иконка приложения сама по себе не добавляется в ресурсный файл. Она туда внедряется на этапе копиляции. При этом для Windows в pro файл прописывается директива RC_ICONS

win32: RC_ICONS = $$PWD/images/myappico.ico

Поэтому иконка и отображается в панели задач. Я вообще не уверен, что в PyQt5 это решено каким-то адекватным способом. Да и в интернете не так много информации на эту тему.

Это платформозависимый функционал.

  • Евгений_Канусовский@1981
  • #
  • 1 ноября 2019 г. 13:49

Оказалось что ответ весьма прост)): в командной строке в директории проекта набираем:

pyinstaller -w -F -i "C:\Dir\ikona.ico" my_project.py

Флаг -w глушит консоль, -F упаковывает все в exe - файл, -i добавляет иконку

Evgenii Legotckoi

  • Evgenii Legotckoi → Евгений_Канусовский@1981
  • #
  • 1 ноября 2019 г. 13:54

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

Комментарии

Только авторизованные пользователи могут публиковать комментарии.
Пожалуйста, авторизуйтесь или зарегистрируйтесь

Статья Иконка для скрипта Python в трее, всплывающие сообщения и парсинг курса валют

В данной статье я хотел бы сделать обзор на библиотеку, которая позволяет поместить значок приложения в трей, а также добавить к нему контекстное меню с выполнением различных операций при нажатии на них. А также, немного рассказать о новой библиотеке, которая позволяет выводить всплывающие сообщения в трее, как Windows 10, так и Windows 11. Использовать для этих целей мы будем небольшой скрипт на Python, в котором и будет показана работа библиотек.

000.jpg

Что потребуется?

Для работы скрипта потребуется установка довольно большого количества библиотек.

  • pystray – с помощью данной библиотеки мы будем реализовывать значок скрипта в трее;
  • Pillow – данная библиотека потребуется для того, чтобы открыть изображение, которое будет служить иконкой для скрипта в трее;
  • bs4 и lxml – с помощью данных библиотек мы будем парсить html-код страницы, который вернется к нам по запросу;
  • requests – с помощью данной библиотеки мы будем получать html-код страницы по нужному нам адресу;
  • pywin32 – данная библиотека потребуется для того, чтобы свернуть терминал со скриптом на панель задач;
  • win11toast – с помощью данной библиотеки мы будем выводить всплывающие сообщения с интерактивными кнопками (win10toast в связке с python 3.11 работать не хочет, выбрасывает исключение).

pip install pystray Pillow requests bs4 lxml pywin32 win11toast

Так как в данном скрипте используются изображения, как для иконки скрипта в трее, так и для вывода во всплывающих сообщениях, необходимо будет скачать иконки в формате png и поместить их в папку pic.

У меня это выглядит вот так:

01.png

Значки могут быть, по сути любыми, а не только такими же, как у меня, главное - не забыть отобразить это в коде. Эти же иконки я прикреплю во вложение к статье.
На этом подготовительный этап можно завершить. После того, как будут установлены все библиотеки и загружены иконки, импортируем нужные для работы скрипта библиотеки:

from pathlib import Path import win32con import win32console import win32gui from PIL import Image from bs4 import BeautifulSoup from pystray import Icon, MenuItem, Menu from requests import get from win11toast import toast

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

Получение html-кода страницы

Создадим функцию get_text(url: str) -> (str, bool). На вход она получает ссылку на страницу, делает к ней запрос и если статус-код равен 200, возвращает html-код страницы. Если же код будет другим, вернется значение False.
Дополнительно укажем заголовки, в которых пропишем user-agent. Все же, парсить будем Google, а потому, нужно немного притвориться браузером.

def get_text(url: str) -> (str, bool): """ Получение кода страницы по заданной ссылке. """ headers = < 'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) ' 'Chrome/110.0.0.0 Safari/537.36' >try: res = get(url=url, headers=headers) return res.text if res.status_code == 200 else False except Exception: return False

Парсим стоимость валюты

Нас интересует стоимость той или иной валюты по отношению к рублю. В качестве подопытных валют были выбраны три: доллар, йена и юань.

Создадим функцию parse_course(url: str) -> (str, bool), которая на входе получает ссылку с запросом, а возвращает полученное значение в случае удачи или False, в случае, если значение получить не удалось.

Выполняем функцию get_text, в которую передаем полученную в функцию ссылку. В зависимости от ответа создаем объект BeautifulSoup, в который передаем полученный код страницы и указываем парсер, с помощью которого будем получать значения. Ищем значение валюты на странице, забираем его в переменную course и, если она не пуста возвращаем его из функции. Если же значение получено не было, или возникло исключение, возвращаем из функции False.

def parse_course(url: str) -> (str, bool): """ Парсинг стоимости валюты по отношению к рублю. """ try: if res := get_text(url): soup = BeautifulSoup(res, 'lxml') course = soup.find('div', class_='dDoNo ikb4Bb gsrt').find('span', class_='DFlfde SwHCTb').text.strip() return course if course else False else: return False except AttributeError: return False

Вывод всплывающих сообщений

Создадим функцию notify_send(text: str, url='', icon=None), которая на входе получает текст сообщения, ссылку, по которой был выполнен запрос к странице с курсом валюты, а также словарь, в котором содержится путь к иконке и значение, которое указывает на необходимость переопределения логотипа приложения.

Проверяем не является ли значение icon – None. Такое может быть, если значение курса валют не было получено и вернулась ошибка. Если оно не None, создаем две кнопки, в качестве аргумента первой кнопки указываем ссылку на страницу, а у второй значение, которое закроет сообщение. Таким образом у нас должны быть две кнопки: Открыть в Google и Закрыть. Ну, а далее, выводим сообщение.

Если же значение icon равно None, выводим в сообщении только одну кнопку – Закрыть.

def notify_send(text: str, url='', icon=None): """ Вывод уведомления с активными кнопками. """ if icon: buttons = [', 'content': 'Открыть в Google'>, ] toast("Курс к рублю", f'', buttons=buttons, icon=icon) else: toast("Курс к рублю", f'', button=, icon=icon)

Выбор валюты, по которой было получено значение

Создадим функцию notify_choice(course: str, url: str, val: str), которая на входе получает текст с курсом валюты, ссылку по которой был выполнен запрос, значение val, указывающее, по какой из трех валют выполнялся запрос. В зависимости от этого формируем сообщение и отправляем для вывода на экран, в функцию notify_send.

def notify_choice(course: str, url: str, val: str): """ Выбор сообщения для определенной валюты, в зависимости от значения val. """ if val == "b": icon = < 'src': f'', 'placement': 'appLogoOverride' > notify_send(f'Курс ₽1/$1 составляет: руб.за доллар', url, icon) elif val == "y": icon = < 'src': f'', 'placement': 'appLogoOverride' > notify_send(f'Курс ₽1/JP¥1 составляет: руб.за йену', url, icon) elif val == "u": icon = < 'src': f'', 'placement': 'appLogoOverride' > notify_send(f'Курс ₽1/CN¥1 составляет: руб.за юань', url, icon)

Обработка нажатия на пункт меню иконки в трее

Создадим функцию click(icon: Icon, item: MenuItem), которая на входе получает значения, возвращаемые при нажатии на тот или иной пункт меню. Переводим полученное значение в текст, проверяем чему этот текст равен. В зависимости от этого запрашиваем значение нужной валюты в рублях и отправляем полученное значение в функцию notify_choice для формирования текста и вывода всплывающего сообщения.

def click(icon: Icon, item: MenuItem): """ Обработка полученных значений меню. В зависимости от выбранного пункта выполняется запрос данных по определенной валюте. """ if str(item) == 'доллара': url = 'https://www.google.ru/search?q=курс+доллара' if course := parse_course(url): notify_choice(course, url, "b") else: notify_send("Данные по курсу не получены") elif str(item) == 'йены': url = 'https://www.google.ru/search?q=курс+йены' if course := parse_course(url): notify_choice(course, url, "y") else: notify_send("Данные по курсу не получены") elif str(item) == 'юаня': url = 'https://www.google.ru/search?q=курс+юаня' if course := parse_course(url): notify_choice(course, url, "u") else: notify_send("Данные по курсу не получены") elif str(item) == 'Выход': icon.stop()

Нужно обратить внимание, что остановка скрипта происходит при нажатии на пункт меню «Выход». В этом случае обрабатывается команда icon.stop(), которая и завершает работу скрипта.

Формирование меню и запуск скрипта

Создадим функцию main, в которой будем формировать меню для иконки скрипта в трее, а также для запуска скрипта на выполнение.

Загрузим иконку для приложения с помощью функции Pillow Image. Создадим переменную icon, в которую поместим объект Icon. В качестве параметров передадим название для созданного объекта, иконку, которая была загружена в переменную image, и начнем создавать меню. Как видно далее, доступно не только создание меню, но, для каждого пункта возможно создание подменю, чем мы и воспользуемся. Создадим два пункта меню у иконки: «Курс к рублю:» и «Выход». Для пункта «Курс к рублю:» создадим подменю, где разместим подменю для доллара, йены и юаня.

Затем выполним команду, которая свернет терминал в «Панель задач» и запустим скрипт на выполнение.

def main(): image = Image.open(Path.cwd() / "pic" / "cat.png") icon = Icon('Cat Vampire', image, menu=Menu( MenuItem('Курс к рублю:', Menu( MenuItem('доллара', click), MenuItem('йены', click), MenuItem('юаня', click) )), MenuItem('Выход', click) )) win32gui.ShowWindow(win32console.GetConsoleWindow(), win32con.SW_HIDE) icon.run() if __name__ == "__main__": main()

Давайте посмотрим, что у нас получилось. Как видим, иконка скрипта появилась в трее.

02.png

При щелчке по иконке правой кнопкой мыши будут доступны пункты меню, которое мы создали.

03.png

Теперь получим курс какой-нибудь валюты и посмотрим на всплывающее сообщение.

04.png

Данное сообщение имеет две кнопки. При клике на кнопку «Открыть в Google» будет запущен браузер, а при клике на кнопку «Закрыть» сообщение будет закрыто.

Теперь, если мы кликнем по пункту меню «Выход», скрипт завершит свою работу.
Единственной не особо приятной особенностью является то, что при работе библиотеки для отображения всплывающих сообщений в терминал выводятся значения кнопок сообщения.

05.png

Полный код скрипта для создания иконки в трее

""" pip install pystray Pillow requests bs4 lxml pywin32 win11toast """ from pathlib import Path import win32con import win32console import win32gui from PIL import Image from bs4 import BeautifulSoup from pystray import Icon, MenuItem, Menu from requests import get from win11toast import toast def get_text(url: str) -> (str, bool): """ Получение кода страницы по заданной ссылке. """ headers = < 'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) ' 'Chrome/110.0.0.0 Safari/537.36' >try: res = get(url=url, headers=headers) return res.text if res.status_code == 200 else False except Exception: return False def parse_course(url: str) -> (str, bool): """ Парсинг стоимости валюты по отношению к рублю. """ try: if res := get_text(url): soup = BeautifulSoup(res, 'lxml') course = soup.find('div', class_='dDoNo ikb4Bb gsrt').find('span', class_='DFlfde SwHCTb').text.strip() return course if course else False else: return False except AttributeError: return False def notify_send(text: str, url='', icon=None): """ Вывод уведомления с активными кнопками. """ if icon: buttons = [', 'content': 'Открыть в Google'>, ] toast("Курс к рублю", f'', buttons=buttons, icon=icon) else: toast("Курс к рублю", f'', button=, icon=icon) def notify_choice(course: str, url: str, val: str): """ Выбор сообщения для определенной валюты, в зависимости от значения val. """ if val == "b": icon = < 'src': f'', 'placement': 'appLogoOverride' > notify_send(f'Курс ₽1/$1 составляет: руб.за доллар', url, icon) elif val == "y": icon = < 'src': f'', 'placement': 'appLogoOverride' > notify_send(f'Курс ₽1/JP¥1 составляет: руб.за йену', url, icon) elif val == "u": icon = < 'src': f'', 'placement': 'appLogoOverride' > notify_send(f'Курс ₽1/CN¥1 составляет: руб.за юань', url, icon) def click(icon: Icon, item: MenuItem): """ Обработка полученных значений меню. В зависимости от выбранного пункта выполняется запрос данных по определенной валюте. """ if str(item) == 'доллара': url = 'https://www.google.ru/search?q=курс+доллара' if course := parse_course(url): notify_choice(course, url, "b") else: notify_send("Данные по курсу не получены") elif str(item) == 'йены': url = 'https://www.google.ru/search?q=курс+йены' if course := parse_course(url): notify_choice(course, url, "y") else: notify_send("Данные по курсу не получены") elif str(item) == 'юаня': url = 'https://www.google.ru/search?q=курс+юаня' if course := parse_course(url): notify_choice(course, url, "u") else: notify_send("Данные по курсу не получены") elif str(item) == 'Выход': icon.stop() def main(): image = Image.open(Path.cwd() / "pic" / "cat.png") icon = Icon('Cat Vampire', image, menu=Menu( MenuItem('Курс к рублю:', Menu( MenuItem('доллара', click), MenuItem('йены', click), MenuItem('юаня', click) )), MenuItem('Выход', click) )) win32gui.ShowWindow(win32console.GetConsoleWindow(), win32con.SW_HIDE) icon.run() if __name__ == "__main__": main()

А на этом, пожалуй, все.

Спасибо за внимание. Надеюсь, данное сообщение будет вам полезно

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *