wxPython用于保存文件选取器的错误文件对话框?

问题描述:

考虑这个例子(Ubuntu的14.04,Python的2.7.6,蟒蛇,wxgtk2.8:AMD64 /信赖2.8.12.1):wxPython用于保存文件选取器的错误文件对话框?

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

有没有什么办法,我可能会迫使这种对话显示,在wx.FLP_SAVE wx.FilePickerCtrl的“浏览”,当点击 - 和如果是这样,怎么样?

+1

你尝试演示:

如果你被卡住的旧版本,那么你可能会因为它使用wx.FileDialog应该找到以下修改后的代码是否有帮助?另外,为什么不更新wxPython到最新版本? – Igor

+0

谢谢@Igor - 我该如何尝试演示?这是我在这个操作系统上的wxPython版本,我想支持它... – sdaau

+1

请检查存储库 - 它应该包含软件包列表。某处应该有像wxPython-demo这样的东西。另外,好奇 - 如果您尝试运行解释器并发出“导入wx”,然后出现“wx.FileDialog(.....)”,其中“...”是传递给FilePicker的参数会发生什么? – Igor

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

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