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



我一直在使用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)

如果我把它放在另一个模块中并从该模块导入它,那么它将打印直到"撤回后",然后挂起。

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)

它永远不会超过"撤回后",文件对话框永远不会弹出。

有谁知道我在这里做错了什么?我认为这与 tkinter 窗口没有出现有关,因为它不是主模块,但有没有办法克服它?

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

你必须使用

root = Tk.Tk()

而不是

root = Tk()

然后两个版本都有效。


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

import tkinter as tk

然后你有

root = tk.Tk()

最新更新