如何在wxpython中创建一个TaskBarIcon应用程序?

时间:2016-02-21 21:49:16

标签: python wxpython

我试图在wxpython中创建一个仅使用TaskBarIcon且没有框架的应用程序。

关于这个here有一个问题,但这个例子对我不起作用;它只是退出而没有错误。

我在下面编写的代码是我正在使用的代码的简化版本:

import wx

class Systray_Icon(wx.TaskBarIcon):
    def __init__(self):
        icon = wx.Icon('yellow.ico', wx.BITMAP_TYPE_ICO)
        self.SetIcon(icon, "Test")
        self.Bind(wx.EVT_MENU, self.Destroy(), id=wx.ID_EXIT)

    def CreatePopupMenu(self):
        menu = wx.Menu()
        menu.Append(wx.ID_EXIT, "Quit")
        return menu

app = wx.App()
sysicon = Systray_Icon()
app.MainLoop()

我收到以下错误:

$ python2 systray.py
Traceback (most recent call last):
  File "systray.py", line 15, in <module>
    sysicon = TaskBarIcon()
  File "systray.py", line 6, in __init__
    self.SetIcon(icon, "Test")
  File "/usr/lib/python2.7/dist-packages/wx-3.0-gtk2/wx/_windows.py", line 2841, in SetIcon
    return _windows_.TaskBarIcon_SetIcon(*args, **kwargs)
TypeError: in method 'TaskBarIcon_SetIcon', expected argument 1 of type 'wxPyTaskBarIcon *'

所以,我的问题:

1:为什么SetIcon不接受我的课程?我已经尝试将SetIcon调用移动到我链接的问题中的函数,但它仍然无法正常工作。我可以摆弄它并且可能会得到一些工作,但我想知道它赢得工作的原因。

2:我与跑步相关联的问题,但立即退出。是因为TaskBarIcon不能保持MainLoop()打开吗?我该怎么办?

2 个答案:

答案 0 :(得分:0)

好的,第二天,经过30分钟的捣乱后想出来了。

SetIcon不接受我的课,因为我需要添加以下内容:

super(TaskBarIcon, self).__init__()

__init__

我怀疑这是在这里咬我的鸭子;如果没有运行wx.TaskBarIcon构造函数,python不会将其视为wx.TaskBarIcon对象。

要仅使用TaskBarIcon保持应用程序打开,请从wx.App创建派生类并覆盖OnInit函数,如下所示:

class App(wx.App):
    def OnInit(self):
        self.SetTopWindow(wx.Frame(None, -1))
        TaskBarIcon()
        return True

答案 1 :(得分:0)

以下是使用python 2.7 wxpython 2.8的Linux上的工作示例:

import wx

TRAY_TOOLTIP = 'System Tray Demo'
TRAY_ICON = '/usr/share/pixmaps/thunderbird.xpm'

def create_menu_item(menu, label, func):
    item = wx.MenuItem(menu, -1, label)
    menu.Bind(wx.EVT_MENU, func, id=item.GetId())
    menu.AppendItem(item)
    return item

class TaskBarIcon(wx.TaskBarIcon):
    def __init__(self):
        wx.TaskBarIcon.__init__(self)
        self.set_icon(TRAY_ICON)
        self.Bind(wx.EVT_TASKBAR_LEFT_DOWN, self.on_left_down)

    def CreatePopupMenu(self):
        menu = wx.Menu()
        create_menu_item(menu, 'Say Hello', self.on_hello)
        menu.AppendSeparator()
        create_menu_item(menu, 'Exit', self.on_exit)
        return menu

    def set_icon(self, path):
        icon = wx.IconFromBitmap(wx.Bitmap(path))
        self.SetIcon(icon, TRAY_TOOLTIP)

    def on_left_down(self, event):
        print 'Tray icon was left-clicked.'

    def on_hello(self, event):
        print 'Hello, world!'

    def on_exit(self, event):
        wx.CallAfter(self.Destroy)

def main():
    app = wx.App()
    TaskBarIcon()
    app.MainLoop()

if __name__ == '__main__':
    main()

编辑:
对于仍然感到悲痛的人来说,这是一个基本上使用虚拟框架的版本。

import wx

TRAY_TOOLTIP = 'System Tray Demo'
TRAY_ICON = '/usr/share/pixmaps/thunderbird.xpm'


def create_menu_item(menu, label, func):
    item = wx.MenuItem(menu, -1, label)
    menu.Bind(wx.EVT_MENU, func, id=item.GetId())
    menu.AppendItem(item)
    return item


class TaskBarIcon(wx.TaskBarIcon):
    def __init__(self,frame):
        wx.TaskBarIcon.__init__(self)
        self.myapp_frame = frame
        self.set_icon(TRAY_ICON)
        self.Bind(wx.EVT_TASKBAR_LEFT_DOWN, self.on_left_down)

    def CreatePopupMenu(self):
        menu = wx.Menu()
        create_menu_item(menu, 'Say Hello', self.on_hello)
        menu.AppendSeparator()
        create_menu_item(menu, 'Exit', self.on_exit)
        return menu

    def set_icon(self, path):
        icon = wx.IconFromBitmap(wx.Bitmap(path))
        self.SetIcon(icon, TRAY_TOOLTIP)

    def on_left_down(self, event):
        print ('Tray icon was left-clicked.')

    def on_hello(self, event):
        print ('Hello, world!')

    def on_exit(self, event):
        self.myapp_frame.Close()

class My_Application(wx.Frame):

    #----------------------------------------------------------------------
    def __init__(self):
        wx.Frame.__init__(self, None, wx.ID_ANY, "", size=(1,1))
        panel = wx.Panel(self)
        self.myapp = TaskBarIcon(self)
        self.Bind(wx.EVT_CLOSE, self.onClose)

    #----------------------------------------------------------------------
    def onClose(self, evt):
        """
        Destroy the taskbar icon and the frame
        """
        self.myapp.RemoveIcon()
        self.myapp.Destroy()
        self.Destroy()

if __name__ == "__main__":
    MyApp = wx.App()
    My_Application()
    MyApp.MainLoop()