Python tkinter:如何在asksaveasfilename对话框中让用户选择文件类型?

Python tkinter:如何在asksaveasfilename对话框中让用户选择文件类型?,python,tkinter,Python,Tkinter,目前,我正在编程一个GUI,它应该允许用户保存一个文件并选择文件类型,比如:jpg,bmp。我将tkinter与Python3.4一起使用 不幸的是,我无法确定用户选择了哪种文件类型:我正在使用asksaveasfilename对话框,我只能得到路径: from tkinter import filedialog path = filedialog.asksaveasfilename(filetypes = [('Bitmap', '.bmp'),('jpg', '.jpg')]) 我可以尝试

目前,我正在编程一个GUI,它应该允许用户保存一个文件并选择文件类型,比如:jpg,bmp。我将tkinter与Python3.4一起使用

不幸的是,我无法确定用户选择了哪种文件类型:我正在使用asksaveasfilename对话框,我只能得到路径:

from tkinter import filedialog
path = filedialog.asksaveasfilename(filetypes = [('Bitmap', '.bmp'),('jpg', '.jpg')])
我可以尝试从路径中提取扩展,但这可能导致意外行为:

如果用户未在文件名中提供扩展名,但选择了文件类型,则path不包含任何扩展名 如果用户首先决定使用文件名example.bmp,但随后选择jpg作为文件类型,则扩展名不会像通常在窗口中那样为updatet。所以路径仍然是:C:\\example.bmp 是否有方法获取用户选择的文件类型?
还有别的办法吗?

当我遇到自动更新扩展的问题时,我被你的问题绊倒了。显然,您可以尝试以下方法:


这一个与OpenDialog几乎相同,只是我们没有过滤文件,而是能够自动将特定扩展名附加到用户的输入中。也可以传入一个文件类型描述和扩展名的元组列表,然后填充“另存为文件类型”下拉列表,但唯一要做的是过滤显示的文件。实际上是FileExtension参数将扩展附加到返回值。

我认为您唯一的办法是在返回值上使用类似的内容。这就是我目前正在做的。但如例2中所述,扩展名可以是.bmp,尽管用户选择png作为文件类型-因此,当我使用os.path.splittext时,文件将保存为bmp,尽管用户明确选择png作为文件类型。用户选择的文件类型仅影响用户在对话框中显示的文件列表中看到的内容。返回的内容是用户想要的-因此使用splitext是正确的。要检查扩展名的文件类型Regerdles,您需要检查文件幻数,即。python中有第三方模块用于此。如果你只关心很少的文件,那么检查数字就相对容易了。@martineau:用户想要类似windows的行为,而tkinter不幸没有提供。是的,在windows中,文件类型不影响用户在“另存为”对话框中看到的内容,但它直接影响文件类型。例如,在Ms Paint中:我可以在example.jpg文件名下以bmp格式保存图像。结果是文件的扩展名不正确,但在windows下应该是这样的。
pythonaddins.SaveDialog = saveFileDialog