另存为,每种文件类型都有不同的回调函数

Posted

技术标签:

【中文标题】另存为,每种文件类型都有不同的回调函数【英文标题】:Save As, each filetype has different callback function 【发布时间】:2019-06-25 08:46:39 【问题描述】:

我使用 python tkinter,并导入 tkinter.filedialog 以另存为文件。该程序具有保存每种文件类型的功能。

使用filedialog.asksaveasfilename 仅返回文件路径。

问题:如何获取文件类型,调用正确的函数?

下面是我所做的示例代码。

蟒蛇

filename= filedialog.asksaveasfilename(title="Select file", filetypes=(("PNG", "*.png"), ("EPS", "*.eps"), ("TXT", "*.txt"),  ("XML", "*.xml")))
if filetype is TYPE_1:
    function_1()
elif filetype is TYPE_2:
    function_2()

【问题讨论】:

“使用 filedialog.asksaveasfilename 仅返回文件路径。”。为什么不从返回的文件路径中获取扩展名并据此调用正确的函数呢?另外,旁注:不要使用is 比较字符串,它会检查两个对象实例是否相同,它不会比较两个字符串的内容。 你的想法行得通,但除非用户自己在文件名末尾写扩展名,否则文件名将不包含任何扩展名。有没有办法让扩展名自动附加到文件名? @GPhilo 【参考方案1】:

您可以将选项defaultextension='.' 添加到filedialog.asksaveasfilename(),然后用户在“保存对话框”窗口中选择的任何扩展名都将用作“默认扩展名”,并且该扩展名将附加到保存文件的路径.然后您可以使用os.path.splitext() 检索扩展名,如下所示。

我还为 filetypes= 选项使用了命名元组,因为我认为它看起来更好,但无论如何都没有必要。

import os
import tkinter as tk

from collections import namedtuple
from tkinter import filedialog


class MainApplication:
    def __init__(self, parent):
        self.b1 = tk.Button(parent, text='Save', command=self.save_dialog)
        self.b1.pack()

    def png(self):
        print('DO SOMETHING WHEN FILE EXT IS .PNG')

    def eps(self):
        print('DO SOMETHING WHEN FILE EXT IS .eps')

    def txt(self):
        print('DO SOMETHING WHEN FILE EXT IS .txt')

    def xml(self):
        print('DO SOMETHING WHEN FILE EXT IS .xml')

    def save_dialog(self):
        Types = namedtuple('Types', 'name ext')
        png = Types('PNG', '.png')
        eps = Types('EPS', '.eps')
        txt = Types('TXT', '.txt')
        xml = Types('XML', '.xml')
        path = filedialog.asksaveasfilename(title='Select file',
                                            defaultextension='.',
                                            filetypes=(png, eps, txt, xml)
                                            )
        filename, ext = os.path.splitext(path)
        if ext == png.ext:
            self.png()
        elif ext == eps.ext:
            self.eps()
        elif ext == txt.ext:
            self.txt()
        elif ext == xml.ext:
            self.xml()


if __name__ == '__main__':
    root = tk.Tk()
    MainApplication(root)
    root.mainloop()

【讨论】:

我按照您的示例进行操作,效果很好。谢谢!

以上是关于另存为,每种文件类型都有不同的回调函数的主要内容,如果未能解决你的问题,请参考以下文章

如何在 PHP 中使用 JavaScript 另存为函数?

文件相关操作 - 另存为

回调函数到底是怎么一回事?

将接受子类指针的回调函数统一管理

不考虑另存为文件类型的另存为通用文件对话框

Javascript:将画布另存为图像 ==>“未捕获的类型错误:未定义不是函数”