tkinter askdirectory не работает из импортированного модуля - PullRequest
1 голос
/ 15 октября 2019

Я использую tkinter для предоставления диалогового окна файла (в python 3.6), которое позволяет пользователям выбирать каталог. Он отлично работает, когда он является подфункцией в том же модуле, но если я переместу эту подфункцию в отдельный модуль, а затем попытаюсь импортировать ее из этого модуля, она больше не работает. Вместо этого код просто зависает, когда диалоговое окно файла должно появиться, но оно никогда не появляется.

рабочий код: Это работает, если я запускаю основную функцию

from tkinter import Tk
from tkinter.filedialog import askdirectory

def SelectDirectory():
    # start up the tk stuff to have a file directory popup
    print('start')
    root = Tk()
    print('postroot')
    root.withdraw()
    print('postwithdraw')
    # let the user pick a folder
    basepath = askdirectory(title='Please select a folder')
    print('postselection')
    root.destroy()
    print('postdestroy')
    return basepath

def main():
    ans = SelectDirectory()
    print(ans)

Если я вместо этого помещаю это в другуюмодуль и импортируйте его из этого модуля, затем он будет печатать до 'postwithdraw', а затем просто зависнет.

submod.py:

from tkinter import Tk
from tkinter.filedialog import askdirectory

def SelectDirectory():
    # start up the tk stuff to have a file directory popup
    print('start')
    root = Tk()
    print('postroot')
    root.withdraw()
    print('postwithdraw')
    # let the user pick a folder
    basepath = askdirectory(title='Please select a folder')
    print('postselection')
    root.destroy()
    print('postdestroy')
    return basepath

, а затем запустите:

from submod import SelectDirectory

def main():
    ans = SelectDirectory()
    print(ans)

Он никогда не проходит после 'postwithdraw', и никогда не появляется диалоговое окно файла.

Кто-нибудь знает, что я здесь не так делаю? Я думаю, что это как-то связано с тем, что окно tkinter не появляется, поскольку оно не является основным модулем, но есть ли способ обойти это?

1 Ответ

0 голосов
/ 15 октября 2019

Ваши обе версии не работают. Оба дают 'module' object is not callable.

Вы должны использовать

 root = Tk.Tk()

вместо

 root = Tk()

, и тогда обе версии работают.


Может быть, два Tk в Tk.Tk() кажутся странными, но обычно мы используем строчные tk вместо Tk в

import tkinter as tk

, и тогда у вас есть

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