写了一个wxpython最小化托盘与抓图结合的程序,求高手帮忙改正
#!/usr/bin/env python
#coding=gbk
import pyhk
import wx
import os
import sys
from PIL import ImageGrab
import ctypes
import win32gui
import ctypes.wintypes
def capture_fullscreen():
'''''
Function:全屏抓图
Input:NONE
Output: NONE
author: socrates
blog:http://blog.csdn.net/dyx1024
date:2012-03-10
'''
#抓图
pic = ImageGrab.grab()
#保存图片
save_pic(pic)
def capture_current_windows():
'''''
Function:抓取当前窗口
Input:NONE
Output: NONE
author: socrates
blog:http://blog.csdn.net/dyx1024
date:2012-03-10
'''
#窗口结构
class RECT(ctypes.Structure):
_fields_ = [('left', ctypes.c_long),
('top', ctypes.c_long),
('right', ctypes.c_long),
('bottom', ctypes.c_long)]
def __str__(self):
return str((self.left, self.top, self.right, self.bottom))
rect = RECT()
#获取当前窗口句柄
HWND = win32gui.GetForegroundWindow()
#取当前窗口坐标
ctypes.windll.user32.GetWindowRect(HWND,ctypes.byref(rect))
#调整坐标
rangle = (rect.left+2,rect.top+2,rect.right-2,rect.bottom-2)
#抓图
pic = ImageGrab.grab(rangle)
#保存
save_pic(pic)
def capture_choose_windows():
'''''
Function:抓取选择的区域,没有自己写这个,借用QQ抓图功能
Input:NONE
Output: NONE
author: socrates
blog:http://blog.csdn.net/dyx1024
date:2012-03-10
'''
try:
#加载QQ抓图使用的dll
dll_handle = ctypes.cdll.LoadLibrary('CameraDll.dll')
except Exception:
try:
#如果dll加载失败,则换种方法使用,直接运行,如果还失败,退出
os.system("Rundll32.exe CameraDll.dll, CameraSubArea")
except Exception:
return
else:
try:
#加载dll成功,则调用抓图函数,注:没有分析清楚这个函数带的参数个数
#及类型,所以此语句执行后会报参数缺少4个字节,但不影响抓图功能,所
#以直接忽略了些异常
dll_handle.CameraSubArea(0)
except Exception:
return
def save_pic(pic, filename = '未命令图片.png'):
'''''
Function:使用文件对框,保存图片
Input:NONE
Output: NONE
author: socrates
blog:http://blog.csdn.net/dyx1024
date:2012-03-10
'''
app = wx.PySimpleApp()
wildcard = "PNG(*.png)|*.png"
dialog = wx.FileDialog(None, "Select a place", os.getcwd(),
filename, wildcard, wx.SAVE)
if dialog.ShowModal() == wx.ID_OK:
pic.save(dialog.GetPath().encode('gb2312'))
else:
pass
dialog.Destroy()
def screenshot_main():
'''''
Function:主函数,注册快捷键
Input:NONE
Output: NONE
author: socrates
blog:http://blog.csdn.net/dyx1024
date:2012-03-10
'''
#创建hotkey句柄
hot_handle = pyhk.pyhk()
#注册抓取全屏快捷键CTRL+F1
hot_handle.addHotkey(['Ctrl', 'F1'], capture_fullscreen)
#注册抓取当前窗口快捷键CTRL+F2
hot_handle.addHotkey(['Ctrl', 'F2'], capture_current_windows)
#注册抓取所选区域快捷键CTRL+F3
hot_handle.addHotkey(['Ctrl', 'F3'], capture_choose_windows)
#开始运行
hot_handle.start()
class TaskBarIcon(wx.TaskBarIcon):
ID_fullscreen = wx.NewId()
ID_currentt = wx.NewId()
ID_choose=wx.NewId()
ID_Closeshow=wx.NewId()
def __init__(self, frame):
wx.TaskBarIcon.__init__(self)
self.frame = frame
self.SetIcon(wx.Icon(name='wx.ico', type=wx.BITMAP_TYPE_ICO), '系统托盘演示!') #wx.ico为ico图标文件
self.Bind(wx.EVT_TASKBAR_LEFT_DCLICK, self.OnTaskBarLeftDClick) #定义左键双击
self.Bind(wx.EVT_MENU, self.Onfullscreen, id=self.ID_fullscreen)
self.Bind(wx.EVT_MENU, self.Oncurrent, id=self.ID_current)
self.Bind(wx.EVT_MENU, self.Onchoose, id=self.ID_choose)
self.Bind(wx.EVT_MENU, self.OnCloseshow, id=self.ID_Closeshow)
def OnTaskBarLeftDClick(self, event):
if self.frame.IsIconized():
self.frame.Iconize(False)
if not self.frame.IsShown():
self.frame.Show(True)
self.frame.Raise()
def Onfullscreen(self, event):
capture_fullscreen()
def Oncurrent(self,event):
capture_current_windows()
def Onchoose(self,event):
capture_choose_windows()
def OnCloseshow(self,event):
self.frame.Close(True)
# 右键菜单
def CreatePopupMenu(self):
menu = wx.Menu()
menu.Append(self.ID_fullscreen, '全屏抓图')
menu.Append(self.ID_current, '抓取当前窗口')
menu.Append(self.ID_choose, '抓取选择区域')
menu.Append(self.ID_Closeshow, '退出')
return menu
class Frame(wx.Frame):
def __init__(self):
self.frame=wx.Frame.__init__(self,None,-1, '多功能抓图软件',size=(640,480),
style=wx.DEFAULT_FRAME_STYLE)
panel=wx.Panel(self,-1)
self.SetIcon(wx.Icon('wx.ico', wx.BITMAP_TYPE_ICO))
self.button = wx.Button(panel,-1,'抓图', pos=(88, 152), size=wx.Size(200, 100))
self.SetBackgroundColour((255, 0, 0))
self.taskBarIcon = TaskBarIcon(self)
# 绑定事件
self.Bind(wx.EVT_BUTTON,self.OnButton,self.button)
self.Bind(wx.EVT_CLOSE, self.OnClose)
self.Bind(wx.EVT_ICONIZE, self.OnIconfiy) # 窗口最小化时,调用OnIconfiy,注意Wx窗体上的最小化按钮,触发的事件是 wx.EVT_ICONIZE,
# 而根本就没有定义什么wx.EVT_MINIMIZE,但是最大化,有个wx.EVT_MAXIMIZE。
def OnButton(self,event):
screenshot_main() #提供快捷键操作
def OnHide(self, event):
self.Hide()
def OnIconfiy(self, event):
self.Hide()
event.Skip()
def OnClose(self, event):
self.taskBarIcon.Destroy()
self.Destroy()
if __name__ == '__main__':
app = wx.PySimpleApp()
frame = Frame()
frame.Centre()
frame.Show()
app.MainLoop()
Traceback (most recent call last):
File "C:\Python27\点到系统\实验.py", line 215, in <module>
frame = Frame()
File "C:\Python27\点到系统\实验.py", line 193, in __init__
self.taskBarIcon = TaskBarIcon(self)
File "C:\Python27\点到系统\实验.py", line 149, in __init__
self.Bind(wx.EVT_MENU, self.Oncurrent, id=self.ID_current)
AttributeError: 'TaskBarIcon' object has no attribute 'ID_current'
我实在搞不懂了,前面哪行怎么没错啊,都差不多
[解决办法]
AttributeError: 'TaskBarIcon' object has no attribute 'ID_current'
那个对象没有ID_current属性,肯定是拼写错误
[解决办法]
全文替换为ID_current为ID_currentt即可,共两处。