wxPython FileDialog предотвращает выбор некоторых файлов - PullRequest
0 голосов
/ 11 сентября 2018

Я создаю какой-то конвертер pdf.Он может объединять изображения и другие файлы PDF в один pdf файл.Я использую wxPython в качестве основы графического интерфейса.

Есть две кнопки: одна для установки входных файлов и вторая для установки выходного файла.Вот два моих обработчика событий:

def pick_files(self, event):
    with wx.FileDialog(self, "Pick files", wildcard=self.load_options,
                       style=wx.FD_OPEN | wx.FD_FILE_MUST_EXIST | wx.FD_MULTIPLE) as fileDialog:
        if fileDialog.ShowModal() != wx.ID_CANCEL:
            self.files_list = fileDialog.GetPaths()
            self.convert_and_merge_button.Enable()

def convert_and_merge(self, event):
    with wx.FileDialog(self, "Convert and merge", wildcard=self.save_options,
                       style=wx.FD_SAVE | wx.FD_OVERWRITE_PROMPT) as fileDialog:
        if fileDialog.ShowModal() != wx.ID_CANCEL:
            # pass parameters to Converter class
            self.converter.convert(self.files_list, fileDialog.GetPath())

Проблема в том, что, если я выберу один из входных файлов в качестве выходного файла, программа вылетает.Как я могу предотвратить выбор некоторых файлов в FileDialog?

Мне интересно, возможно ли иметь какой-то MessageBox, например, «Этот файл установлен как входной файл. Вы не можетепереписать это. "и вернуться к FileDialog.

1 Ответ

0 голосов
/ 11 сентября 2018

Просто сравните имя файла, выбранное для вывода, со списком входных файлов перед процедурой слияния.

import wx

class MyFrame(wx.Frame):
    def __init__(self, *args, **kwargs):
        wx.Frame.__init__(self, *args, **kwargs)
        panel = wx.Panel(self)
        sizer = wx.BoxSizer(wx.HORIZONTAL)
        self.select_button = wx.Button(panel, label="Select files")
        self.convert_and_merge_button = wx.Button(panel, label="Merge files")
        sizer.Add(self.select_button, 0, 0, 0)
        sizer.Add(self.convert_and_merge_button, 0, 0, 0)
        self.select_button.Bind(wx.EVT_BUTTON, self.pick_files)
        self.convert_and_merge_button.Bind(wx.EVT_BUTTON, self.convert_and_merge)
        self.load_options = "Pdf and Image Files |*.pdf;*.gif;*.bmp;*.tif;*.png;"
        self.save_options = "Pdf Files |*.pdf;"
        self.convert_and_merge_button.Enable(False)
        panel.SetSizer(sizer)

    def pick_files(self, event):
        with wx.FileDialog(self, "Pick files", wildcard=self.load_options,
                           style=wx.FD_OPEN | wx.FD_FILE_MUST_EXIST | wx.FD_MULTIPLE) as fileDialog:
            if fileDialog.ShowModal() != wx.ID_CANCEL:
                self.files_list = fileDialog.GetPaths()
                self.convert_and_merge_button.Enable()

    def convert_and_merge(self, event):
        with wx.FileDialog(self, "Convert and merge", wildcard=self.save_options,
                           style=wx.FD_SAVE | wx.FD_OVERWRITE_PROMPT) as fileDialog:
            if fileDialog.ShowModal() != wx.ID_CANCEL:
                # pass parameters to Converter class
                merge_file = fileDialog.GetPath()
                #Test that the output file is not in the input list
                if merge_file in self.files_list:
                    wx.MessageBox('The chosen output file is in the input files\n Choose another file', 'Error', wx.OK | wx.ICON_INFORMATION)
                    return
                self.converter(self.files_list, merge_file)

    def converter(self, files_list, merge_file):
        print ("Merging:\n"+str(files_list)+"\n into\n"+str(merge_file))

class MyApp(wx.App):
    def OnInit(self):
        frame = MyFrame(None, -1, 'A test dialog')
        frame.Show()
        return True

if __name__ == "__main__":
    app = MyApp()
    app.MainLoop()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...