首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python traitsui保存文件对话-覆盖

Python traitsui保存文件对话-覆盖
EN

Stack Overflow用户
提问于 2015-08-24 09:17:28
回答 2查看 565关注 0票数 1

什么是实现与traitsui包文件保存对话的正确方式?目前,我有实际的储蓄功能,观察性状filename_out (即File特性)的变化。不出所料,当用户想要重复保存到同一个文件,每次都覆盖它时,它什么也不做。如何使用户每次在FileEditor对话框中确认覆盖时保存该文件?

一小部分不起作用的代码:

代码语言:javascript
复制
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 确实要求确认覆盖,但是没有保存文件。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-08-31 08:33:38

多亏了aestrivex,我才能给出一个完整的答案。pyface.file_dilaog确实完成了这项工作。由于我花了一些时间才弄清楚如何使用它,所以我决定发布一个完整的工作示例。

这也适用于重新打开同一个文件,只会将FileDialog的属性分解为action = 'open' (例如,如果您不小心编辑了某项内容的值,并希望返回到保存在磁盘上的sate -如果您依赖于监视File特征的更改,这种情况也会失败)。

代码语言:javascript
复制
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()
票数 1
EN

Stack Overflow用户

发布于 2015-08-27 17:19:24

请注意,您可以使用pyface.file_dialog,它自动具有“要覆盖此文件吗”的行为。如果你实际上不需要你的文件名成为一个特征,那么这样做就更简单了。

如果有充分的理由使文件名成为一个特征,则需要在检查用户的响应后继续进行。

做这件事有很多可能的方法,但我喜欢这样做。注意,我没有测试这段代码。

代码语言:javascript
复制
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()
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32178573

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档