tkinter asksaveasfilename在文件扩展名中不能使用多个点

时间:2017-10-01 13:08:00

标签: linux python-3.x tkinter

如果我在filetypes asksaveasfilename中使用多于1个点,则返回没有任何文件类型的名称。

import tkinter as tk
root = tk.Tk()
file_name = tk.filedialog.asksaveasfilename(
            filetypes= [("two dots", ".zz.zz"), ("one dot", ".zz") ])
print(file_name)

示例:

  • 在此处选择"two dots"扩展名,如果我在文件名框中输入hello,则会返回hello作为名称,而不是hello.zz.zz
  • 在此处选择"one dot"扩展名,如果我在文件名框中输入hello,则会正确返回hello.zz

这有明显的原因吗?这是一个错误吗?

要明确我不要求解决方法......因为这在这里很容易做到。我只想问为什么会这样。

我已经尝试过defaultextension。无论我放在那里,它都会完全接管filetypes。我的意思是,它会重写我选择的任何文件类型。例如,如果我选择defaultextension = ".x".x格式,.zz将返回.zz.zz格式,除非我自己写出扩展名,从而消除了从中选择文件类型的全部要点菜单。顺便说一句,我在Linux(Mint)上。

2 个答案:

答案 0 :(得分:1)

问题不在于有两个点,问题是你在点之后有一个“非单词字符”。例如,如果使用模式“.zz @”或“。#hash”

,您将看到相同的行为

过滤器是一种搜索机制,不一定用于设置扩展名。也许它应该用于设置扩展,但事实并非如此。该对话框旨在为您提供默认扩展名。如果不这样做,则行为是特定于平台的。 dplyr选项的规范文档说明了这一点(强调添加):

  

如果用户输入没有扩展名的文件名,则指定将附加到文件名的字符串。默认值为空字符串,这意味着在任何情况下都不会将扩展名附加到文件名。在Mac OS X上忽略此选项,它不需要扩展文件名,并且 UNIX实现在未提供此文件的情况下从-filetypes选项猜测合理的值。

不幸的是,这个“猜测”并不处理第一个点后面有非单词字符的情况。它真的很简单。 Tkinter(或者更准确地说,底层的tk库)只有在匹配点后跟字母,数字或下划线时才会使用该模式。

答案 1 :(得分:0)

对于涉及文件系统的问题,请包含操作系统,因为这会影响详细信息。在Windows 10上,我没有添加任何扩展名。也许您正在使用Linux。对于Mac,您应该添加Mac文件类型。请参阅tk doc

您省略了'defaultextension'参数。值''表示'添加延伸。在Mac上,''是不允许的,必须选择一些非空的默认值。以下内容适用于我添加任一扩展名。

import tkinter as tk
from tkinter import filedialog

root = tk.Tk()
file_name = filedialog.asksaveasfilename(
            filetypes= (("two dots", ".zz.zz"), ("one dot", ".zz")),
            defaultextension='')
print(file_name)

请注意你的单行太少了。见MCVE help