#python #python-3.x #pystray
#питон #python-3.x #пистрей
Вопрос:
Я пытаюсь передать дополнительные аргументы функции, вызываемой пунктом в меню pystray.
import pystray from pystray import MenuItem as item from PIL import Image, ImageTk def show_window(icon): icon.notify('Hello World!', 'Hi') def quit_window(icon, message): print(message) icon.stop() icon = 'icon.ico' image=Image.open(icon) menu=pystray.Menu(item('Show', show_window, default=True), item('Quit', quit_window(icon, "Test"))) icon=pystray.Icon("name", image, "My System Tray Icon", menu) icon.run()
В этом примере я пытаюсь передать аргумент «сообщение», вызывающий функцию «quit_window», когда я нажимаю «Выйти» в меню pystray. Проблема здесь в том, что по умолчанию функции, используемые при построении меню, не имеют аргументов и внутренне ссылаются на значок. Когда я использую аргументы, конструктор не передает ссылку на значок для вызова stop (), и с тех пор, как я создаю pystray.Значок после pystray.Меню Я не знаю, как передать эту информацию и заставить ее работать.
Ответ №1:
Вы можете делать то, что вам кажется нужным, но не так.
Элемент() принимает функцию (например show_window
, обратите внимание, без скобок), а не вызов функции, как вы использовали quit_window(icon,message)
, — но если вы заставите вызываемую функцию возвращать функцию, то она косвенно сделает то, что вы хотите, хотя сообщение исправлено во время компиляции.
Или вы можете заставить функцию использовать глобальный, чтобы получить сообщение, которое она печатает, что немного ужасно, но означает, что сообщение может изменяться во время выполнения. Или вы, вероятно, могли бы сделать что-то с классом, который, по крайней мере, не использовал бы явный глобальный.
В любом случае, эти методы буксировки показаны здесь (я переименовал все эти ссылки icon
, потому что это сбивало с толку).:
import pystray from pystray import MenuItem as item from PIL import Image, ImageTk def show_window(icon1): icon1.notify('Hello World!', 'Hi') globalmessage = "A global quit message" def quit_window(icon2): icon2.stop() def indirect_quit_window(icon2,message): print( f"The message on quit will be '{message}'" ) def realquitfunction(icon2): print( message ) icon2.stop() return realquitfunction def global_quit(icon4): global globalmessage print( globalmessage ) icon4.stop() icon = 'icon.ico' image=Image.open(icon) menu=pystray.Menu(item('Show', show_window, default=True), item('Quit', indirect_quit_window(icon, "Quitting now - bye!")),item('Global Quit', global_quit) ) icon3=pystray.Icon("name", image, "My System Tray Icon", menu) icon3.run()
Вывод при запуске, а затем нажмите кнопку Выйти:
The message on quit will be 'Quitting now - bye!' Quitting now - bye!
Вывод при запуске, а затем нажмите Глобальный выход:
The message on quit will be 'Quitting now - bye!' A global quit message