我正在使用enthought traitsui和traits模块来制作一个简单的GUI。
我现在的代码如下所示。我正在寻找一种方法来弹出警告,如果新的Study_info实例的“基础目录”包含一个名为“conf.txt”的文件,然后再选择它。然后,如果study_info.base目录不包含“conf.txt”文件,或者如果用户同意在弹出警告时继续,则创建一个新的Study实例。
目前,我在点击“新建学习窗口”窗口的“确定”按钮后检查文件夹中是否存在该文件。我想知道是否有办法在之前弹出警告(在目录浏览窗口中单击“确定”之后),这样如果用户点击“取消”,他/她可以直接点击“浏览”再次选择另一个文件夹(不返回“主窗口”窗口)。现在,用户必须单击“新研究”才能选择另一个文件夹。
from traitsui.api import *
from traits.api import *
import os
class Study_info(HasTraits):
base_directory = Directory(exists=True)
new_study_view = View('base_directory',title="New study window", buttons=['OK','Cancel'],kind='modal')
warning_msg = '\nWarning: Folder already contains configuration file.\n\nProceed ?\n'
warning = View(Item('warning_msg',show_label=False,style='readonly'),title='Warning',kind='modal',buttons = ['OK','Cancel'])
class Study(HasTraits):
def __init__(self, study_info):
self.base_directory = study_info.base_directory
# plus some other processing stuff
view = View(Item('base_directory',style='readonly'))
class study_handler(Handler):
def new_study(self, ui_info):
new_study_info = Study_info()
ns_res = new_study_info.configure_traits(view='new_study_view')
if ns_res and os.path.exists(new_study_info.base_directory):
new_study = Study(new_study_info)
if os.path.exists(os.path.join(new_study.base_directory,'conf.txt')):
warn_res = new_study_info.configure_traits(view='warning')
if warn_res:
ui_info.ui.context["object"].study = new_study
else:
ui_info.ui.context["object"].study = new_study
class GUI(HasTraits):
study = Instance(HasTraits)
new_study = Action(name="New Study",action="new_study")
view = View(Item('study',style='custom',show_label=False),buttons = [new_study], handler = study_handler(),title="Main window",resizable=True)
g = GUI()
g.configure_traits()
有什么想法吗?有没有办法覆盖目录是存在的目录的任何检查,以便它还检查文件夹中的文件是否存在?如何链接此以打开警告窗口?
非常感谢提前!
答案 0 :(得分:1)
在此代码中:
warn_res = new_study_info.configure_traits(view='warning')
if warn_res:
ui_info.ui.context["object"].study = new_study
如果用户单击“确定”,则configure_traits
将返回true,否则您将假设某些内容。这完全不是configure_traits
所做的。 (我想这实际上可能部分正确,但configure_traits
的返回值未在我能找到的任何文档中指定。
准确地说,configure_traits
创建一个与其模型(上下文)对象相对应的视图,并在屏幕上显示此视图,然后启动其事件循环,该循环接管主线程(以便不返回控件)直到对话框退出。)
要执行您要执行的操作,您不应该尝试依赖configure_traits
或其返回值来执行控制流。相反,你应该使用特征'丰富的事件处理系统。这是一个简单的示例,旨在说明事件处理和特定处理程序操作,这些操作对于您想要做的事情可能是必要的,而不是直接解决您要求的任务(存在一些差异,主要是因为我不想写下更多文本并添加第三个有点多余的对话框,如下例所示:
class WarningWindow(Handler):
finished=Bool
notify=Event
def init_info(self,info):
self.finished=False
#this is a method defined on the handler that executes when the window closes
#
#is_ok is True if the user closed the window ok and False if the user closed
#the window some other way such as clicking cancel or via the window manager
def closed(self,info,is_ok):
self.finished=is_ok
self.notify=True
view=View(Label('WARNING: YOU WILL BE EATEN BY A GRUE'),buttons=OKCancelButtons)
class StudyMenu(Handler):
warning_window=Instance(WarningWindow)
dir=Directory
make_study_button=Button('Make new study')
info=Instance(UIInfo)
def make_study(self):
print "now make the study"
def _make_study_button_fired(self):
if os.path.exists(os.path.join(self.dir,'conf.txt')):
warning_window.edit_traits() #note, not configure_traits
@on_trait_change('warning_window:notify')
def warning_window_listen(self):
if self.warning_window.finished:
#user is OK to overwrite the conf file
self.make_study()
else:
#user does not want to overwrite
self.info.ui.dispose() #this discards the window
#which is the main window in this example
print "everything is terrible!"
sys.exit(666)
#this is a handler method that executes when the window opens. its primary
#purpose here is to store the window's UIInfo object in the model object.
def init_info(self,info):
self.info=info
StudyMenu().configure_traits()
答案 1 :(得分:-1)
如果您需要检查特定目录是否为空,则可以使用os.listdir()方法。
这是一个简单的例子。我在test
驱动器上有一个名为 c:\
的空文件夹我可以使用以下代码来测试它是否为空。
import os
dir='c:\\test'
if not os.listdir(dir):
print "Empty Dir."
您可以更改dir
的值以测试任何其他目录!
如果要检查目录是否包含特定文件,则可以使用以下代码。它与上面的代码一样工作,它首先检查目录是否为空。如果它不为空,则获取其中所有文件的列表。然后它检查是否存在具有您将在脚本中指定的名称的文件。例如:在我的案例中,我在目录test.txt
中有一个名为c:\test
的文件。这是完整的代码:
import os
dir = "C:\\test"
fileName = "test.txt"
if not os.listdir(dir):
print "Empty directory."
else:
filesList = os.listdir(dir)
for i in range(0,len(filesList)):
if filesList[i]=="test.txt":
print "Yes, there is a file with name %s in %s"%(fileName,dir)
else:
pass
我的案例中的输出是:
Yes, there is a file with name test.txt in C:\test
请注意,此脚本只检查给定目录中的文件,如果该目录包含任何子目录,则此脚本不会检查它们。这是你可以自己尝试的东西。 ;)