我的标题可能看起来有点模棱两可,所以这里有一个解释
像Pycharm
或Visual Studio Code
这样的专业IDE允许复制文件夹,导航到特定目录并粘贴到那里。我还想实施这一点
但就我而言,shutil.copytree needs 2 arguments - source folder and destination folder.
那么,是否有任何方法可以复制文件夹,在资源管理器中导航,单击“粘贴”或按ctrl+v
将文件夹复制或粘贴到那里,而不像shutil.copytree
用户已经需要提供路径
目前,我有一个将文件夹名称复制到剪贴板的代码
import os
import tkinter as tk
import tkinter.ttk as ttk
import clipboard
class App(tk.Frame):
def __init__(self, master, path):
tk.Frame.__init__(self, master)
self.tree = ttk.Treeview(self)
ysb = ttk.Scrollbar(self, orient='vertical', command=self.tree.yview)
xsb = ttk.Scrollbar(self, orient='horizontal', command=self.tree.xview)
self.tree.configure(yscroll=ysb.set, xscroll=xsb.set)
self.tree.heading('#0', text=path, anchor='w')
abspath = os.path.abspath(path)
root_node = self.tree.insert('', 'end', text=abspath, open=True)
self.process_directory(root_node, abspath)
self.tree.bind("<Control-c>",self.copy_to_clipboard)
self.tree.grid(row=0, column=0)
ysb.grid(row=0, column=1, sticky='ns')
xsb.grid(row=1, column=0, sticky='ew')
self.grid()
def copy_to_clipboard(self,event,*args):
item = self.tree.identify_row(event.y)
clipboard.copy(self.tree.item(item,"text"))
def process_directory(self, parent, path):
try:
for p in os.listdir(path):
abspath = os.path.join(path, p)
isdir = os.path.isdir(abspath)
oid = self.tree.insert(parent, 'end', text=p, open=False)
if isdir:
self.process_directory(oid, abspath)
except PermissionError:
pass
root = tk.Tk()
path_to_my_project = 'C:\\Users\\91996\\Documents'
app = App(root, path=path_to_my_project)
app.mainloop()
您应该将文件或目录的“复制”值保留为内部变量,并且只将其回显到剪贴板。这样,您将享受与上述IDE相同的bahavior
请参阅函数
copy_
和paste_
对于windows,可以使用Powershell命令^{} 。要运行此命令,请使用子流程模块。既然文件/文件夹已被复制,您现在可以使用ctrl+v或右键单击上下文菜单将其粘贴到文件资源管理器中
要处理粘贴,只需使用tkinter提供的
clipboard_get()
,它将为您提供文件/文件夹的路径。然后,您可以使用shutil.copy
/shutil.copytree
从应用程序中的src复制内容然后,可以重新加载树视图以使更改可见
例如:
如果你想让它与其他操作系统一起工作,你必须找到相应的命令eg
或者,您也可以使用win32clipboard、1,或者可以使用PyQt/pyslide的QClipboard或PyGTKclipboard,它们提供了方便的方法来执行这些类型的操作
注意:此答案不能回答OP的问题,因为它可以从外部文件浏览器复制到tkinter应用程序中选择的文件夹中,但不能按照OP的要求复制到相反的文件夹中
首先,为了便于检索项目的绝对路径,我在树中使用绝对路径作为项目标识符
然后,为了实现粘贴部分,我添加了一个
.paste()
方法,用Ctrl+V调用。在这种方法中,我通过获取当前选定的项目来获取目标文件夹。如果此项目是一个文件,则我使用父文件夹作为目标。我从剪贴板获取要复制的文件/文件夹的路径。如果它是一个文件,我使用shutil.copy2(src, dest)
。因为即使文件已经存在于dest
中,它也会复制该文件,所以您可能需要在选中该文件并显示messagebox之前添加一些代码。如果源是文件夹,我使用shutil.copytree(src, os.path.join(dest, src_dirname))
,其中src_dirname
是复制文件夹的名称正如评论中所建议的,我使用了tkinter的方法
.clipboard_clear()
、.clipboard_append()
和.clipboard_get()
,而不是使用clipboard
模块在
.copy_to_clipboard()
中,我建议您使用self.tree.focus()
而不是self.tree.identify_row(y)
,以便获取所选项目,而不是鼠标光标下方的项目(我刚刚在代码中的相关行旁边添加了一条注释,但没有实现此建议)代码如下:
从tkinter应用程序复制到外部文件浏览器的部分实现:在这个方向上复制的问题是,它是特定于平台的,因为不同平台对剪贴板的处理方式不同。以下解决方案适用于我在Linux中、在XFCE桌面环境中以及使用Thunar文件浏览器
我使用klembord库访问系统的剪贴板,其内容比纯文本更丰富。如果已将文件/文件夹复制到剪贴板,则可以在Thunar中粘贴该文件/文件夹
其中
abspath
是文件/文件夹的HTML转义绝对路径要将其实现到
App
,请导入klembord
和urllib.parse
并替换在
.copy_to_clipboard()
中相关问题 更多 >
编程相关推荐