【问题标题】:tkinter askdirectory doesn't work from imported moduletkinter askdirectory 在导入的模块中不起作用
【发布时间】: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 上。所以我不知道是什么问题。

标签: python tkinter


【解决方案1】:

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

你必须使用

 root = Tk.Tk()

而不是

 root = Tk()

然后两个版本都可以工作。


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

import tkinter as tk

然后你就有了

root = tk.Tk()

【讨论】:

  • 看来我的输入不对。我实际上使用 from tkinter import Tk。我编辑了问题。
  • 您的新代码对我有效。我不知道是什么问题。
猜你喜欢
  • 1970-01-01
  • 2011-07-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多