tkinter askdirectory在导入的模块中不起作用

时间:2019-10-14 21:05:37

标签: python tkinter

我一直在使用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 :(得分:0)

您的两个版本都不起作用。两者都给'module' object is not callable

您必须使用

 root = Tk.Tk()

代替

 root = Tk()

,然后两个版本都可以使用。


也许Tk中的两个Tk.Tk()看起来很奇怪,但通常我们使用小写的tk而不是{p}中的Tk

import tkinter as tk

然后您有

root = tk.Tk()