如果目录包含文件,则在弹出警告之前选择它[Python,traitsui]

时间:2014-02-20 20:14:05

标签: python traits traitsui

我正在使用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()

有什么想法吗?有没有办法覆盖目录是存在的目录的任何检查,以便它还检查文件夹中的文件是否存在?如何链接此以打开警告窗口?

非常感谢提前!

2 个答案:

答案 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

请注意,此脚本只检查给定目录中的文件,如果该目录包含任何子目录,则此脚本不会检查它们。这是你可以自己尝试的东西。 ;)