wxPython New、Save和SaveAs方法
我正在用wxPython为python应用程序编写UI。我已经处理了一些OnX函数,但是我需要OnNew和OnSave/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)
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才强制执行。