天天看點

wxpython 從剪貼闆讀取檔案,讀取文字,讀取圖像需求設計wxpython窗體的部分代碼

需求

前段時間有這樣一個需求,要讀取使用者的剪貼闆的内容,然後把剪貼闆的資訊複制到另一個地方。例如:

  • 當使用者複制的是圖檔時,把圖檔複制到一個指定位置。
  • 當使用者複制的是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()