什么是实现与traitsui包文件保存对话的正确方式?目前,我有实际的储蓄功能,观察性状filename_out (即File特性)的变化。不出所料,当用户想要重复保存到同一个文件,每次都覆盖它时,它什么也不做。如何使用户每次在FileEditor对话框中确认覆盖时保存该文件?
一小部分不起作用的代码:
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没有被更改。
编辑:我想说清楚,FileEditor 确实要求确认覆盖,但是没有保存文件。
发布于 2015-08-31 08:33:38
多亏了aestrivex,我才能给出一个完整的答案。pyface.file_dilaog确实完成了这项工作。由于我花了一些时间才弄清楚如何使用它,所以我决定发布一个完整的工作示例。
这也适用于重新打开同一个文件,只会将FileDialog的属性分解为action = 'open' (例如,如果您不小心编辑了某项内容的值,并希望返回到保存在磁盘上的sate -如果您依赖于监视File特征的更改,这种情况也会失败)。
from traits.api import HasTraits, Button
from traitsui.api import View, Item
import numpy
##you may need to uncoment these 2 lines to prevent
##ImportErrors due to missing backends
#from traits.etsconfig.api import ETSConfig
#ETSConfig.toolkit = 'qt4' # or 'wx'
from pyface.api import FileDialog, OK
class ArrayToBeSaved(HasTraits):
save_as = Button('save as')
traits_view = View(Item('save_as'))
def __init__(self):
self.my_array = numpy.ones(3)
def _save_as_changed(self):
dlg = FileDialog(action='save as')
if dlg.open() == OK:
numpy.save(dlg.path, self.my_array)
self.my_array = numpy.zeros(3)
atbs = ArrayToBeSaved()
atbs.configure_traits()发布于 2015-08-27 17:19:24
请注意,您可以使用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()https://stackoverflow.com/questions/32178573
复制相似问题