首页 > 编程问答 >如何将字典放入剪贴板以将其复制/粘贴到另一个 pyqt6 窗口中?

如何将字典放入剪贴板以将其复制/粘贴到另一个 pyqt6 窗口中?

时间:2024-07-23 04:36:44浏览次数:13  
标签:python clipboard pyqt6

我想使用剪贴板将字典从 Qapplication 传递到另一个应用程序。

我可以复制文本,但我不明白如何传递其他内容。我需要传递一个字典而不是文本。

这是一个最小的示例,我可以启动该软件两次并将文本复制到另一个:

import sys
import numpy as np
from PyQt6.QtGui import *
from PyQt6.QtCore import *
from PyQt6.QtWidgets import *


class MainWindow(QMainWindow):
    def __init__(self, parent=None):
        super(MainWindow, self).__init__()
        self.centralWidget = QWidget()
        self.setCentralWidget(self.centralWidget)
        self.mainHBOX = QVBoxLayout()

        self.layout = QVBoxLayout()
        self.Text_EL = QLineEdit('Some Text')
        self.Copy_PB = QPushButton('Copy to ClipBoard')
        self.Paste_PB = QPushButton('Paste from ClipBoard')


        self.layout.addWidget(self.Text_EL)
        self.layout.addWidget(self.Copy_PB)
        self.layout.addWidget(self.Paste_PB)

        self.mainHBOX.addLayout(self.layout)


        self.centralWidget.setLayout(self.mainHBOX)
        self.centralWidget.setFixedSize(QSize(300,400))
        self.Copy_PB.clicked.connect(self.Copy_fun)
        self.Paste_PB.clicked.connect(self.Paste_fun)


    def Copy_fun(self):
        # copy into clipboard
        text = self.Text_EL.text()

        # send a dictionary instead of a string
        MyDict = {'text':text}

        cb = QApplication.clipboard()
        cb.clear(mode=QClipboard.Mode.Clipboard)
        cb.setText(text, mode=QClipboard.Mode.Clipboard)

    def Paste_fun(self):
        # Paste from clipboard
        cb = QApplication.clipboard()
        text = cb.text()
        self.Text_EL.setText(text)


if __name__ == "__main__":
    app = QApplication(sys.argv)
    window = MainWindow()
    window.show()
    sys.exit(app.exec())

我尝试使用 QMimeData 进行一些操作,但似乎它无法处理词典

def Copy_fun(self):
    # copy into clipboard
    text = self.Text_EL.text()

    # send a dictionary instead of a string
    MyDict = {'text':text}

    clipboard = QGuiApplication.clipboard()
    data = QMimeData()
    data.setData(MyDict)
    clipboard.setMimeData(data, mode=QClipboard.Mode.Clipboard)

可以通过先使用 pickle 模块将字典序列化来将字典放入剪贴板。以下是操作方法:

import sys
import pickle
import numpy as np
from PyQt6.QtGui import *
from PyQt6.QtCore import *
from PyQt6.QtWidgets import *


class MainWindow(QMainWindow):
    def __init__(self, parent=None):
        # ...(现有的 __init__ 代码)...

    def Copy_fun(self):
        # 复制到剪贴板
        text = self.Text_EL.text()

        # 发送字典而不是字符串
        MyDict = {'text': text}

        # 序列化字典
        serialized_data = pickle.dumps(MyDict)

        cb = QApplication.clipboard()
        cb.clear(mode=QClipboard.Mode.Clipboard)
        cb.setText(serialized_data.decode(), mode=QClipboard.Mode.Clipboard)

    def Paste_fun(self):
        # 从剪贴板粘贴
        cb = QApplication.clipboard()
        text = cb.text()

        try:
            # 尝试反序列化数据
            data = pickle.loads(text.encode())
        except pickle.UnpicklingError:
            # 如果文本不是有效的 pickle 数据,则处理错误
            print("剪贴板中的无效数据")
            return

        self.Text_EL.setText(data.get('text', ''))

# ...(现有的代码的其余部分)...

说明:

  1. 导入 pickle 在文件顶部添加 import pickle
  2. 序列化: Copy_fun 中,使用 pickle.dumps() MyDict 字典序列化为字节字符串。然后,使用 .decode() 将字节字符串转换为字符串,因为 QClipboard.setText 需要一个字符串参数。
  3. 反序列化: Paste_fun 中,使用 pickle.loads() 将来自剪贴板的字符串反序列化回字典。我们使用 try-except 块来优雅地处理 pickle.UnpicklingError (如果剪贴板数据不是有效的 pickle 对象,则可能会发生这种情况)。
  4. 错误处理: 添加一个 try-except 块来捕获 Paste_fun 中的反序列化错误。这可以防止因试图粘贴无效数据而导致程序崩溃。

