需求
前段时间有这样一个需求,要读取用户的剪贴板的内容,然后把剪贴板的信息复制到另一个地方。例如:
- 当用户复制的是图片时,把图片复制到一个指定位置。
- 当用户复制的是txt中的一段文字时,获得复制的文字内容。
- 当用户复制的是一个文件时,获得复制的文件名和路径,然后复制到一个指定位置。
设计
1.通过wx自带的检查剪贴板功能。
wx.TheClipboard.IsSupported(wx.DataFormat(wx.DF_BITMAP)) 这样的方式,判断是不是图片。
文字和文件的方法类似,可以在下面的代码里看到。
2.通过wx.TheClipboard.GetData(file_obj)的方法获得剪贴板的内容
3.如果是图片,通过wx.BitmapDataObject()的GetBitmap()方法获得图片信息。再通过SaveFile(name=filename, type=wx.BITMAP_TYPE_BMP)方法保存图片
4.如果是文字。通过wx.TextDataObject()的GetText()方法获得文字内容。
5.如果是文件。通过wx.FileDataObject()的GetFilenames()获得复制的文件列表。然后可以通过shutil库的copy2方法复制文件到指定位置
wxpython窗体的部分代码
#!/usr/bin/env python
import wx
class MyFrame(wx.Frame):
def __init__(self, parent):
wx.Frame.__init__(self, parent, title="Paste Button Demo")
self.text = wx.TextCtrl(self, style=wx.TE_MULTILINE | wx.HSCROLL)
self.count = 4 # gets incremented
menu = wx.MenuBar()
edit = wx.Menu()
paste = edit.Append(wx.ID_PASTE, "&Paste", "Paste from the clipboard")
menu.Append(edit, "&Edit")
self.SetMenuBar(menu)
self.toolbar = self.CreateToolBar()
bmp = wx.ArtProvider.GetBitmap(wx.ART_PASTE, wx.ART_TOOLBAR)
self.toolbar.AddTool(wx.ID_PASTE,"1234",bmp)
self.toolbar.Realize()
self.Bind(wx.EVT_IDLE, self.update_ui)
self.Bind(wx.EVT_UPDATE_UI, self.update_ui, id=wx.ID_PASTE)
wx.UpdateUIEvent.SetUpdateInterval(75)
self.UpdateWindowUI()
def update_ui(self, event):
if event.GetId() == wx.ID_PASTE: # check this less frequently, possibly expensive
self.count += 1
if self.count < 5:
return
if not wx.TheClipboard.IsOpened():
self.count = 0
wx.TheClipboard.Open()
success = wx.TheClipboard.IsSupported(wx.DataFormat(wx.DF_BITMAP))
success2 = wx.TheClipboard.IsSupported(wx.DataFormat(wx.DF_TEXT))
success3 = wx.TheClipboard.IsSupported(wx.DataFormat(wx.DF_ENHMETAFILE))
success4 = wx.TheClipboard.IsSupported(wx.DataFormat(wx.DF_FILENAME))
success5 = wx.TheClipboard.IsSupported(wx.DataFormat(wx.DF_LOCALE))
print("success"+str(success))
print("success2"+str(success2))
print("success3" + str(success3))
print("success4" + str(success4))
print("success5" + str(success5))
if success2:
text_obj = wx.TextDataObject()
if wx.TheClipboard.IsOpened() or wx.TheClipboard.Open():
if wx.TheClipboard.GetData(text_obj):
value = text_obj.GetText()
wx.TheClipboard.Close()
self.text.SetValue(value)
elif success4:
file_obj = wx.FileDataObject()
if wx.TheClipboard.IsOpened() or wx.TheClipboard.Open():
if wx.TheClipboard.GetData(file_obj):
value = file_obj.GetFilenames()
print(value[0])
wx.TheClipboard.Close()
self.text.SetValue(value[0])
else:
event.Enable(False)
self.text.SetValue("You can't paste. :(")
app = wx.App(False)
f = MyFrame(None)
f.Show()
app.MainLoop()