什麼是正確的方式來與Enthought的traitsui
包實現文件保存對話?目前,我有實際的儲蓄功能來觀察特徵filename_out
(即File
特徵)的變化。毫不奇怪,當用戶想要重複保存到同一個文件時,它不會做任何事情,每次都會覆蓋它。每次用戶在FileEditor對話框中確認覆蓋時,如何讓它保存文件?Python traitsui保存文件對話框 - 覆蓋
一小片的未工作的代碼:
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 不問確認覆蓋,但不保存文件。
感謝您的回答!不過,我仍然錯過了一些東西。添加'Instance'和'on_trait_change'導入後,我遇到了同樣的問題:兩次選擇相同的名稱會導致無法執行操作,即使文件對話框要求確認。當你選擇'name1.npy',然後'name2.npy',然後再選擇'name1.npy'時,你的代碼就可以工作,但我的代碼也是如此。這隻會增加另一個確認階段。 –
對不起,我沒有正確理解你的問題,但我也不認爲你已經明確了你的具體問題。如果您使用默認編輯器來選擇文件,如果該文件沒有真正更改,則不會更新特徵。或者說,它會更新特徵,但由於該值不會改變,所以不會觸發通知。 通過在'pyface.FileDialog'(我在回答開始時提到)編寫一個包裝,你可以更容易地做你想做的事情。這個包裝器總是可以返回一個值,而如果特性沒有改變,FileEditor不會觸發任何東西。 – aestrivex