1

traitsuiEnthoughtのパッケージでファイル保存ダイアログを実装する正しい方法は何ですか? 現時点では、特性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()

ファイルの場所を選択すると、1 の配列が保存されます。もう一度ファイル ダイアログを呼び出して同じファイルを選択すると、ユーザーは上書きの確認を求められます。ただし、 は変更されていないため、何も起こりfilename_outません。

編集: FileEditor は上書きの確認を求めますが、ファイルを保存しないことを明確にしたいと思います。

4

2 に答える 2

1

「このファイルを上書きしますか」という動作を自動的に行う 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()
于 2015-08-27T17:19:24.893 に答える