【发布时间】:2020-02-11 12:11:49
【问题描述】:
我一直在使用 tkinter 提供一个文件对话框(在 python 3.6 中),它允许用户选择一个目录。当它是同一模块中的子功能时,它可以正常工作,但是如果我将该子功能移动到单独的模块中,然后尝试从该模块导入它,它就不再起作用了。相反,当文件对话框应该弹出但它从未出现时,代码只是挂起。
工作代码: 如果我运行 main 函数,这将有效
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 窗口没有出现有关,因为它不是主模块,但有什么办法可以解决这个问题吗?
【问题讨论】:
-
你的第一个版本对我不起作用 - 它给出了错误
'module' object is not callable。你制作了import tkinter as Tk,所以你应该使用root = Tk.Tk(),而不是root = Tk()。所以也许你的第二个版本不起作用,因为你还使用了root = Tk(),它给出了错误'module' object is not callable。您是否在控制台/终端/cmd.exe 中运行它以查看错误?如果你得到错误,那么你应该添加它。 -
我看不出这是怎么复制的。我想要的只是弹出一个对话框窗口,然后我将其销毁,我不会不断地创建新的 Tk 实例。我想要的只是将那段代码移动到不同的模块中,这样我就可以通过导入它在多个程序中使用它。它做的事情与往常完全相同,只是来自导入的模块而不是当前模块。
-
您当前的代码对我来说可以正常工作 - 在 Linux 上。所以我不知道是什么问题。