Каков правильный способ реализовать диалог сохранения файлов с пакетом от Enthought? На данный момент у меня есть функция экономии, наблюдающая за изменениями в признаке filename_out
(т. Е. File
). Неудивительно, что это ничего не делает, когда пользователь хочет сохранить один и тот же файл, переписывая его каждый раз. Как мне сохранить файл каждый раз, когда пользователь подтверждает переписывание в диалоге FileEditor?Python traitsui save файл диалог - переписывание
Небольшой кусочек не-рабочий код:
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
не был изменен.
EDIT: Я хотел бы пояснить, что FileEditor спрашивается подтвердить перезапись, но не спасает файл.
Спасибо за ответ! Тем не менее, я все еще что-то пропущу. После добавления импорта 'Instance' и' on_trait_change' я столкнулся с такой же проблемой: выбор одного и того же имени дважды приводит к отсутствию действия, хотя диалог файла запрашивает подтверждение. Ваш код работает, когда вы выбираете 'name1.npy', затем' name2.npy', а затем снова 'name1.npy', но так же и мой. Это добавляет еще один этап подтверждения. –
Извините, я не понял ваш вопрос правильно, но также не думаю, что вы четко определили свою конкретную проблему. Если вы используете редактор по умолчанию для выбора файла, он не обновит признак, если файл фактически не изменился. Вернее, он обновит этот признак, но поскольку значение не изменится, это не приведет к запуску уведомления. У вас будет более легкое время делать то, что вы хотите, написав обертку вокруг «pyface.FileDialog» (я упомянул в начале моего ответа). Эта оболочка всегда может вернуть значение, тогда как 'FileEditor' ничего не вызовет, если черта не изменится. – aestrivex