我们在使用电脑的时候都知道可以使用复制和粘贴文本。到我们复制一些东西的时候,它会进入一个名为“剪贴板”的位置。大多数程序都提供对某种类型的剪贴板的访问,无论是在程序本身还是系统剪贴板,都允许将项目复制到其他应用程序。wxPython GUI工具包还提供了剪贴板访问,您可以使用它将文本复制到程序内部,甚至复制到系统剪贴板。我们还可以将图像复制到剪贴板。
一、wx.TheClipboard
wx.TheClipboard是用于操作剪贴板的类。要使用剪贴板,需要调用全局wx.TheClipboard对象的成员函数。在进行拷贝或者粘贴的动作之前,必须先通过wx.TheClipboard.Open获得剪贴板的控制权,如果这个函数返回成功,则表示已经获得了剪贴板的控制权,可以调用wx.TheClipboard.SetData来将数据拷贝到剪贴板上,或者调用wx.TheClipboard.GetData函数从剪贴板上获取数据。最后,需要调用wx.TheClipboard.Close函数来释放剪贴板的控制权。一旦不使用剪贴板了,应该尽快释放掉剪贴板的控制权。
wx.TheClipboard常用方法:
-
AddData(self, data):调用此函数将数据对象添加到剪贴板。
-
Clear(self):如果可能,清除全局剪贴板对象和系统的剪贴板。
-
Close(self):调用此函数关闭剪贴板,使用Open打开它。
-
Flush(self):刷新剪贴板:这意味着即使应用程序退出(可能会消耗内存),当前剪贴板上的数据仍将保持可用,否则退出时剪贴板将被清空。
-
static Get():返回剪贴板对象的全局实例(wx.TheClipboard)。
-
GetData(self, data):调用此函数用剪贴板上的数据填充数据(如果所需格式可用)。成功时返回True。
-
IsOpened(self):如果剪贴板已打开,则返回True。
-
Open(self):调用此函数在调用SetData和GetData之前打开剪贴板。
-
SetData(self, data):调用此函数将数据对象设置为剪贴板。新的数据对象将替换之前设置的任何数据对象,因此如果应用程序希望以几种不同的格式提供剪贴板数据,则必须使用支持所有格式的复合数据对象,而不是使用不同的数据对象多次调用此函数,因为这将只会在剪贴板中留下最后一个数据对象的数据。调用此函数后,剪贴板拥有数据,因此不要显式删除数据。
二、剪贴板使用演示
#如何使用剪贴板
import wx
class SampleClipboard(wx.Frame):
def __init__(self, *args, **kw):
super(SampleClipboard, self).__init__(*args, **kw)
self.InitUi()
def InitUi(self):
self.SetTitle("实战wxPython: 如何使用剪贴板")
self.SetSize(400, 300)
panel = wx.Panel(self)
lbl = wx.StaticText(panel, label="输入复制到剪贴板的文本:")
self.text = wx.TextCtrl(panel, style = wx.TE_MULTILINE)
btnCopy = wx.Button(panel, label="复制")
btnCopy.Bind(wx.EVT_BUTTON, self.OnCopy)
btnCopyFlush = wx.Button(panel, label="复制并刷新")
btnCopyFlush.Bind(wx.EVT_BUTTON, self.OnCopyAndFlush)
sizer = wx.BoxSizer(wx.VERTICAL)
sizer.Add(lbl, 0, wx.ALL, 5)
sizer.Add(self.text, 1, wx.EXPAND)
sizer.Add(btnCopy, 0, wx.ALL|wx.CENTER, 5)
sizer.Add(btnCopyFlush, 0, wx.ALL|wx.CENTER, 5)
panel.SetSizer(sizer)
self.Centre()
def OnCopy(self, e):
self.dataObj = wx.TextDataObject()
self.dataObj.SetText(self.text.GetValue())
if wx.TheClipboard.Open():
wx.TheClipboard.SetData(self.dataObj)
wx.TheClipboard.Close()
else:
wx.MessageBox("不能打开剪贴板", "错误")
def OnCopyAndFlush(self, e):
self.dataObj = wx.TextDataObject()
self.dataObj.SetText(self.text.GetValue())
if wx.TheClipboard.Open():
wx.TheClipboard.SetData(self.dataObj)
wx.TheClipboard.Flush()
else:
self.dataObj.SetText(self.text.GetValue())
self.Close()
def main():
app = wx.App()
sample = SampleClipboard(None)
sample.Show()
app.MainLoop()
if __name__ == "__main__":
main()
运行上面的代码,可以看到,在窗口的下方包含两个按钮,下面包含两个按钮,其中一个按钮复制添加到文本控件中的任何文本,然后您可以将其粘贴到其他地方,例如文本框、搜索引擎或其他地方。另一个按钮也复制到剪贴板,然后在刷新数据后关闭应用程序。可以看到即使在应用程序关闭后,数据在系统剪贴板中仍然可用。
这段代码的核心在按钮事件处理程序中。重点是wx.TextDataObject,它将存储来自文本控件的数据。接下来,尝试打开剪贴板。如果成功,我们将文本添加到剪贴板,然后关闭它。现在数据就可以粘贴了。如果我们向剪贴板复制一个位图,使用wx.BitmapDataObject位图数据对象即可。
![](https://img-blog.csdnimg.cn/ac83a6d3db5242659a12d41cb6f42a31.png)
图1:使用剪贴板
三、本文知识点
- 了解wxPython中的数据对象。
- 使用wx.TheClipboard实现剪贴板功能。
前一篇:实战wxPython:052 - 在程序中使用拖放