实战wxPython:053 - 使用剪贴板

2023-11-07

我们在使用电脑的时候都知道可以使用复制和粘贴文本。到我们复制一些东西的时候,它会进入一个名为“剪贴板”的位置。大多数程序都提供对某种类型的剪贴板的访问,无论是在程序本身还是系统剪贴板,都允许将项目复制到其他应用程序。wxPython GUI工具包还提供了剪贴板访问,您可以使用它将文本复制到程序内部,甚至复制到系统剪贴板。我们还可以将图像复制到剪贴板。

一、wx.TheClipboard

wx.TheClipboard是用于操作剪贴板的类。要使用剪贴板,需要调用全局wx.TheClipboard对象的成员函数。在进行拷贝或者粘贴的动作之前,必须先通过wx.TheClipboard.Open获得剪贴板的控制权,如果这个函数返回成功,则表示已经获得了剪贴板的控制权,可以调用wx.TheClipboard.SetData来将数据拷贝到剪贴板上,或者调用wx.TheClipboard.GetData函数从剪贴板上获取数据。最后,需要调用wx.TheClipboard.Close函数来释放剪贴板的控制权。一旦不使用剪贴板了,应该尽快释放掉剪贴板的控制权。

wx.TheClipboard常用方法

  • AddData(selfdata):调用此函数将数据对象添加到剪贴板。
  • Clear(self):如果可能,清除全局剪贴板对象和系统的剪贴板。
  • Close(self):调用此函数关闭剪贴板,使用Open打开它。
  • Flush(self):刷新剪贴板:这意味着即使应用程序退出(可能会消耗内存),当前剪贴板上的数据仍将保持可用,否则退出时剪贴板将被清空。
  • static Get():返回剪贴板对象的全局实例(wx.TheClipboard)。
  • GetData(selfdata):调用此函数用剪贴板上的数据填充数据(如果所需格式可用)。成功时返回True。
  • IsOpened(self):如果剪贴板已打开,则返回True。
  • Open(self):调用此函数在调用SetData和GetData之前打开剪贴板。
  • SetData(selfdata):调用此函数将数据对象设置为剪贴板。新的数据对象将替换之前设置的任何数据对象,因此如果应用程序希望以几种不同的格式提供剪贴板数据,则必须使用支持所有格式的复合数据对象,而不是使用不同的数据对象多次调用此函数,因为这将只会在剪贴板中留下最后一个数据对象的数据。调用此函数后,剪贴板拥有数据,因此不要显式删除数据。

二、剪贴板使用演示

#如何使用剪贴板

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位图数据对象即可。

 图1:使用剪贴板

三、本文知识点

  • 了解wxPython中的数据对象。
  • 使用wx.TheClipboard实现剪贴板功能。

前一篇:实战wxPython:052 - 在程序中使用拖放

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

