一、问题描述
假定你有一个无聊的任务,要填充一个网页或软件中的许多表格,其中包括一些文本字段。剪切板让你不必一次又一次输入同样的文本,但剪切板上一次只有一次内容,如果有几段不同的文本需要拷贝粘贴,就不得不一次又一次的标记和拷贝几个同样的内容。
二、问题分析
这时可以编写一个Python程序,追踪几段文本。这个多重剪切板被命名为mcb.pyw(mcb代表multiclipboard)。.pyw扩展意味着python运行该程序时,不会显示终端窗口。
该程序将利用一个关键字保存每段剪切板文本。例如,当运行py mcb.pyw save spam,剪切板中当前的内容就用关键字spam保存。通过运行py mcb.pyw spam,这段文本稍后会重新加载到剪切板中。如果忘记有哪些关键字时,可通过运行py mcb.pyw list,将所有关键字的列表复制到剪切板中。
下面程序要做的事情:
- 针对要检查的关键字,提供命令行参数。
- 如果参数是save,则将剪切板内容保存到关键字。
- 如果参数是list,则将所有关键字拷贝到剪切板。
- 否则,将关键字对应的文本拷贝到剪切板。
这意味着代码需要完成的工作为:
- 从sys.argv读取命令行参数。
- 读写剪切板。
- 保存并加载shelf文件。
如果使用的是windows,可以创建一个mcb.bat的批处理文件,很容易地通过”Run…”窗口运行这个脚本,该批处理文件包括:@pyw.exe E:\python1\mcb.pyw%*
三、解决问题
第一步:注释和shelf设置
从一个脚本框架开始,其中包含一些注释和基本设置。代码如下:
import shelve,pyperclip,sys
mcbShelf = shelve.open('mcb')
#TODO: Save clipboard content.
#TODO: List keywords and load content.
mcbShelf.close()
拷贝和粘贴需要pyperclip模块,读取命令行参数需要sys模块,同时准备好shelve模块。当用户希望保存一段剪切板文本时,需要将它保存到一个shelf文件中。当用户希望将文本拷贝回剪切板时,需要打开shelf文件,重新加载到程序中。
第二步:用一个关键字保存剪切板内容
根据用户希望保存文本到一个关键字,或加载文本到剪切板,或列出已有的关键字,该程序做的事情不一样。例子如下:
import shelve,pyperclip,sys
mcbShelf = shelve.open('mcb')
#TODO: Save clipboard content.
if len(sys.argv) == 3 and sys.argv[1].lower() =='save':
mcbShelf[sys.argv[2]] = pyperclip.paste()
elif len(sys.argv) == 2:
#TODO: List keywords and load content.
mcbShelf.close()
如果第一个命令行参数(它总是在sys.argv列表的下标1处)是字符串’save’,第二个命令行参数就是保存剪切板当前内容的关键字。关键字将用作mcbShelf中的键,值就是当前剪切板的文本。
如果只有一个命令行参数,就假定它要么是’list’,要么是需要加载到剪切板的关键字。
第三步:列出关键字和加载关键字的内容
用户希望从关键字中加载剪切板文本,或希望列出所有可用的关键字。代码如下:
import shelve,pyperclip,sys
mcbShelf = shelve.open('mcb')
#TODO: Save clipboard content.
if len(sys.argv) == 3 and sys.argv[1].lower() =='save':
mcbShelf[sys.argv[2]] = pyperclip.paste()
elif len(sys.argv) == 2:
#TODO: List keywords and load content.
if sys.argv[1].lower() == 'list':
pyperclip.copy(str(list(mcbShelf.keys())))
elif sys.argv[1] in mcbShelf:
pyperclip.copy(mcbShelf[sys.argv[1]])
mcbShelf.close()