Python Traitsui 保存文件对话 - 覆盖

标签 python save traits traitsui

使用 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/

相关文章:

python - 具有噪声损失函数的 SciPy 优化

c++ - 用户指定如何保​​存数据

node.js - 如果在 node.js 中保存文件时文件名已经存在,则增加文件名?

scala - 家庭多态性+混合?

rust - 如何在关联类型上定义特征范围?

python - pandas 将行与另一行进行比较并为剩余值设置期望值?

python - 将行写入文件的正确方法?

python - Facebook 流 API 错误在浏览器中有效,但在服务器端无效

ios - 我如何在应用程序终止时保存一个整数,然后在应用程序重新打开后再次加载它?

struct - 可能在 Rust 中有一个结构/元组的特征?