我一直在使用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窗口不出现有关,因为它不是主要模块,但是有什么办法可以克服?
答案 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()