tkinter filedialog.askopenfilename()窗口在python 3中无法关闭。

2 人关注

我在python 2x中玩了一下tkinter,每当我使用 filename = tkFileDialog.askopenfilename() 时我可以很容易地打开一个文件使用,之后对话窗口就会自动关闭。

不知为何,这在Python 3x中不起作用。一个示例代码。

import tkinter
from tkinter import filedialog
    def character_mentions():
        filename = filedialog.askopenfilename()
        with open(filename, 'r') as infile:
            reader = csv.reader(infile)
            dict_of_mentions = {rows[1]:rows[2] for rows in reader}
        print(dict_of_mentions)

这让我得到了我想要的输出,但空的根窗口却一直开着,一片空白。当我按下X按钮时,它冻结了,迫使我用任务管理器关闭它。

对这里的工作有什么想法吗?提前感谢!

3 个评论
实际上是剩下的文件对话框,还是Tkinter给你的空的根窗口,不管你是否想要? 如果你对Tkinter的唯一预期用途是文件或其他对话框,最好是明确地创建并隐藏那个根窗口。替换代码0】也许。
@jasonharper 啊,是的--我指的就是这个窗口,谢谢。我编辑了我的问题。我添加了这一行,但很遗憾,它没有起作用。
你的代码是不完整的。你缺少一个tkinter实例,一个mainloop,和一个对函数的调用。请提供 最小化、完整化和可验证的例子 .
python
python-3.x
tkinter
Waldkamel
Waldkamel
发布于 2018-07-30
2 个回答
Mike - SMT
Mike - SMT
发布于 2022-07-13
已采纳
0 人赞同

你需要创建一个tkinter实例,然后隐藏主窗口。

在函数中,一旦你的函数完成了,你可以简单地 destroy() 这个tkinter实例。

import tkinter
from tkinter import filedialog
root = tkinter.Tk()
root.wm_withdraw() # this completely hides the root window
# root.iconify() # this will move the root window to a minimized icon.
def character_mentions():
    filename = filedialog.askopenfilename()
    with open(filename, 'r') as infile:
        reader = csv.reader(infile)
        dict_of_mentions = {rows[1]:rows[2] for rows in reader}
    print(dict_of_mentions)
    root.destroy()
character_mentions()
root.mainloop()
    
wiseboar
wiseboar
发布于 2022-07-13
0 人赞同

如果你想要一个实现所述解决方案的 filedialog 的直接替换,你可以使用下面的类(myfile.py)。

import tkinter as tk
from tkinter import filedialog as fd
# noinspection PyPep8Naming
class filedialog(tk.Tk):
    @classmethod
    def askopenfilename(cls, *args, **kwargs):
        root = cls()
        root.wm_withdraw()
        files = fd.askopenfilename(*args, **kwargs)