Python tkinter, tkinter.askdirectory () возвращает исходный каталог по умолчанию, когда пользователь нажимает «отменить» или X out, или Es c окно - PullRequest
1 голос
/ 03 августа 2020

Независимо от того, что я делаю, tkinter.filedialog.askdirectory() возвращает исходное значение по умолчанию (текущий каталог), когда кнопка Cancel, или X кнопка закрытия в окне, или если пользователь выбирает Esc. Я пробовал кодировать опцию для начального каталога на C:\, а не на E:\, где сохраняется скрипт, чтобы попытаться контролировать это. Однако, если выбрано Cancel, X или Esc, он все равно возвращает E:\. Я также попытался добавить root.protocol, чтобы X закрыл всю программу, но это не повлияло на поведение. Я инициализировал каталог пустой строкой, что тоже не повлияло. Вся документация и вопросы / ответы, которые я нахожу, просто утверждают, что в этих случаях он должен возвращать пустую строку. Мне нужно, чтобы это было правдой! Я не вижу, что здесь не так; Спасибо заранее за любые советы. Единственный намек, который у меня есть, - я не уверен, как используются диалоги сообщений и файлов tkinter или, если они используют, окно root. Я думаю, что здесь я могу терять контроль ... ??

Я на Windows 10, использую Python 3.7.0.

Вот игрушечный пример того, что Имею:

import os
import tkinter
import tkinter.filedialog as tkf

class Directory(tkinter.Tk):
    def __init__(self):
            
        self.root = tkinter.Tk()
        self.root.protocol("WM_DELETE_WINDOW", self.root.quit())
        self.root.withdraw()

        self.directory = ""
        
       
    def GetDirectory(self):
        self.directory = os.path.abspath(tkf.askdirectory(master = self.root, initialdir = 'C:\\', title = "Select your Source directory")) 
        print('type directory', type(self.directory), self.directory=="", self.directory)
      
        return self.directory

if __name__ == "__main__":
    app = Directory()
    Directory.GetDirectory(app)

Output after hitting cancel, Esc, or X:

type directory <class 'str'> False E:\

1 Ответ

2 голосов
/ 03 августа 2020

Причина вашей проблемы в том, что вы добавляете os.path.abspath() в свой askdirectory.

os.path.abspath (): возвращает нормализованную абсолютизированную версию pathname path

Даже если он вернет "" при отмене или нажатии «X», но os.path.abspath("") вернет абсолютный путь к текущей папке.

self.directory = tkf.askdirectory(master=self.root, initialdir='C:\\', title="Select your Source directory")

Это просто вернет абсолютный путь к выбранной вами папке. И если вы ничего не выберете, он вернет "".

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...