【问题标题】:Python 3 Wx Change tray iconPython 3 Wx 更改托盘图标
【发布时间】:2018-09-20 09:04:17
【问题描述】:

我正在使用 WxPython(phoenix 新版本)在程序运行时在托盘栏上有一个图标,但我会通过一些事件来更改使用的图标。

我发现了这个很好的例子来开始工作:Quick and easy: trayicon with python?

但它没有循环浏览图标的示例。

在导入之后它有这一行:

TRAY_ICON = 'icon.png'

我尝试将其用作某种变量,并将以下行添加到事件中(它有一些模拟事件,例如右键单击地狱世界

TRAY_ICON = 'icon2.png'

但是没用=//

我只在 c 中找到了示例,在 python 中找到了一个示例,但使用了一个非常复杂的 win32 替代方案,我无法弄清楚

【问题讨论】:

  • 链接答案中相关的行是self.set_icon(TRAY_ICON)。您需要在您的类上调用此方法来更新显示。可能还需要致电.Refresh() - 我已经很久没有使用wx了。

标签: python-3.x wxpython system-tray


【解决方案1】:

这应该足以解决您的问题。

import wx
import wx.adv

ICON = 'toggle1.png'
ICONS = ["toggle1.png", "toggle2.png"]

X=[1,0]

class TaskBarIcon(wx.adv.TaskBarIcon):
    def __init__(self, frame):
        self.frame = frame
        self.toggle = 0
        wx.adv.TaskBarIcon.__init__(self)
        self.Bind(wx.adv.EVT_TASKBAR_LEFT_DOWN, self.OnToggle)
        self.OnSetIcon(ICON)

    def CreatePopupMenu(self):
        menu = wx.Menu()
        togglem = wx.MenuItem(menu, wx.NewId(), 'Toggle Icon')
        menu.Bind(wx.EVT_MENU, self.OnToggle, id=togglem.GetId())
        menu.Append(togglem)
        menu.AppendSeparator()
        flashm = wx.MenuItem(menu, wx.NewId(), 'Flash Icon')
        menu.Bind(wx.EVT_MENU, self.OnTimer, id=flashm.GetId())
        menu.Append(flashm)
        menu.AppendSeparator()
        quitm = wx.MenuItem(menu, wx.NewId(), 'Quit')
        menu.Bind(wx.EVT_MENU, self.OnQuit, id=quitm.GetId())
        menu.Append(quitm)
        return menu

    def OnSetIcon(self, path):
        icon = wx.Icon(path)
        self.SetIcon(icon, path)

    def OnToggle(self, event):
        self.toggle=X[self.toggle]
        use_icon = ICONS[self.toggle]
        self.OnSetIcon(use_icon)

    def OnTimer(self,event):
        self.timer = wx.Timer(self)
        self.Bind(wx.EVT_TIMER, self.OnInUseTimer)
        self.timer.Start(1000)

    def OnInUseTimer(self,event):
        self.OnToggle(None)

    def OnQuit(self, event):
        self.RemoveIcon()
        wx.CallAfter(self.Destroy)
        self.frame.Close()

if __name__ == '__main__':
    app = wx.App()
    frame=wx.Frame(None)
    TaskBarIcon(frame)
    app.MainLoop()

和图片:

在行动:

【讨论】:

    猜你喜欢
    • 2018-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-26
    • 2020-12-03
    相关资源
    最近更新 更多