wxPython FileDialog默认文件名在Windows 10下为空白
wxPython FileDialog default filename blank under Windows 10
我想在保存日志文件时有一个基于时间的文件名。当我尝试设置默认文件名时,对话框显示一个空白文件名,如下所示。我已经尝试了等效的位置函数调用,但它也不起作用。
知道如何让 wx.FileDialog() 设置文件名,以便您只需单击“保存”即可使用默认名称保存文件吗?
在Windows10下使用以下版本:
Python 3.8.6 (tags/v3.8.6:db45529, Sep 23 2020, 15:52:53) [MSC v.1927 64 bit (AMD64)]
wx.version: 4.1.1 msw (phoenix) wxWidgets 3.1.5
无效的代码:
def OnSave(self, event):
default_file = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S') + ".log"
dlg = wx.FileDialog(self.frame, message = "Save Log Contents",
defaultDir = os.getcwd(),
defaultFile = default_file,
wildcard = "Log files (*.log)|*.log",
style = wx.FD_SAVE|wx.FD_OVERWRITE_PROMPT)
if dlg.ShowModal() == wx.ID_CANCEL:
dlg.Destroy()
return
file_path = dlg.GetPath()
self.window.tc.AppendText("%s Saving log to %s\n" % (datetime.datetime.now(), file_path))
self.window.tc.SaveFile(file_path)
dlg.Destroy()
return True
遗憾的是,我所能做的就是确认在 Linux wx 4.1.1 下,它按预期工作。
import wx
import datetime
class MyFrame(wx.Frame):
def __init__(self, *args, **kwargs):
wx.Frame.__init__(self, *args, **kwargs)
panel = wx.Panel(self)
sizer = wx.BoxSizer(wx.HORIZONTAL)
self.select_button = wx.Button(panel, label="Select files")
self.convert_and_merge_button = wx.Button(panel, label="Merge files")
sizer.Add(self.select_button, 0, 0, 0)
sizer.Add(self.convert_and_merge_button, 0, 0, 0)
self.select_button.Bind(wx.EVT_BUTTON, self.pick_files)
self.convert_and_merge_button.Bind(wx.EVT_BUTTON, self.convert_and_merge)
self.load_options = "Pdf and Image Files |*.pdf;*.gif;*.bmp;*.tif;*.png;"
self.save_options = "Pdf Files |*.pdf;*.log;"
self.convert_and_merge_button.Enable(False)
panel.SetSizer(sizer)
def pick_files(self, event):
with wx.FileDialog(self, "Pick files", wildcard=self.load_options,
style=wx.FD_OPEN | wx.FD_FILE_MUST_EXIST | wx.FD_MULTIPLE) as fileDialog:
if fileDialog.ShowModal() != wx.ID_CANCEL:
self.files_list = fileDialog.GetPaths()
self.convert_and_merge_button.Enable()
def convert_and_merge(self, event):
default_file = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S') + ".log"
print (default_file)
with wx.FileDialog(self, "Convert and merge", wildcard=self.save_options,
defaultDir = "/home/rolf",
defaultFile=default_file,
style=wx.FD_SAVE | wx.FD_OVERWRITE_PROMPT) as fileDialog:
if fileDialog.ShowModal() != wx.ID_CANCEL:
# pass parameters to Converter class
merge_file = fileDialog.GetPath()
#Test that the output file is not in the input list
if merge_file in self.files_list:
wx.MessageBox('The chosen output file is in the input files\n Choose another file', 'Error', wx.OK | wx.ICON_INFORMATION)
return
self.converter(self.files_list, merge_file)
def converter(self, files_list, merge_file):
print ("Merging:\n"+str(files_list)+"\n into\n"+str(merge_file))
class MyApp(wx.App):
def OnInit(self):
frame = MyFrame(None, -1, 'A test dialog')
frame.Show()
return True
if __name__ == "__main__":
app = MyApp()
app.MainLoop()
您的文件名中不能包含 :
。更改此行:
default_file = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S') + ".log"
为此:
default_file = datetime.datetime.now().strftime('%Y-%m-%d %H_%M_%S') + ".log"
而且你会得到更好的结果。
我是如何发现这个的(不是立即发现的):
直到尝试使用
设置默认文件名后我才发现这一点
dlg.SetFilename(default_file)
在打开对话框之前,我收到一条错误消息。然后我将默认文件名更改为 'junk.log' 并且它工作正常。然后我将 default_file 打印到控制台并发现了问题。
我想在保存日志文件时有一个基于时间的文件名。当我尝试设置默认文件名时,对话框显示一个空白文件名,如下所示。我已经尝试了等效的位置函数调用,但它也不起作用。
知道如何让 wx.FileDialog() 设置文件名,以便您只需单击“保存”即可使用默认名称保存文件吗?
在Windows10下使用以下版本:
Python 3.8.6 (tags/v3.8.6:db45529, Sep 23 2020, 15:52:53) [MSC v.1927 64 bit (AMD64)]
wx.version: 4.1.1 msw (phoenix) wxWidgets 3.1.5
无效的代码:
def OnSave(self, event):
default_file = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S') + ".log"
dlg = wx.FileDialog(self.frame, message = "Save Log Contents",
defaultDir = os.getcwd(),
defaultFile = default_file,
wildcard = "Log files (*.log)|*.log",
style = wx.FD_SAVE|wx.FD_OVERWRITE_PROMPT)
if dlg.ShowModal() == wx.ID_CANCEL:
dlg.Destroy()
return
file_path = dlg.GetPath()
self.window.tc.AppendText("%s Saving log to %s\n" % (datetime.datetime.now(), file_path))
self.window.tc.SaveFile(file_path)
dlg.Destroy()
return True
遗憾的是,我所能做的就是确认在 Linux wx 4.1.1 下,它按预期工作。
import wx
import datetime
class MyFrame(wx.Frame):
def __init__(self, *args, **kwargs):
wx.Frame.__init__(self, *args, **kwargs)
panel = wx.Panel(self)
sizer = wx.BoxSizer(wx.HORIZONTAL)
self.select_button = wx.Button(panel, label="Select files")
self.convert_and_merge_button = wx.Button(panel, label="Merge files")
sizer.Add(self.select_button, 0, 0, 0)
sizer.Add(self.convert_and_merge_button, 0, 0, 0)
self.select_button.Bind(wx.EVT_BUTTON, self.pick_files)
self.convert_and_merge_button.Bind(wx.EVT_BUTTON, self.convert_and_merge)
self.load_options = "Pdf and Image Files |*.pdf;*.gif;*.bmp;*.tif;*.png;"
self.save_options = "Pdf Files |*.pdf;*.log;"
self.convert_and_merge_button.Enable(False)
panel.SetSizer(sizer)
def pick_files(self, event):
with wx.FileDialog(self, "Pick files", wildcard=self.load_options,
style=wx.FD_OPEN | wx.FD_FILE_MUST_EXIST | wx.FD_MULTIPLE) as fileDialog:
if fileDialog.ShowModal() != wx.ID_CANCEL:
self.files_list = fileDialog.GetPaths()
self.convert_and_merge_button.Enable()
def convert_and_merge(self, event):
default_file = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S') + ".log"
print (default_file)
with wx.FileDialog(self, "Convert and merge", wildcard=self.save_options,
defaultDir = "/home/rolf",
defaultFile=default_file,
style=wx.FD_SAVE | wx.FD_OVERWRITE_PROMPT) as fileDialog:
if fileDialog.ShowModal() != wx.ID_CANCEL:
# pass parameters to Converter class
merge_file = fileDialog.GetPath()
#Test that the output file is not in the input list
if merge_file in self.files_list:
wx.MessageBox('The chosen output file is in the input files\n Choose another file', 'Error', wx.OK | wx.ICON_INFORMATION)
return
self.converter(self.files_list, merge_file)
def converter(self, files_list, merge_file):
print ("Merging:\n"+str(files_list)+"\n into\n"+str(merge_file))
class MyApp(wx.App):
def OnInit(self):
frame = MyFrame(None, -1, 'A test dialog')
frame.Show()
return True
if __name__ == "__main__":
app = MyApp()
app.MainLoop()
您的文件名中不能包含 :
。更改此行:
default_file = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S') + ".log"
为此:
default_file = datetime.datetime.now().strftime('%Y-%m-%d %H_%M_%S') + ".log"
而且你会得到更好的结果。
我是如何发现这个的(不是立即发现的):
直到尝试使用
设置默认文件名后我才发现这一点dlg.SetFilename(default_file)
在打开对话框之前,我收到一条错误消息。然后我将默认文件名更改为 'junk.log' 并且它工作正常。然后我将 default_file 打印到控制台并发现了问题。