首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > perl python >

写了一个wxpython最小化托盘与抓图结合的程序,求高手帮忙改正,该怎么处理

2012-06-05 
写了一个wxpython最小化托盘与抓图结合的程序,求高手帮忙改正#!/usr/bin/env python#codinggbkimport pyh

写了一个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即可,共两处。

热点排行