2014-02-20 2 views
1

Я использую модули enthought traitsui и traits для создания простого графического интерфейса.Всплывающее предупреждение, если каталог содержит файл перед его выбором [Python, traitsui]

Код, который я на данный момент показан ниже. Я ищу способ всплывающего предупреждения, если «базовый каталог» нового экземпляра Study_info содержит файл с именем «conf.txt» перед его выбором. Затем я создаю новый экземпляр Study, если каталог study_info.base не содержит файл «conf.txt», или если пользователь соглашается продолжить, когда появится всплывающее предупреждение.

В настоящее время я проверяю, существует ли файл в папке после нажатия кнопки «ОК» окна «Новое окно исследования». Я задавался вопросом, есть ли способ сделать всплывающее предупреждение раньше (сразу после нажатия «ОК» в окне просмотра каталогов), так что, если пользователь нажимает «Отмена», он может сразу нажать «просмотреть», снова выберите другую папку (не возвращаясь в окно «Главное окно»). Теперь пользователю нужно нажать «Новое исследование», чтобы выбрать другую папку.

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() 

Любые идеи? Есть ли способ переписать все проверки того, что каталог является существующим каталогом, чтобы он также проверял, существует ли файл внутри папки? Как связать это, чтобы открыть окно предупреждения?

Большое спасибо!

ответ

-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 

Пожалуйста, обратите внимание, что этот скрипт проверяет наличие файла в заданной директории, если каталог содержит какие-либо подкаталоги то этот скрипт не проверяет их. Это то, что вы можете попробовать сами. ;)

+0

Спасибо за предложение, хотя мой пост, возможно, не был достаточно ясным. Я ищу больше, как сделать всплывающее окно с предупреждением после нажатия кнопки «ОК» окна просмотра папки, поэтому, если пользователь нажимает «Отмена» в окне предупреждения, он может напрямую нажмите кнопку «Обзор» еще раз, чтобы выбрать другую папку. В настоящее время предупреждение появляется после нажатия кнопки «ОК» в «окне нового исследования», поэтому, если пользователь нажимает на отмену, ему необходимо нажать «Новое исследование» -> Обзор. Он работает, но мне интересно, можно ли избежать этого дополнительного клика. – user2261190

1

В этом коде:

warn_res = new_study_info.configure_traits(view='warning') 
if warn_res: 
    ui_info.ui.context["object"].study = new_study 

кажется, что вы предполагаем, что-то вдоль линий, которые configure_traits возвращает истину, если пользователь нажимает кнопку OK, и ложь в противном случае. Это совсем не то, что делает 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() 
+0

Должен ли WarningWindow подкласс traits.trait_handlers.TraitHandler? Я прошу об этом после прочтения http://docs.enthought.com/traits/traits_user_manual/custom.html#trait-handlers – OYRM

+0

Вы можете подклассифицировать TraitHandler, если вы хотите определить пользовательский признак, в основном, если существующая черта не делает его собственный тип проверки достаточно для вашего случая использования. Кажется, это выходит за рамки проблемы, описанной в исходном вопросе, где обработчик подкласса будет делать все отлично. – aestrivex

+0

Спасибо, я просто не знал, что вы импортировали. Теперь я вижу, что это traitsui.api.Handler. Кстати, это похоже на то, что запросил исходный плакат. Я реализовал это как WarningWindow только сейчас, с хорошими результатами. благодаря – OYRM

 Смежные вопросы

  • Нет связанных вопросов^_^