需求
前段时间有这样一个需求,要读取用户的剪贴板的内容,然后把剪贴板的信息复制到另一个地方。例如:
- 当用户复制的是图片时,把图片复制到一个指定位置。
- 当用户复制的是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()