Python使用win32api模拟鼠标移动并复制粘贴到磁盘文件
大家好…我正在使用win32api。这个工具的目的是在电脑屏幕上移动鼠标,选中一个区域,复制里面的内容,然后把这些内容发送到一个MS Excel电子表格里。
这是我的代码:
import xlwt
import win32api
import win32con
import win32clipboard
import time
x,y = win32api.GetCursorPos()
win32api.SetCursorPos((36, 311))
# choose the contents, highlight area from 36,311 to 66,400
win32api.mouse_event(win32con.MOUSEEVENTF_LEFTDOWN,x,y,0,0)
time.sleep(0.05)
win32api.SetCursorPos((66, 400))
win32api.mouse_event(win32con.MOUSEEVENTF_LEFTUP,x,y,0,0)
# copy the contents
time.sleep(0.05)
win32clipboard.OpenClipboard()
win32clipboard.EmptyClipboard
aaa = win32clipboard.SetClipboardData
win32clipboard.CloseClipboard()
# write the contents into speadsheet
book = xlwt.Workbook(encoding='utf-8', style_compression = 0)
sheet = book.add_sheet('SheetOK', cell_overwrite_ok = True)
sheet.write (1, 1, aaa)
book.save("C:\\paste_write.xls")
但是它没有正常工作,返回了一个错误:“异常:意外的数据类型”。看起来复制和粘贴的部分出了问题。
你能帮我吗?谢谢。
错误信息:
Traceback (most recent call last):
File "C:\Python27\simulate mouse click.py", line 27, in <module>
sheet.write (0, 0, aaa)
File "C:\Python27\lib\xlwt\Worksheet.py", line 1030, in write
self.row(r).write(c, label, style)
File "C:\Python27\lib\xlwt\Row.py", line 259, in write
raise Exception("Unexpected data type %r" % type(label))
Exception: Unexpected data type <type 'builtin_function_or_method'>
1 个回答
1
错误信息告诉你出错的代码行在哪里:
Traceback (most recent call last):
File "C:\Python27\simulate mouse click.py", line 27, in <module>
sheet.write (0, 0, aaa)
^^^ THIS YOUR FUNCTION CALL THAT FAILED
File "C:\Python27\lib\xlwt\Worksheet.py", line 1030, in write
self.row(r).write(c, label, style)
File "C:\Python27\lib\xlwt\Row.py", line 259, in write
raise Exception("Unexpected data type %r" % type(label))
^^^ THIS IS WHERE IT ACTUALLY FAILED IN THE LIBRARY
Exception: Unexpected data type <type 'builtin_function_or_method'>
这个错误信息说明有东西收到了一个“意外的数据类型”,这个类型是'builtin_function_or_method'。所以调用sheet.write
的时候,它对你传入的数据不满意。
如果你回头看看aaa
的值:
aaa = win32clipboard.SetClipboardData
哦,你本来是想调用这个函数的,但你忘记加上括号(
和)
了。所以现在aaa
被赋值为这个函数本身。要调用这个函数,可以看看这个回答的详细信息 Python中的剪贴板问题
你在上面那行的函数调用中也忘记加上括号了。
win32clipboard.EmptyClipboard
你可以试试下面这个:
win32clipboard.EmptyClipboard()
win32clipboard.SetClipboardText("test data")
...
aaa = win32clipboard.GetClipboardText()
不过这里似乎还有第二个问题,你需要给SetClipbardData
传递数据——它并不会对当前选中的文本执行复制操作。你可能需要使用其他的API来实现这个功能。