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

如果我在filetypes使用多于1个点作为asksaveasfilename它将返回没有任何文件types的名称。

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

例:

  • 在这里select"two dots"扩展,如果我在文件名框中inputhello ,则返回hello作为名称,而不是hello.zz.zz
  • 在这里select"one dot"扩展名,如果我在文件名框中inputhello ,它会正确返回hello.zz

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

要清楚,我不是要求解决方法…因为这是一个非常容易的事情在这里做。 我只是问为什么会发生这种情况。


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

问题不在于有两个点,问题是在点后面有一个“非单词字符”。 例如,如果使用模式“.zz @”或“。#hash”,则会看到相同的行为。

过滤器是一种搜索机制,不一定要设置扩展名。 也许它应该是设置扩展名,但不是。 该对话框旨在为您提供默认扩展名。 如果你不这样做,这个行为是特定于平台的。 defaultextension选项的规范文档说这(重点增加):

指定一个字符串,如果用户输入一个没有扩展名的文件名,这个字符串将附加到文件名中。 缺省值是空字符串,这意味着在任何情况下都不会将扩展名附加到文件名中。 这个选项在Mac OS X上被忽略,不需要扩展名, UNIX实现在没有提供-filetypes选项的情况下猜测合理的值。

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

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

你省略了“违约”的论点。 “”的意思是增加扩展。 在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帮助