Python Tkinter中的菜单:将文件保存到新目录

3

我的Python tkinter GUI程序在执行一些操作后会编写一个文本文件。我想添加一个导出菜单,以便用户可以将此文件保存到USB设备或其他目录中(我知道我们可以进行普通的复制粘贴)。但是我想添加这个导出菜单。我的目标是,当用户单击此导出菜单时,应该打开当前目录,并且用户可以选择文件(myData.txt已经创建并存在于当前目录中),然后用户现在可以选择新目录并将myData.txt保存在其中。(它应该在Linux平台上工作)

#My gui app creates a text file myData.txt in my current folder when I run the program. 

from tkinter import *
from tkinter import messagebox
import sys

def Export_File():
    #what do i need here???


windows = Tk()
menubar = Menu(windows)
filemenu = Menu(menubar, tearoff=0)
filemenu.add_command(label="Export", command =Export_File )

filemenu.add_command(label="Exit", command=Exit_File)
menubar.add_cascade(label="File", menu=filemenu)
windows.configure(menu=menubar)


windows.mainloop()

https://dev59.com/c2Ik5IYBdhLWcg3wN7xj - Paul M.
@user10987432 这是一个文本编辑器的情况。在我的情况下,文件已经存在(myData.txt)。我只想通过导出选项将其保存到另一个目录中。 - pythonLearner
3个回答

3

首先,您需要导入另外两个东西。

import os
from tkinter import filedialog

接下来,使用os模块将用户选择的目录分配给一个变量并进入该目录

def Export_File():
    dir_name = filedialog.askdirectory() # asks user to choose a directory
    os.chdir(dir_name) # changes your current directory

要检查当前目录,您可以始终

curr_directory = os.getcwd()
print(curr_directory)

1
使用tkinter.filedialog中的askdirectory()。打开一个普通的文件对话框窗口,并将所选目录作为字符串返回。
from tkinter.filedialog import askdirectory
file = askdirectory(initialdir='/', title='Select File')

您应该能够使用写入功能将其保存在其他位置:
def Export_File():
    file = open('myData.txt', 'w')
    saveHere = askdirectory(initialdir='/', title='Select File')

    file.write(os.path.join(saveHere, 'myData.txt'))

你是不是想把上面的所有代码都放在 def Export_File(): 函数里面? - pythonLearner
@pythonLearner 是的,第二个代码块应该在Export_File()中,对于混淆感到抱歉。 - LukeDev

0

如果您不介意使用一个不太常见的模块,您可以继续阅读解决方案。 要复制文件,您可以使用tempfile模块。 我将提供移动文件的代码以及代码的描述。

tempfile.mkstemp(suffix='', prefix='tmp', dir=None, text=False) - 创建新文件

以最安全的方式创建临时文件。假设平台正确实现了os.open()的os.O_EXCL标志,文件的创建中不存在竞争条件。该文件只能被创建用户ID读取和写入。如果平台使用权限位来指示文件是否可执行,则该文件不可被任何人执行。文件描述符不会被子进程继承。 与TemporaryFile()不同,mkstemp()的用户需要在完成后负责删除临时文件。 如果指定了后缀,则文件名将以该后缀结尾,否则将没有后缀。mkstemp()不会在文件名和后缀之间放置点号;如果需要,请将其放在后缀的开头。 如果指定了前缀,则文件名将以该前缀开头;否则将使用默认前缀。 如果指定了dir,则文件将在该目录中创建;否则将使用默认目录。默认目录是从一个平台相关列表中选择的,但应用程序的用户可以通过设置TMPDIR、TEMP或TMP环境变量来控制目录位置。因此,生成的文件名可能没有任何好的属性,例如在通过os.popen()传递给外部命令时不需要引用。 如果指定了text,则表示是否以二进制模式(默认)或文本模式打开文件。在某些平台上,这没有区别。 mkstemp()返回一个元组,其中包含一个操作系统级别的句柄,用于打开文件(与os.open()返回的相同),以及该文件的绝对路径名,按顺序排列。

当然,你必须将文件内容插入其中。

with open(file) as file:
    for line in file:
        new = open(file, 'a')
        new.write(line)

你需要按照顺序创建新文件,然后添加文本。 你可能会想知道我从哪里获取代码和文档,所以我告诉你。 我在这里获取了代码和文档。


我不想删除我的旧文件,我只想在一个新目录中保存一份副本。 - pythonLearner
嗨,谢谢回复。我想我应该让我的问题更清楚一些。我想要完成的是打开当前目录,选择我的文本文件(已经在当前目录中),选择一个新目录并将其保存在新目录中。它应该在Linux平台上工作。 - pythonLearner
好的,那么你就不需要删除你的文件了,你检查一下它是否能正常工作了吗? - Song

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接