wxPython保存文件选择器的错误文件对话框?

时间:2017-04-07 16:21:48

标签: wxpython wxwidgets

考虑这个例子(Ubuntu 14.04,Python 2.7.6,python-wxgtk2.8:amd64 / trusty 2.8.12.1):

import wxversion
wxversion.select("2.8")
import wx, wx.html
import sys

class Frame(wx.Frame):
  def __init__(self, *args, **kwds):
    kwds["style"] = wx.DEFAULT_FRAME_STYLE
    wx.Frame.__init__(self, *args, **kwds)

    self.file_picker_inpdffilepath = wx.FilePickerCtrl(self, wx.ID_ANY, "", "Open PDF file:", "PDF files (*.pdf)|*.pdf", None, None, wx.FLP_DEFAULT_STYLE | wx.FLP_USE_TEXTCTRL)
    self.file_picker_outpdffilepath = wx.FilePickerCtrl(self, wx.ID_ANY, "", "Choose output PDF file name:", "PDF files (*.pdf)|*.pdf", None, None, wx.FLP_SAVE | wx.FLP_USE_TEXTCTRL | wx.FLP_OVERWRITE_PROMPT)
    sizer_vmain_app = wx.BoxSizer(wx.VERTICAL)
    sizer_vmain_app.Add(self.file_picker_inpdffilepath, 1, wx.EXPAND, 0)
    sizer_vmain_app.Add(self.file_picker_outpdffilepath, 1, wx.EXPAND, 0)
    self.SetSizer(sizer_vmain_app)
    self.Layout()

if __name__ == "__main__":
  app = wx.PySimpleApp(0)
  wx.InitAllImageHandlers()
  app_frame = Frame(None, wx.ID_ANY, "")
  app.SetTopWindow(app_frame)
  app_frame.Show()
  app.MainLoop()

这里我有两个文件选择器,一个应该设置为文件加载(wx.FLP_LOAD,默认样式的一部分),另一个用于保存(wx.FLP_SAVE)。当我运行这个时,我得到:

wx-filepick.png

然后我点击"(否......"按钮,我打开这个文件对话框:

load-file-diag.png

......这已经够好了。但是,当我点击"浏览"按钮,它应该提升系统对话框以保存文件 - 它提升与加载完全相同的一个(无论我是否使用wx.FLP_USE_TEXTCTRL)!我所期望的是一个文件对话框,其中包含一个文本输入窗口小部件(因此您可以选择,然后在运行中重命名),比如说这个由Firefox保存页面为...:

Save-As.png

点击"浏览&#34>是否有任何方法可以强制显示此类对话框一个wx.FLP_SAVE wx.FilePickerCtrl - 若然,怎么样?

1 个答案:

答案 0 :(得分:0)

我从未使用过FilePickerCtrl。相反,我一直使用wx.FileDialog。但是我刚刚使用wxPython 3.0.2 Classic测试了你的代码,它按预期工作,所以我同意这可能是旧版本中的一个错误。

如果您坚持使用旧版本,那么您可能会发现以下修改后的代码非常有用,因为它使用wx.FileDialog代替:

import wx, wx.html
import sys

class Frame(wx.Frame):
    def __init__(self, *args, **kwds):
        kwds["style"] = wx.DEFAULT_FRAME_STYLE
        wx.Frame.__init__(self, *args, **kwds)

        self.file_picker_inpdffilepath = wx.FilePickerCtrl(self, wx.ID_ANY, "", "Open PDF file:", "PDF files (*.pdf)|*.pdf", None, None, wx.FLP_DEFAULT_STYLE | wx.FLP_USE_TEXTCTRL)
        self.file_picker_outpdffilepath = wx.Button(self, label='Save')
        self.file_picker_outpdffilepath.Bind(wx.EVT_BUTTON, self.onSave)
        sizer_vmain_app = wx.BoxSizer(wx.VERTICAL)
        sizer_vmain_app.Add(self.file_picker_inpdffilepath, 1, wx.EXPAND, 0)
        sizer_vmain_app.Add(self.file_picker_outpdffilepath, 1, wx.EXPAND, 0)
        self.SetSizer(sizer_vmain_app)
        self.Layout()


    def onSave(self, event):
        path = None
        dlg = wx.FileDialog(self,
                      message="Choose output PDF file name:",
                      defaultDir='',
                      wildcard="PDF files (*.pdf)|*.pdf",
                      style=wx.FD_SAVE | wx.FLP_USE_TEXTCTRL | wx.FLP_OVERWRITE_PROMPT)
        if dlg.ShowModal() == wx.ID_OK:
            path = dlg.GetPath()

        dlg.Destroy()
        return path

if __name__ == "__main__":
    app = wx.PySimpleApp(0)
    wx.InitAllImageHandlers()
    app_frame = Frame(None, wx.ID_ANY, "")
    app.SetTopWindow(app_frame)
    app_frame.Show()
    app.MainLoop()