Сохранить как, каждый тип файла имеет свою функцию обратного вызова - PullRequest
0 голосов
/ 25 июня 2019

Я использую Python tkinter и Import tkinter.filedialog для сохранения в виде файлов.В программе есть функции для сохранения файлов каждого типа.

Использование filedialog.asksaveasfilename Возвращает только путь к файлу.

Проблема : как получить тип файла, чтобы вызватьправильная функция?

Ниже приведен пример кода того, что я сделал.

python

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()

1 Ответ

0 голосов
/ 05 июля 2019

Вы можете добавить параметр 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()
...