Эта статья посвящена теме, на вопросы по которой я часто натыкаюсь. С помощью wxPython реализовать возможность сворачивания вашего приложения в трей достаточно просто. Мы начнём с того, что разберёмся с кодом, создающим TaskBarIcon, а затем перейдём к созданию простого приложения, которое можно будет свернуть в системный трей.
Есть вопросы по Python?
На нашем форуме вы можете задать любой вопрос и получить ответ от всего нашего сообщества!
Паблик VK
Одно из самых больших сообществ по Python в социальной сети ВК. Видео уроки и книги для вас!
Создаём простую иконку панели задач
Создать иконку панели задач с помощью wxPython очень просто, особенно, если у вас уже есть готовый файл иконки. Давайте взглянем на один простой способ:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
# custTray.py import wx class CustomTaskBarIcon(wx.TaskBarIcon): """""" def __init__(self, frame): """Constructor""" wx.TaskBarIcon.__init__(self) self.frame = frame icon = wx.Icon('python.ico', wx.BITMAP_TYPE_ICO) self.SetIcon(icon, "Restore") self.Bind(wx.EVT_TASKBAR_LEFT_DOWN, self.OnTaskBarLeftClick) def OnTaskBarActivate(self, evt): """""" pass def OnTaskBarClose(self, evt): """ Уничтожает иконку панели задач и рамку в самой иконке панели задач """ self.frame.Close() def OnTaskBarLeftClick(self, evt): """ Создаёт меню, появляющееся при нажатии правой кнопки мыши """ self.frame.Show() self.frame.Restore() |
Как вы видите, всё что нам нужно это указать путь к файлу иконки в wx.Icon, а затем сообщить о том, какой тип файла мы ему передали. Затем мы просто вызываем метод **SetIcon() в wx.TaskBarIcon, чтобы установить иконку. Если у вас нет файла иконки, то вы можете воспользоваться альтернативным методом, чтобы создать его из файла изображения другого типа:
1 2 3 4 5 |
img = wx.Image("24x24.png", wx.BITMAP_TYPE_ANY) bmp = wx.BitmapFromImage(img) self.icon = wx.EmptyIcon() self.icon.CopyFromBitmap(bmp) self.SetIcon(self.icon, "Restore") |
В данном случае мы проделываем несколько операций, чтобы превратить PNG-изображение в формат, который смогут использовать методы wxPython. Вы заметите, что мы биндим EVT_TASKBAR_LEFT_DOWN, так что когда пользователь нажмёт на иконку, то приложение развернётся.
Примечание: Как я уже упоминал в прошлой статье, нам нужно будет обновить этот код, если вы собираете использовать его в wxPython Phoenix, так как класс TaskBarIcon был перемещён в wx.adv. Если вы используете wxPython Phoenix, то код должен выглядеть вот так:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
# custTray_phoenix.py import wx import wx.adv class CustomTaskBarIcon(wx.adv.TaskBarIcon): """""" def __init__(self, frame): """Constructor""" wx.adv.TaskBarIcon.__init__(self) self.frame = frame icon = wx.Icon('python.ico', wx.BITMAP_TYPE_ICO) self.SetIcon(icon, "Restore") self.Bind(wx.adv.EVT_TASKBAR_LEFT_DOWN, self.OnTaskBarLeftClick) def OnTaskBarActivate(self, evt): """""" pass def OnTaskBarClose(self, evt): """ Уничтожает иконку панели задач и рамку в самой иконке панели задач """ self.frame.Close() def OnTaskBarLeftClick(self, evt): """ Создаёт меню, которое появляется при нажатии правой кнопки мыши. """ self.frame.Show() self.frame.Restore() |
Теперь у вас есть примеры обеих вариантов кода. Давайте же теперь перейдём к самому приложению, которое будет сворачиваться!
Делаем так, чтобы приложение сворачивалось в трей
Теперь мы готовы к тому, чтобы создать приложение, которое будет сворачиваться в трей. Давайте напишем немного кода:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 |
import custTray_phoenix as custTray import wx class MainFrame(wx.Frame): """""" def __init__(self): """Constructor""" wx.Frame.__init__(self, None, title="Minimize to Tray") panel = wx.Panel(self) self.tbIcon = custTray.CustomTaskBarIcon(self) self.Bind(wx.EVT_ICONIZE, self.onMinimize) self.Bind(wx.EVT_CLOSE, self.onClose) self.Show() def onClose(self, evt): """ Уничтожает иконку панели задач и рамку """ self.tbIcon.RemoveIcon() self.tbIcon.Destroy() self.Destroy() def onMinimize(self, event): """ Во время сворачивания, делаем так, чтобы приложение оставило иконку в трее """ if self.IsIconized(): self.Hide() def main(): """""" app = wx.App(False) frame = MainFrame() app.MainLoop() if __name__ == "__main__": main() |
Здесь мы биндим два события. Первое для EVT_CLOSE и второе для EVT_ICONIZE. Второе запускается, когда пользователь сворачивает приложение, чтобы поместить иконку в трей: проще говоря, оно просто прячет рамку. Первое же запускается, когда вы закрываете приложение, и вот на этот момент стоит обратить внимание.
Почему? Так, вам нужно отследить событие, отвечающее за закрытие, если пользователь пытается закрыть приложение, используя иконку в трее. И вам нужно быть уверенным, что вы удалили иконку И уничтожили её, или же ваше приложение не закроется, а просто будет висеть среди фоновых процессов.
Итоги
Теперь вы знаете как свернуть ваше приложение до иконки в системном трее. Я использовал данную возможность в простой программе для проверки электронной почты. У данного навыка есть масса сфер применения, например, проверка состояния выполнения задачи в приложении, свёрнутом в трей.
Являюсь администратором нескольких порталов по обучению языков программирования Python, Golang и Kotlin. В составе небольшой команды единомышленников, мы занимаемся популяризацией языков программирования на русскоязычную аудиторию. Большая часть статей была адаптирована нами на русский язык и распространяется бесплатно.
E-mail: vasile.buldumac@ati.utm.md
Образование
Universitatea Tehnică a Moldovei (utm.md)
- 2014 — 2018 Технический Университет Молдовы, ИТ-Инженер. Тема дипломной работы «Автоматизация покупки и продажи криптовалюты используя технический анализ»
- 2018 — 2020 Технический Университет Молдовы, Магистр, Магистерская диссертация «Идентификация человека в киберпространстве по фотографии лица»