敬酒通知程序离开托盘图标循环后

时间:2019-03-20 03:01:07

标签: python windows-10

我正在尝试构建简单的Python应用程序,它将向Tray添加图标。 我还在此任务栏图标上添加了2个菜单项,一个显示Windows 10吐司消息,另一个停止应用程序。

程序正在正确启动,出现图标,菜单也出现。 因此,我用self.icon.run()运行的进程应该等待,直到我不会调用self.icon.stop()

问题是,当我按第一个菜单项(“测试通知”)时-正确显示了吐司通知,但是此过程在self.icon.run()循环之后结束了,程序本身完成了。

我不明白为什么会这样。根据文档self.icon.run()应该等到stop()调用。

我做错事了吗?这是我的代码:

from win10toast import ToastNotifier
from pystray import *
from PIL import Image

class SysTrayUI:
    def __init__(self):
        self.icon_path = "icon.png"

        self.menu_items = [
            MenuItem("Test Notification", lambda: toaster.show_toast("Test")),
            MenuItem("Exit", lambda: self.icon.stop()),
        ]
        self.menu = Menu(*self.menu_items)

        self.icon = Icon("Test Name", menu=self.menu)
        self.icon.icon = Image.open(self.icon_path)

        self.icon.run()

toaster = ToastNotifier()
app = SysTrayUI()

2 个答案:

答案 0 :(得分:1)

线程= True

这将有所帮助,更好的方法是创建一个单独的函数并传递如下所示的消息(这对我有用)。如果我不创建函数就进行同样的操作对我来说是行不通的。因此,请遵循以下格式

def notify(msg):
    n = ToastNotifier()
    n.show_toast("Champzz", msg, duration= 10, threaded=True)

答案 1 :(得分:0)

找到了解决方案

toaster.show_toast函数具有threaded参数,该参数允许在单独的线程中启动函数

因此,如果您这样编写:

MenuItem("Test Notification", lambda: toaster.show_toast("Test", threaded=True)),

这将不会影响self.icon.run()

的执行