【问题标题】:Why does asksaveasfilename not return the file type?为什么 asksaveasfilename 不返回文件类型?
【发布时间】:2018-12-15 07:30:00
【问题描述】:

Tkinter 是一个很棒的包,filedialog 有一些非常有用的功能。 askopenfilename 和 asksaveasfilename 都具有 'filetypes' 属性,但它们的工作方式不同。

使用 askopenfilename,它在 GUI 中提供选项并返回文件类型,但是

使用 asksaveasfilename,它仅在 GUI 中提供选项,不返回文件类型。示例代码如下所示:

import tkinter as tk 
from tkinter import filedialog 


old_file_name = filedialog.askopenfilename(title = "Choose file",filetypes=\
                                       (('All files','*.*'),\
                                        ('tagData','*.tagData'),\
                                        ('FDAX files','*.fdax'),\
                                        ('CSV files','*.csv')))

new_file_name = filedialog.asksaveasfilename(initialdir = "/",filetypes=\
                                         (('tagData','*.tagData'),\
                                          ('FDAX files','*.fdax'),\
                                          ('CSV files','*.csv'),\
                                          ('XLS files','*.xls')))

print(old_file_name)
print(new_file_name)

输出:

 C:/Users/christian.abbott/Desktop/FDAX_Error/example.csv
 C:/Users/christian.abbott/Desktop/example

我一直在寻找好的 filedialog 文档,但一直找不到。为什么包会这样?是否有更好的选择来提取用户提示文件路径的完整路径?

【问题讨论】:

  • 第二种情况下example是怎么选的?您是在对话框中输入example,还是在GUI 中双击该选项?
  • 我的测试都给出了使用filedialog.asksaveasfilename时的扩展名。

标签: python python-3.x tkinter openfiledialog filedialog


【解决方案1】:

这与 tkinter 无关。默认情况下,Windows 文件资源管理器对您隐藏文件扩展名。因此,当您在文件资源管理器中看到“示例”文件时,Windows 就是在欺骗您。 实际 文件名是“example.csv”。大多数程序(包括 python)不会说谎,并且会显示实际的文件名。

对于输入文件名 tkinter 使用操作系统文件选择小部件并只显示它返回的任何内容。我用Win7测试了它,它没有包含扩展;但是在 Debian Jessie 中确实如此。如果没有,您可以随时添加一些代码来为用户执行此操作:

if not new_file_name.endswith(('tagData','fdax','csv','xls')):
    new_file_name += '.csv'

在开始菜单中搜索“显示扩展程序”,您可以关闭此“功能”。

【讨论】:

  • 这与我的测试不匹配;在我的测试中,tkinter 会自动包含扩展。
  • @user2357112 嗯,很有趣。它似乎取决于操作系统(我想这是有道理的)。我用 python 3.6、tcl 8.6 测试了 OPs 代码,但没有包含扩展。但是在 Linux、python 3.4、tcl 8.6 中确实如此。
  • 我并不担心看到文件扩展名,而是担心 python 返回什么。 Python 返回带有 askopenfilename 的完整路径(包括扩展名),但不包括带有 asksaveasfilename 的扩展名,即使在 GUI 下拉菜单中选择了文件扩展名。我正在运行 Windows 7。
【解决方案2】:

我在 Windows 10 上使用 Python 3 时遇到了同样的问题。我设法通过删除文件类型元组中句点之前的 * 来解决它。希望以下更改可以满足您的要求:

  new_file_name = filedialog.asksaveasfilename(initialdir = "/",filetypes=\
                                     (('tagData','.tagData'),\
                                      ('FDAX files','.fdax'),\
                                      ('CSV files','.csv'),\
                                      ('XLS files','.xls')))

这对我有用,祝你好运!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-21
    • 2015-06-26
    • 2021-12-15
    • 2013-11-13
    • 2019-03-30
    • 1970-01-01
    相关资源
    最近更新 更多