wxPython New、Save和SaveAs方法

wxPython New、Save和SaveAs方法,python,wxpython,Python,Wxpython,我正在用wxPython为python应用程序编写UI。我已经处理了一些OnX函数,但是我需要OnNew和OnSave/SaveAs的帮助 以下是我的“保存”和“另存为”代码: def OnSave(self, event): self.dirname = "" saveFileDialog = wx.FileDialog(self, "Save Operation File", self.dirname, "", "Operation Files (*.fwr)

我正在用wxPython为python应用程序编写UI。我已经处理了一些OnX函数,但是我需要OnNew和OnSave/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  
底部的注释部分是我发现的另一种方法,使用输入和输出流是否比当前的方法更正确?还有我的另一个问题,我刚开始工作,代码如下:

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方法打开了一个打开文件对话框,我想要一个创建文件对话框(这是否与save相同?有人能给我一个OnOpen方法的例子,并让我对OnSave和onsavas方法有一些了解吗?正如您所看到的,有三个aproach,一个在onsavas中,一个在onsavas中,另一个在onsavas()的底部被注释掉。)。还有很多我没有写在这里。不过我的主要问题是如何让filedialog for new成为一个保存对话框,在其中创建文件,而不是一个打开的对话框

非常感谢

总结:

1) 如何打开一个允许创建空白文件的文件对话框。我想它类似于保存,但我传递的hwatever ID标志总是给我一个打开按钮


2) 至于保存方法,最好是按照我在代码中展示的方法,还是使用像SaveAs中注释掉的部分这样的流?

要获得保存对话框,您需要将
wx.save
style标志传递给
FileDialog
对象:
style=wx.save
。您可以阅读有关保存标志或的更多信息

下面是我在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的。我会使用Python的
with
操作符,不过这更符合较新的习惯用法:

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

我试着把它传递给FileDialog,但它仍然给我打开按钮。我用一个简单的例子更新了这个例子,这个例子在我这方面很有效。只是一个更新:你应该使用
wx.FD_SAVE
,而不是
wx.SAVE
(至少在4.0.0b2中)。是的,直到wxPython 4才强制执行。