【问题标题】:wxPython wrong file dialog for save file picker?保存文件选择器的 wxPython 错误文件对话框?
【发布时间】:2017-04-07 16:21:48
【问题描述】:

考虑这个例子(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.FLP_USE_TEXTCTRL)!我所期望的是一个文件对话框,它有一个文本输入小部件(所以你可以选择,然后即时重命名),就像 Firefox 的 Save Page As... 提出的那样:

当单击 wx.FLP_SAVE wx.FilePickerCtrl 的“浏览”时,有什么方法可以强制显示这种对话框 - 如果是,如何?

【问题讨论】:

  • 您尝试过演示吗?还有,为什么不把 wxPython 更新到最新版本呢?
  • 谢谢@Igor - 我如何尝试演示?这是我在这个操作系统上的 wxPython 版本,我想支持它...
  • 请检查存储库 - 它应该包含软件包列表。某处应该有类似 wxPython-demo 的东西。另外,很好奇 - 如果您尝试运行解释器并发出“import wx”然后发出“wx.FileDialog(.....)”,其中“...”是您传递给 FilePicker 的参数,会发生什么?跨度>
  • 感谢@Igor,将查看演示...另外,我尝试在 Frame 构造函数中添加fdlg = wx.FileDialog(self, "Input setting file path", "", "", "CSV files(*.csv)|*.*", wx.FD_SAVE | wx.FD_OVERWRITE_PROMPT) 作为最后一行,确实,该对话框没问题...一定是一个错误在这个版本的wxWidgets中(我查了wx-2.8-gtk2-unicode/wx/_controls.py的代码,FilePickerCtrl的Python代码和FileDialog没有直接关系...)

标签: wxpython wxwidgets


【解决方案1】:

我从未为此使用过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()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-29
    • 2015-11-29
    • 1970-01-01
    • 2014-04-01
    • 1970-01-01
    相关资源
    最近更新 更多