2015-09-26 2 views
1

Использование python 3 и tkinter Я пытаюсь создать диалоговое окно файла, которое позволяет пользователю выбирать существующие каталоги (exists=True).Как подключиться к tkinters FileDialog?

Когда они выбирают choose Я хотел бы проверить, что каталог также доступен для чтения, и я могу получить блокировку файла. Поскольку остальная часть моей программы будет полагаться на чтение доступа к пути, и его процессы займут много времени.

Whey they select cancel Я хотел бы закрыть диалоговое окно.

File Dialogue

Если каталог не readable Я хотел бы диалог файла для отображения askretry сообщения. Нажав Retry, они вернут их, чтобы выбрать файл. нажатие Cancel закроет диалог.

Ask Retry Dialogue

В моей первой попытке, новичок в tkinter, я создал это:

import os 
from tkinter import filedialog 
from tkinter import messagebox 


class OpenDialog(object): 
    def __init__(self): 
     self.directory_path = None 
     self.dialog_title ="Photos Directory Selection" 

    def ask_for_directory(self): 
     while not self.directory_path: 
      self.directory_path = filedialog.askdirectory(mustexist=True, title=self.dialog_title) 
      if not os.access(os.path.dirname(self.directory_path), os.F_OK): 
       self.directory_path = None 
       if not messagebox.askretrycancel(title=self.dialog_title, message="Can't read directory."): 
        break 

Хотя его не совершенен. Это не даст вам cancel диалог с файлом.

Но увы, я думал, что потенциально может вклиниться в самом файле диалога ...

Я просто не могу понять, как я мог чисто крюк в классе FileDialogue, чтобы чисто отображать askretry диалог и повторить процесс ,

filedialogue.py

Если есть что-то я не хватает, пожалуйста, поделитесь :-)

+0

Почему бы не ждать возвращения из диалогового окна, проверьте путь (если пользователь не сделал отменить), затем просто вызовите диалог, если потребуется? – jonrsharpe

+0

Я думаю, что проблема 'filedial.askdirectory' возвращает путь к файлу, а не' bool'. Если бы я мог работать с файлом 'bool' и' file_path' отдельно. – visc

+0

Какие булевы вы ожидаете? – jonrsharpe

ответ

-1

Это работает, но кто-нибудь увидеть проблему с рекурсивным вызовом?

def ask_for_directory(self): 
    self.directory_path = filedialog.askdirectory(mustexist=True, title=self.dialog_title) 
    if self.directory_path: 

     # Check that we have access to the path 
     if not os.access(self.directory_path, os.R_OK): 

      # If we don't have access 
      if messagebox.askretrycancel(title=self.dialog_title, message="Can't read directory."): 
       self.ask_for_directory() 

EDIT:

Вот мой пример, но исправил работать ...

def ask_for_directory(self): 
    while not self.directory_path: 
     self.directory_path = filedialog.askdirectory(mustexist=True, title=self.dialog_title) 
     if self.directory_path: 
      if not os.access(self.directory_path, os.R_OK): 
       self.directory_path = None 
       if not messagebox.askretrycancel(title=self.dialog_title, message="Can't read directory."): 
        break 
     else: 
      break 
Смежные вопросы