实现文件的拖放功能

实现文件的拖放功能

试想一下,我们希望将一个python项目文件夹或者脚本在IDE中打开,无论是去IDE中选择文件夹路径,还是选择脚本的打开方式,都需要花点力气去点击选中。再或者,我们想要在命令行下运行python脚本,并且需要传入一个文件路径参数,手敲路径还是挺麻烦的。要是上述这些情况能用拖放文件的方式代替,毋庸置疑是方便且轻松的。

PS:下面介绍的方法只在Windows下测试成功。

1 拖放文件至QT窗口

为了给QT窗口添加拖放文件至窗体内并执行操作的功能,这里举一个例子。我们写了一个简单的三维模型文件可视化软件,即使软件中有“打开文件”的选项,但是在有些情况下还是很麻烦。我们希望能够将模型文件直接拖进软件的窗口内进行可视化绘制。

1.1 实现方法

参考这篇文章:Qt主窗口实现拖拽文件,显示到文本框

在窗口初始化函数中添加一行

self.setAcceptDrops(True)  # 设置接受拖拽

然后重写dragEnterEventdropEvent两个方法

    def dragEnterEvent(self, a0: QtGui.QDragEnterEvent) -> None:  # 拖动进入事件
        if a0.mimeData().hasUrls():
            a0.acceptProposedAction()
        else:
            a0.ignore()

    def dropEvent(self, a0: QtGui.QDropEvent) -> None:  # 放下事件
        mimeData = a0.mimeData()
        if mimeData.hasUrls():
            urlList = mimeData.urls()
            filename = urlList[0].toLocalFile() # 得到了文件的路径
            if filename: # 下面便是对文件的相关操作
                # 绘制图形
                _, suffix = os.path.splitext(filename)
                self.SceneManager.ClearAll()
                if suffix == '*.xyz':  # 点云绘制
                    self.original_model = read_xyz(filename)
                    self.SceneManager.drawPdSrc(self.original_model, (241 / 255, 135 / 255, 184 / 255), point_size = 3)
                else:
                    self.original_model = ReadPolyData(filename).GetOutput()
                    self.SceneManager.drawPdSrc(self.original_model)
                self.SceneManager.display()

1.2 效果演示

请添加图片描述

2 拖放文件至python脚本

已知在windows系统中,python脚本文件为.py文件,该文件是不支持拖放其他文件到其上的。我们希望实现将其他文件拖放到脚本文件上,作为其输入参数,并运行脚本。

2.1 实现方法

新建一个pyfile_droppable.reg文件,输入以下内容并保存:

Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\Python.File\shellex\DropHandler]
@="{60254CA5-953B-11CF-8C96-00AA00B8708C}"

[HKEY_CLASSES_ROOT\Python.File\Shell\open\command]
@=""<python interpreter path>" "%L" %*"

双击运行此文件,完成注册表相关信息的添加。相关原理参考:Make Python Scripts Droppable in Windows

上面这个reg文件添加了两个项到注册表中,第3、4行的作用是使python脚本文件能接收拖放到它上面的文件(获取文件的路径),第6、7行的作用是指定运行python脚本的解释器路径。通过打开注册表查看发现,我们主要修改了下图中的两个地方。

image-20230814235158901

接着,我们新建一个测试脚本droppable_test.py,内容如下

import os
import sys

py_dir = os.path.dirname(__file__)  # 当前脚本所在的目录
result_path = os.path.join(py_dir, 'result.txt')  # 生成的结果文件放在脚本目录下
args = sys.argv
# 合并内容并生成新文件
with open(args[1], 'rb') as f:
    data1 = f.read()
with open(args[2], 'rb') as f:
    data2 = f.read()
with open(result_path, 'wb') as f:
    f.write(data1 + data2)
    print("文件合并成功!结果文件保存至:" + result_path)
input("按任意键关闭窗口...")

2.2 效果演示

请添加图片描述

注意多个文件作为参数传入py脚本的顺序为选中多个文件的顺序,即从上到下,从左到右。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值