找回密码
 立即注册

扫一扫,访问微社区

QQ登录

只需一步,快速开始

查看: 4532|回复: 3

[求助] wxpython TaskBarIcon 如何使用

4

主题

8

帖子

8

积分

贫民

积分
8
Python大神 发表于 2016-10-18 19:18:08 | 显示全部楼层 |阅读模式

请教大神TaskBarIcon在没有FRAME情况下详细使用方法

问题描述:
我想做个PC文件同步程序,打开客户端,弹出要同步的文件夹,同时希望有托盘程序,可以退出客户端
所以,我这里没有用到FRAME 网上的例子都是基于FRAME的

我想到个方案就是做个隐藏的FRAME,然后TaskBarIcon放在里面,但是如何隐藏又解决不了

回复

使用道具 举报

1419

主题

1891

帖子

291

积分

侠客

积分
291

最佳新人热心会员默默耕耘

whydo1 发表于 2016-10-18 21:36:07 | 显示全部楼层
把frame放到屏幕外面去
  1.         pos = (-100, -100)
  2.         size = (1,1)
  3.         wx.Frame.__init__(self, parent, id, title, pos, size, style)
复制代码
python3.4.4, win10
回复 支持 反对

使用道具 举报

4

主题

8

帖子

8

积分

贫民

积分
8
Python大神  楼主| 发表于 2016-10-19 09:44:30 | 显示全部楼层
whydo1 发表于 2016-10-18 21:36
把frame放到屏幕外面去

这样还是会有个问题,任务栏会有FRAME
因为FRAME只是作为中介,我是想彻底隐藏掉FRAME
回复 支持 反对

使用道具 举报

1419

主题

1891

帖子

291

积分

侠客

积分
291

最佳新人热心会员默默耕耘

whydo1 发表于 2016-10-19 19:19:29 | 显示全部楼层
frame定义之后, 不要显示出来.
用下面这段代码修改一下,应该可以满足你的需求.


  1. ##!/usr/bin/python
  2. # _*_ coding: utf-8 _*_

  3. import wx
  4. import wx.adv
  5. class TaskBarIcon(wx.adv.TaskBarIcon):
  6.     ID_Hello = wx.NewId()
  7.     def __init__(self, frame):
  8.         wx.adv.TaskBarIcon.__init__(self)
  9.         self.frame = frame
  10.         self.SetIcon(wx.Icon(name=r'C:\Python34\Lib\site-packages\wx\py\py.ico', type=wx.BITMAP_TYPE_ICO), 'TaskBarIcon!')
  11.         self.Bind(wx.adv.EVT_TASKBAR_LEFT_DCLICK, self.OnTaskBarLeftDClick)
  12.         self.Bind(wx.EVT_MENU, self.OnHello, id=self.ID_Hello)

  13.     def OnTaskBarLeftDClick(self, event):
  14.         if self.frame.IsIconized():
  15.            self.frame.Iconize(False)
  16.         if not self.frame.IsShown():
  17.            self.frame.Show(True)
  18.         self.frame.Raise()

  19.     def OnHello(self, event):
  20.         wx.MessageBox('Hello From TaskBarIcon!', 'Prompt')

  21.     # override
  22.     def CreatePopupMenu(self):
  23.         menu = wx.Menu()
  24.         menu.Append(self.ID_Hello, 'Hello')
  25.         return menu

  26. class Frame(wx.Frame):
  27.     def __init__(
  28.             self, parent=None, id=wx.ID_ANY, title='TaskBarIcon', pos=wx.DefaultPosition,
  29.             size=wx.DefaultSize, style=wx.DEFAULT_FRAME_STYLE
  30.             ):
  31.         #pos = (-100, -100) #隐藏窗体
  32.         #size = (1,1)
  33.         wx.Frame.__init__(self, parent, id, title, pos, size, style)

  34.         # create a welcome screen
  35.         self.screenIm = r'C:\cnPython\resources\images\cat.png'
  36.         screen = wx.Image(self.screenIm).ConvertToBitmap()
  37.         wx.adv.SplashScreen(screen, wx.adv.SPLASH_CENTRE_ON_SCREEN | wx.adv.SPLASH_TIMEOUT,1000, None, -1)
  38.         wx.Yield()

  39.         self.SetIcon(wx.Icon(r'C:\Python34\Lib\site-packages\wx\py\py.ico', wx.BITMAP_TYPE_ICO))
  40.         panel = wx.Panel(self, wx.ID_ANY)
  41.         button = wx.Button(panel, wx.ID_ANY, 'Hide Frame', pos=(60, 60))

  42.         sizer = wx.BoxSizer()
  43.         sizer.Add(button, 0)
  44.         panel.SetSizer(sizer)
  45.         self.taskBarIcon = TaskBarIcon(self)

  46.         # bind event
  47.         self.Bind(wx.EVT_BUTTON, self.OnHide, button)
  48.         self.Bind(wx.EVT_CLOSE, self.OnClose)
  49.         self.Bind(wx.EVT_ICONIZE, self.OnIconfiy) # 最小化事件绑定
  50.     def OnHide(self, event):
  51.         self.Hide()
  52.     def OnIconfiy(self, event):
  53.         wx.MessageBox('Frame has been iconized!', 'Prompt')
  54.         event.Skip()
  55.     def OnClose(self, event):
  56.         self.taskBarIcon.Destroy()
  57.         self.Destroy()

  58. def TestFrame():
  59.     app = wx.PySimpleApp()
  60.     frame = Frame(size=(640, 480))
  61.     #frame.Centre()
  62.     #frame.Show()
  63.     app.MainLoop()
  64. if __name__ == '__main__':
  65.     TestFrame()
复制代码
python3.4.4, win10
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表