2015-05-27 2 views
1

Я пишу пользовательский интерфейс для приложения python с wxPython. Я обрабатываются несколько функций от х, но мне нужна помощь с OnNew и OnSave/SaveAswxPython Новые, Save и SaveAs методы

Вот мой Сохранить и SaveAs код:

def OnSave(self, event): 
    self.dirname = "" 
    saveFileDialog = wx.FileDialog(self, "Save Operation File", self.dirname, "", 
     "Operation Files (*.fwr)|*.fwr|All Files (*.*)|*.*", wx.SAVE|wx.OVERWRITE_PROMPT) 
    if saveFileDialog.ShowModal() == wx.ID_OK: 
     contents = self.control.GetValue() 
     self.filename = saveFileDialog.GetFilename() 
     self.dirname = saveFileDialog.GetDirectory() 
     filehandle = open(os.path.join(self.dirname, self.filename), 'w') 
     filehandle.write(contents) 
     filehandle.close() 
    else: 
     sys.exit(1) 
    saveFileDialog.Destroy() 

def OnSaveAs(self, event): 
    self.dirname = ""; 

    saveAsFileDialog = wx.FileDialog(self, "Save Operation File As", self.dirname, "", 
     "Operation Files (*.fwr)|*.fwr|All Files (*.*)|*.*", 
     wx.FD_SAVE | wx.FD_OVERWRITE_PROMPT) 

    if saveAsFileDialog.ShowModal() == wx.ID_OK: 
     contents = self.control.GetValue() 
     self.filename = saveFileDialog.GetFilename() 
     self.dirname = saveFileDialog.GetDirectory() 
     filehandle = open(os.path.join(self.dirname, self.filename), 'w') 
     filehandle.write(contents) 
     filehandle.close() 
    else: 
     sys.exit(1) 
    saveFileDialog.Destroy() 

    # save current contents in the file 
    # use wxPython output streams 
    #output_stream = wx.FileOutputStream(saveFileDialog.GetPath()) 

    #if not output_stream.IsOk():  
    # wx.LogError("Cannot save contents of Operations File '%s'" % saveFileDialog.GetPath()) 
    # return 

комментируемого часть в нижней части другой способ я нашел для этого используется поток ввода и вывода более корректным, чем тот, который он сейчас представляет? Также Heres другой мой вопрос, я получил OnNew Working, вот код:

def OnNew(self, event): 
    homedir = os.environ['HOME'] 
    if not os.path.exists(homedir): 
     if getpass.getuser(): 
      homedir = "C:/Users/" + getpass.getuser() + "/" 
     else: 
      homedir = "C:/" 
    newFileDialog = wx.FileDialog(self, "New Operation File", homedir, "", 
     "Operation Files (*.fwr)|*.fwr|All Files|(*.*)|*.*", wx.FD_CREATE|wx.OVERWRITE_PROMPT) 

Все отлично, но метод OnOpen открывает диалог открытого файла, я хочу создать файл диалоговое окно (это было бы то же самое, как сохранить ? Может ли кто-нибудь дать мне пример метода OnOpen и дать мне некоторое представление о моих методах OnSave и OnSaveAs? Как вы можете видеть, есть три подхода: один в OnSaveAs, один в OnSave и один из них прокомментирован в нижней части OnSaveAs() Как и многие другие, я не писал здесь. Мой главный вопрос заключается в том, как заставить filedialog для нового быть диалоговым окном сохранения, где вы создаете файл, а не открытый диалог.

Спасибо тонну .

РЕЗЮМЕ:

1) Как вы открываете FileDialog, который позволяет создавать пустые файлы. Я предполагаю, что это будет похоже на сохранение, но hwatever флаги ID, которые я передаю, всегда дает мне кнопку Open

2) А что касается методов сохранения, лучше ли делать то, что я показывал в коде, или использовать потоки, подобные закомментированный раздел в SaveAs ?.

ответ

1

Чтобы получить диалоговое окно «Сохранить», вам необходимо передать флаг wx.SAVE вашему FileDialog объекту: style=wx.SAVE. Подробнее о значке сохранения here или here.

Вот пример кода, который работал для меня на Xubuntu 14.04 с WxPython 2.8.12.1 и Python 2.7:

import os 
import wx 

wildcard = "Python source (*.py)|*.py|" \ 
      "All files (*.*)|*.*" 

######################################################################## 
class MyForm(wx.Frame): 

    #---------------------------------------------------------------------- 
    def __init__(self): 
     wx.Frame.__init__(self, None, wx.ID_ANY, 
          "File and Folder Dialogs Tutorial") 
     panel = wx.Panel(self, wx.ID_ANY) 
     self.currentDirectory = os.getcwd() 

     saveFileDlgBtn = wx.Button(panel, label="Show SAVE FileDialog") 
     saveFileDlgBtn.Bind(wx.EVT_BUTTON, self.onSaveFile) 

     # put the buttons in a sizer 
     sizer = wx.BoxSizer(wx.VERTICAL) 
     sizer.Add(saveFileDlgBtn, 0, wx.ALL|wx.CENTER, 5) 
     panel.SetSizer(sizer) 

    #---------------------------------------------------------------------- 
    def onSaveFile(self, event): 
     """ 
     Create and show the Save FileDialog 
     """ 
     dlg = wx.FileDialog(
      self, message="Save file as ...", 
      defaultDir=self.currentDirectory, 
      defaultFile="", wildcard=wildcard, style=wx.FD_SAVE 
      ) 
     if dlg.ShowModal() == wx.ID_OK: 
      path = dlg.GetPath() 
      print "You chose the following filename: %s" % path 
     dlg.Destroy() 

#---------------------------------------------------------------------- 
# Run the program 
if __name__ == "__main__": 
    app = wx.App(False) 
    frame = MyForm() 
    frame.Show() 
    app.MainLoop() 

Я не вижу ничего плохого в вашей экономии подхода. В большинстве случаев лучше использовать операторы низкого уровня Python вместо использования wxPython. Я хотел бы использовать with оператор Python, хотя, как следует новой идиома лучше:

with open(os.path.join(self.dirname, self.filename), 'w') as filehandle: 
    filehandle.write(contents) 
+0

Я попытался проходящим, что в FileDialog, но она по-прежнему дает мне открытую кнопку – shenk

+0

Я обновил пример с простым примером, который работал на моем конец. –

+0

Просто обновление: вы должны использовать 'wx.FD_SAVE' вместо' wx.SAVE' (по крайней мере, в 4.0.0b2). – Fejs