使用 Enthought 的 traitsui
包实现文件保存对话的正确方法是什么?目前,我有实际的保存函数来监视特征 filename_out
(即 File
特征)的变化。毫不奇怪,当用户想要重复保存到同一个文件并每次都覆盖它时,这不会执行任何操作。如何让它在每次用户在文件编辑器对话框中确认覆盖时保存文件?
一小段不起作用的代码:
from traits.api import File, HasTraits
from traitsui.api import FileEditor, View, Item
import numpy
class ArrayToBeSaved(HasTraits):
filename_out = File
traits_view = View(Item('filename_out', editor = FileEditor(dialog_style='save')))
def __init__(self):
self.my_array = numpy.ones(3)
#This is NOT the right way
def _filename_out_changed(self):
numpy.save(self.filename_out, self.my_array)
self.my_array = numpy.zeros(3)
atbs = ArrayToBeSaved()
atbs.configure_traits()
选择文件位置后,将保存数组。再次调用文件对话框并选择同一文件后,系统会要求用户确认覆盖。但是,什么也没有发生,因为 filename_out
没有更改。
编辑:我想澄清一下,文件编辑器确实要求确认覆盖,但不保存文件。
最佳答案
请注意,您可以使用 pyface.file_dialog,它会自动具有“您要覆盖此文件吗”行为。如果你实际上不需要你的文件名作为一个特征,那么就这样做,它要简单得多。
如果有充分的理由使文件名成为特征,则需要在检查用户的响应后恢复继续。
有很多可能的方法可以做到这一点,但这是我喜欢的方法。请注意,我没有测试此代码。
import os
from traits.api import File, HasTraits, Function, Bool, Event
from traitsui.api import FileEditor, View, Item, Handler, OKCancelButtons, Label
import numpy
class CheckOverwriteWindow(Handler):
finished = Bool
notify = Event
def init_info(self, info):
self.finished = False
def closed(self, info, is_ok):
self.finished = is_ok
self.notify = True
view = View(
Label('Really overwrite?'),
buttons = OKCancelButtons
)
class ArrayToBeSaved(HasTraits):
filename_out = File
_save_continuation = Function
_check_overwrite_window = Instance(CheckOverwriteWindow,())
traits_view = View(Item('filename_out', editor = FileEditor(dialog_style='save')))
def __init__(self):
self.my_array = numpy.ones(3)
def _filename_out_changed(self):
def save_continuation():
numpy.save(self.filename_out, self.my_array)
self.my_array = numpy.zeros(3)
if not os.path.exists(self.filename_out):
save_continuation()
else:
self._save_continuation = save_continuation
self._check_overwrite_window.edit_traits()
@on_trait_change('_check_overwrite_window:notify')
def handle_overwrite(self):
if self._check_overwrite_window.finished:
self._save_continuation()
atbs = ArrayToBeSaved()
atbs.configure_traits()
关于Python Traitsui 保存文件对话 - 覆盖,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32178573/