Как реализовать открытие окна при нажатии на иконку в трее?
Нашёл вот такую информацию по pystray:
Меню также поддерживают элемент по умолчанию. В Windows и X этот элемент будет активирован, когда пользователь щелкнет значок с помощью основной кнопки. На других платформах он будет активирован, если в меню нет видимых записей; это не обязательно должно быть видно.
В моём предыдущем вопросе мне подсказали как свернуть программу в трей с меню, но нету никакой информации по щелчку ЛКМ по иконке в трее.
Как сделать выполнение события при щелчке ЛКМ на иконку в трее?
from pystray import MenuItem as item
import pystray
from PIL import Image
import tkinter as tk
window = tk.Tk()
window.title("Welcome")
def quit_window(icon, item):
icon.stop()
window.destroy()
def show_window(icon, item):
icon.stop()
window.after(0,window.deiconify)
def withdraw_window():
window.withdraw()
image = Image.open("image.ico")
menu = (item('Quit', quit_window), item('Show', show_window))
icon = pystray.Icon("name", image, "title", menu)
icon.run()
window.protocol('WM_DELETE_WINDOW', withdraw_window)
window.mainloop()
Обновление
Ошибка:
An error occurred when calling message handler
Traceback (most recent call last):
File "C:\Python380\lib\site-packages\pystray\_win32.py", line 386, in _dispatcher
return int(icon._message_handlers.get(
File "C:\Python380\lib\site-packages\pystray\_win32.py", line 184, in _on_notify
self()
File "C:\Python380\lib\site-packages\pystray\_base.py", line 88, in __call__
self._menu(self)
TypeError: 'tuple' object is not callable
Ответы (2 шт):
Чтобы работало действие по-умолчанию, нужно элементы добавлять как объект Menu, а не как кортеж, и для нужного пункта меню указать default=True:
menu = Menu(item('Quit', quit_window), item('Show', show_window, default=True))
icon = pystray.Icon("name", image, "title", menu)
Действие по-умолчанию работает не на всех платформах, либо есть своя специфика (у меня на Linux Mint 20 Cinnamon при любом варианте клика на значке выводится меню). Чтобы узнать, поддерживает ли платформа действие по-умолчанию, нужно вывести константу Icon.HAS_DEFAULT_ACTION:
print(pystray.Icon.HAS_DEFAULT_ACTION) # У меня выводит False
Столкнулся с той же проблемой, странно что её до сих пор не починили.
На гитхабе либы оставил ишьюс как починить проблему :