我正在嘗試將額外的引數傳遞給由 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()
在這個例子中,當我在 pystray 選單中按“Quit”時,我試圖傳遞呼叫函式“quit_window”的引數“message”。這里的問題是默認情況下選單構造中使用的函式沒有引數并且在內部參考圖示。當我使用引數時,建構式不傳遞圖示參考來呼叫 stop() 并且因為我在 pystray.Menu 之后創建 pystray.Icon 我不知道如何傳遞此資訊并使其作業。
uj5u.com熱心網友回復:
你可以做你看起來想做但不喜歡做的事情。
item() 接受一個函式(例如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
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/367740.html