实战wxPython:053 - 使用剪贴板 的相关文章

  • 无法“安装”plpython3u - postgresql

    我正在尝试在 postgresql 中使用 python 语言 像这样的事情 create or replace function test a integer returns integer as if a 2 0 return even
  • Django 代理模型的继承和多态性

    我正在开发一个我没有启动的 Django 项目 我面临着一个问题遗产 我有一个大模型 在示例中简化 称为MyModel这应该代表不同种类的物品 的所有实例对象MyModel应该具有相同的字段 但方法的行为根据项目类型的不同而有很大差异 到目
  • 在 python 程序中合并第三方库的最佳实践是什么?

    下午好 我正在为我的工作编写一个中小型Python程序 该任务需要我使用 Excel 库xlwt and xlrd 以及一个用于查询 Oracle 数据库的库 称为CX Oracle 我正在通过版本控制系统 即CVS 开发该项目 我想知道围
  • 将 saxon 与 python 结合使用

    我需要使用 python 处理 XSLT 目前我正在使用仅支持 XSLT 1 的 lxml 现在我需要处理 XSLT 2 有没有办法将 saxon XSLT 处理器与 python 一起使用 有两种可能的方法 设置一个 HTTP 服务 接受
  • Python - StatsModels、OLS 置信区间

    在 Statsmodels 中 我可以使用以下方法拟合我的模型 import statsmodels api as sm X np array 22000 13400 47600 7400 12000 32000 28000 31000 6
  • PyUSB 1.0:NotImplementedError:此平台不支持或未实现操作

    我刚刚开始使用 pyusb 基本上我正在玩示例代码here https github com walac pyusb blob master docs tutorial rst 我使用的是 Windows 7 64 位 并从以下地址下载 z
  • 如何替换 pandas 数据框列中的重音符号

    我有一个数据框dataSwiss其中包含瑞士城市的信息 我想用普通字母替换带有重音符号的字母 这就是我正在做的 dataSwiss Municipality dataSwiss Municipality str encode utf 8 d
  • SQLALchemy .query:类“Car”的未解析属性引用“query”

    我有一个这里已经提到的问题https youtrack jetbrains com issue PY 44557 https youtrack jetbrains com issue PY 44557 但我还没有找到解决方案 我使用 Pyt
  • 如何在Python中获取葡萄牙语字符?

    我正在研究葡萄牙语 角色看起来很奇怪 我怎样才能解决这个问题 代码 import feedparser import random Vou definir os feeds feeds conf feedurl http pplware s
  • BeautifulSoup 中的嵌套标签 - Python

    我在网站和 stackoverflow 上查看了许多示例 但找不到解决我的问题的通用解决方案 我正在处理一个非常混乱的网站 我想抓取一些数据 标记看起来像这样 table tbody tr tr tr td td td table tr t
  • 添加不同形状的 numpy 数组

    我想添加两个不同形状的 numpy 数组 但不进行广播 而是将 缺失 值视为零 可能最简单的例子是 1 2 3 2 gt 3 2 3 or 1 2 3 2 1 gt 3 2 3 1 0 0 我事先不知道形状 我正在弄乱每个 np shape
  • Python 的“zip”内置函数的 Ruby 等价物是什么?

    Ruby 是否有与 Python 内置函数等效的东西zip功能 如果不是 做同样事情的简洁方法是什么 一些背景信息 当我试图找到一种干净的方法来进行涉及两个数组的检查时 出现了这个问题 如果我有zip 我可以写这样的东西 zip a b a
  • Pandas:merge_asof() 对多行求和/不重复

    我正在处理两个数据集 每个数据集具有不同的关联日期 我想合并它们 但因为日期不完全匹配 我相信merge asof 是最好的方法 然而 有两件事发生merge asof 不理想的 数字重复 数字丢失 以下代码是一个示例 df a pd Da
  • Fabric env.roledefs 未按预期运行

    On the 面料网站 http docs fabfile org en 1 10 usage execution html 给出这个例子 from fabric api import env env roledefs web hosts
  • 有人用过 Dabo 做过中型项目吗? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我们正处于一个新的 ERP 风格的客户端 服务器应用程序的开始阶段 该应用程序是作为 Python 富客户端开发的 我们目前正在评估 Dabo
  • 使用其构造函数初始化 OrderedDict 以便保留初始数据的顺序的正确方法?

    初始化有序字典 OD 以使其保留初始数据的顺序的正确方法是什么 from collections import OrderedDict Obviously wrong because regular dict loses order d O
  • 在 Qt 中自动调整标签文本大小 - 奇怪的行为

    在 Qt 中 我有一个复合小部件 它由排列在 QBoxLayouts 内的多个 QLabels 组成 当小部件调整大小时 我希望标签文本缩放以填充标签区域 并且我已经在 resizeEvent 中实现了文本大小的调整 这可行 但似乎发生了某
  • 从列表指向字典变量

    假设你有一个清单 a 3 4 1 我想用这些信息来指向字典 b 3 4 1 现在 我需要的是一个常规 看到该值后 在 b 的位置内读写一个值 我不喜欢复制变量 我想直接改变变量b的内容 假设b是一个嵌套字典 你可以这样做 reduce di
  • 如何使用 Pycharm 安装 tkinter? [复制]

    这个问题在这里已经有答案了 I used sudo apt get install python3 6 tk而且效果很好 如果我在终端中打开 python Tkinter 就可以工作 但我无法将其安装在我的 Pycharm 项目上 pip
  • 如何将输入读取为数字?

    这个问题的答案是社区努力 help privileges edit community wiki 编辑现有答案以改进这篇文章 目前不接受新的答案或互动 Why are x and y下面的代码中使用字符串而不是整数 注意 在Python 2