现在,应该能够将字典复制到一个 PyQt6 应用程序的剪贴板,并将该字典粘贴到另一个 PyQt6 应用程序或支持序列化 Python 对象的任何其他应用程序。

标签:python,clipboard,pyqt6
From: 78352244

相关文章

  • 无法在 python 中安装 pip install expliot - bluepy 的 Building Wheel (pyproject.t
    在此处输入图像描述当我尝试在Windows计算机中通过cmd安装pipinstallexpliot包时,我收到2个错误名称×Buildingwheelforbluepy(pyproject.toml)didnotrunsuccessfully.│exitcode:1**AND**opt=self.warn_dash_deprecation......
  • python 用单斜杠-反斜杠替换url字符串中的双斜杠
    我的URL包含错误的双斜杠(“//”),我需要将其转换为单斜杠。不用说,我想保持“https:”后面的双斜杠不变。可以在字符串中进行此更改的最短Python代码是什么?我一直在尝试使用re.sub,带有冒号否定的正则表达式(即,[^:](//)),但它想要替换整个匹配项(包括前面......
  • 如何使用 Selenium Python 搜索 Excel 文件中的文本
    我有一些数据在Excel文件中。我想要转到Excel文件,然后搜索文本(取自网站表),然后获取该行的所有数据,这些数据将用于在浏览器中填充表格。示例:我希望selenium搜索ST0003然后获取名称,该学生ID的父亲姓名,以便我可以在大学网站中填写此信息。我想我会从网站......
  • Python 套接字请求在很多情况下都会失败
    我在python中尝试了超过5种不同的方法,尽管人们说它在其他论坛上有效,但所有这些方法都惨遭失败。importsocketmessage="test"clientsocket=socket.socket(socket.AF_INET,socket.SOCK_STREAM)clientsocket.connect(('1.1.1.1',80))clientsocket.send(mes......
  • Python 网络套接字
    我一直尝试通过Python访问该网站的websocket,但是需要绕过CloudFlare,现在我尝试通过cookie进行绕过,但是这不起作用。我已经尝试在没有cookie的情况下执行此操作,但这也不起作用。importwebsocketimportbase64importosdriver=selenium.webdriver.Firefox()driver.ge......
  • 如何在Python中使用Selenium提取data-v-xxx?
    因为我想查看每个class='num'内的文本是否大于0。如果测试通过,那么我需要获取venuen-name内的文本。我观察到,data-v是相同的。所以我的方法是获取相同的data-v-<hashvalue>来查找场地名称。我尝试了不同的方法来提取,但仍然无法提取。有什么建议吗?这是DOM<div......
  • Python:添加异常上下文
    假设我想提出一个异常并提供额外的处理信息;最好的做法是什么?我想出了以下方法,但对我来说有点可疑:definternal_function():raiseValueError("smellysocks!")defcontext_function():try:internal_function()exceptExceptionase:......
  • 【视频】Python遗传算法GA优化SVR、ANFIS预测证券指数ISE数据-CSDN博客
    全文链接:https://tecdat.cn/?p=37060本文旨在通过应用多种机器学习技术,对交易所的历史数据进行深入分析和预测。我们帮助客户使用了遗传算法GA优化的支持向量回归(SVR)、自适应神经模糊推理系统(ANFIS)等方法,对数据进行了特征选择、数据预处理、模型训练与评估。实验结果表明,这些方法......
  • Python学习笔记42:游戏篇之外星人入侵(三)
    前言在之前我们已经创建好了目录,并且编写好了游戏入口的模块。今天的内容主要是讲讲需求的分析以及项目各模块的代码初步编写。在正式编写代码前,碎碎念几句。在正式编写一个项目代码之前,实际是有很多工作要做的。就项目而言,简单的定项,需求对齐,项目架构设计,实际的代码编写,......
  • Python入门知识点 5--流程控制语句
    先来分享一个pycharm使用小技巧   红色波浪线:提醒可能报错   黄色波浪线:提醒书写不规范,ctrl+alt+l去掉黄线   code--Reformatcode,就可以去掉黄线,调整代码格式1、程序三大执行流程(1)顺序执行        程序执行时,代码从上往下,从左往右执行,中间......