2017-04-07 46 views
0

考慮這個例子(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

回答

0

我從來沒有使用過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()