【问题标题】:Menu in python tkinter: save file to a new directorypython tkinter中的菜单:将文件保存到新目录
【发布时间】:2019-11-22 03:48:28
【问题描述】:

我的 python tkinter GUI 程序在执行一些操作后正在编写一个文本文件。我想添加一个导出菜单,以便用户可以将此文件保存到 U 盘或另一个目录中。 (我知道我们可以进行正常的复制粘贴)。但我想添加这个导出菜单。我想要实现的是,当用户单击此导出菜单时,当前目录应该打开,并且用户可以选择文件(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()

【问题讨论】:

  • @user10987432 这是一个文本编辑器案例。就我而言,该文件已经存在(myData.txt)。我只想通过导出选项保存到另一个目录。

标签: python file tkinter


【解决方案1】:

首先,你需要再导入 2 个东西

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)

【讨论】:

    【解决方案2】:

    如果您不介意使用不寻常的模块,您可以继续阅读解决方案。 要制作文件的副本,请使用 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() 传递给外部命令时不需要引用。 如果指定了文本,则表示是以二进制模式(默认)还是文本模式打开文件。在某些平台上,这没有什么区别。 mkstemp() 返回一个元组,其中包含一个打开文件的操作系统级句柄(由 os.open() 返回)和该文件的绝对路径名,按此顺序。

    当然,您必须在其中插入文件内容。

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

    您执行它们的顺序是创建新文件并添加文本。 你可能想知道我从哪里得到代码和文档,所以我告诉你。 我得到了代码和文档here

    【讨论】:

    • 我不想删除我的旧文件。我只想在新目录中保存一份副本。
    • 嗨。感谢您的回复。我想我应该让我的问题更清楚。我想要完成的是打开当前目录,然后选择我的文本文件(当前目录中已经存在)并选择一个新目录并将其保存在新目录中。它应该也可以在 Linux 平台上运行。
    • 好的,那你就不用删除你的文件了,你检查它是否有效?
    【解决方案3】:

    tkinter.filedialog 中使用askdirectory()。打开一个普通的文件对话窗口,并以字符串形式返回选择的目录。

    from tkinter.filedialog import askdirectory
    file = askdirectory(initialdir='/', title='Select File')
    

    然后您应该能够使用 write 函数将其保存到其他地方:

    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 是的,第二个代码块应该在Export_File(),抱歉造成混淆。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-24
    • 1970-01-01
    • 2013-09-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多