随机推荐

  • 算法专题之矩阵

    前言 矩阵相关的算法在互联网世界有着广泛的应用 比如图片的像素修改 上一小结介绍过 获取地图路径方案等 在数学中 一个矩阵说穿了就是一个二维数组 矩阵相关的基础算法也都是基于二维数组的基础上完成各类数据操作 本小节列举了前端面试中高频出现的
  • Error:fatal error C1010: unexpected end of file while looking for precompiled head

    场景 在VC6 0进行编写C 代码时 创建了一个 简单的程序 s 然后编译就爆出这个错误 场景复现 创建流程 点击左上角的 文件 然后点击 新建 在左上方选择工程 然后下方选择 Win32 Console Application 在右侧填写
  • 接口参数返回值 根据不同的值去改变样式

    改变接口返回值的样式 div class btn scope row notificationStatus div css部分 noticion active border 1px
  • ReactJS报错 React createElement error type is invalid — expected a string ...

    2019独角兽企业重金招聘Python工程师标准 gt gt gt Warning React createElement type is invalid expected a string for built in components
  • Lua中使用毫秒精度时间的方法

    这篇文章主要介绍了lua中使用毫秒精度时间的方法 本文讲解使用luasocket库实现毫秒精度时间 需要的朋友可以参考下 lua自带的时间函数只能到秒的精度 为了统计到毫秒精度的时间 可以使用luasocket 下载地址http files
  • 操作系统之线程

    一 线程简介 早期的计算机系统只允许一个任务独占系统资源 一次只能执行一个程序 由于对程序并发执行的需求 引入了多进程 进程的引入可以解决多任务支持的问题 但是也产生了新的问题 每个进程分别分配资源开销比较大 进程频繁切换导致额外系统开销
  • 用Docker部署SSM项目

    Docker环境的安装 卸载原有的环境 sudo yum remove docker docker client docker client latest docker common docker latest docker latest
  • java实现文件下载功能

    在工作中经常会遇到为文件下载的功能 但因为公司的各种下载时的要求不同 所以都在下载功能上或多或少的加减一些 今天就总结一下我写过的下载功能MVC的思想controller层 Description 下载 Param downloadPath
  • java 内部类面试题_面试题(一)关于内部类的面试题

    一 看下面代码求值 1 要求 使用已知的变量 在控制台输出30 20 10 2 classOuter 3 public int num 10 4 classInner 5 public int num 20 6 public voidsho
  • kvm限制虚拟主机流量带宽

    使用场景 在工作中需要对某一个主机进行网络限制 合理使用网络流量 操作方式 kvm限制主机流量需要修改xml文件 最好关机后操作 kvm的限制流量的计算方式为 限制带宽数 kb 8 xml所需要的数字 实例
  • [OpenHarmony RK3568] (一)环境搭建

    文章目录 一 概述 二 下载依赖和代码 2 1 安装对应依赖包 2 2 下载对应代码 2 2 1 git配置 2 2 2 安装repo 2 2 3 获取代码 三 开始编译 3 1 下载工具链 3 2 开始编译 一 概述 本系列文章会讲述RK
  • FBE中的Home界面FallbackHome

    FallbackHome FallbackHome继承Activity 是安卓系统启动后未解锁时的home界面 Settings程序AndroidManifest xml中定义了FallbackHome的intent filter 可以看到
  • Qt connect传参方式及lambda函数传参方式详解

    Qt connect传参方式及lambda函数传参方式详解 Qt是一种流行的跨平台C 应用程序框架 它提供了许多有用的工具和函数来帮助开发人员构建高效的图形用户界面和其他应用程序 其中 Qt Connect函数是用于连接信号和槽的重要函数之
  • 玩转Eclipse — 自动代码规范检查工具Checkstyle

    大项目都需要小组中的多人共同完成 但是每个人都有自己的编码习惯 甚至很多都是不正确的 那么如何使小组所有开发人员都遵循某些编码规范 以保证项目代码风格的一致性呢 如果硬性地要求每个开发人员在提交代码之前 都要对照的编码规范将自己的代码检查一
  • GPIO的工作模式、GPIO复用

    目录 1 GPIO 内部结构 2 GPIO 的 8种工作模式 3 GPIO 的复用 1 GPIO 支持多种外设的时候 如何区别 2 普通推挽输出 复用推挽输出的区别 1 GPIO 内部结构 GPIO 的电路是一堆电路 所以需要配置寄存器 来
  • 2023智慧物流服务指数研究报告

    物流定义 将运输 储存 装卸 搬运 包装 流通加工 配送 信息处理等基本功能实施有机结合 使物品从供应地向接收地进于实体流动的过程 物流产业大致可以分成运输环节 仓储环节 配送环节 数据服务环节 技术服务环节 智慧物流 是指以物联网技术为基
  • vs2008 ActiveX控件测试容器的生成以及调试ActiveX控件

    1 ActiveX控件测试容器的生成 用TSTCON生成测试容器 http msdn microsoft com zh cn library f9adb5t5 v vs 90 aspx 在搜索里搜索tstcon 双击TstCon文件夹 将此
  • Java——猜数字游戏(Random类和Scanner类的简单介绍案例)

    文章目录 猜数字游戏 Random随机数 Scanner 猜数字游戏 系统随机生成一个1 100的随机数 玩家通过键入自己猜测的数字 如果猜中了 则提示玩家赢了 游戏结束 否则提示用户大了或者小了 让玩家继续猜 玩家有十次机会 注 这是我今
  • NIO - 文件的简单操作

    1 将数据写进文件 public class NioFileChannelDemo1 public static void main String args throws Exception String str hello world 创
  • 实战wxPython:053 - 使用剪贴板

    我们在使用电脑的时候都知道可以使用复制和粘贴文本 到我们复制一些东西的时候 它会进入一个名为 剪贴板 的位置 大多数程序都提供对某种类型的剪贴板的访问 无论是在程序本身还是系统剪贴板 都允许将项目复制到其他应用程序 wxPython GUI