当用户单击“取消”时,Tkinter askopenfilename未按预期返回。

时间:2017-11-02 02:26:35

标签: python python-3.x tkinter

根据文档,如果用户单击“取消”,则应该返回一个空字符串,但是它没有这样做,我无法弄清楚它实际返回的内容。

我制作了这个小测试程序,其行为与我的实际项目相同:

from tkinter import *
from tkinter import filedialog

name = filedialog.askopenfilename()
if name == '':
    print("Nothing chosen")
else:
    print(name)

当用户点击取消时最终打印的是一对空括号()

用'(')替换''不会改变任何东西。

任何有助于弄清楚正在发生的事情的人都表示赞赏。谢谢。

更新:感谢@ PaulRooney的建议,但现在,我第一次运行这部分代码(在我的完整项目中),它返回空元组。对于每次后续运行,它都返回一个空字符串。

只需检查两件作品是否符合我的需要,但这是奇怪的行为。

我在Linux Mint上使用Python 3。

4 个答案:

答案 0 :(得分:2)

如果名称可以正常使用。

from tkinter import *
from tkinter import filedialog

name = filedialog.askopenfilename()
if name:
    print(name)
else:
    print("Nothing chosen")

答案 1 :(得分:0)

嗯......请确保您使用的是Python 3,因为这不适用于Python 2 当我将括号更改为“”(我在Python 2上)

时,它对我有用

答案 2 :(得分:0)

直到我回答了一个年长但相似的question之后,我才看到这篇文章!

基本上,点击取消将返回一个空字符串... 除非您先实际选择/突出显示文件,然后单击取消。 这似乎返回一个空元组!!!

(我没有尝试初始化和初始文件选项,但我猜他们也会导致返回一个空元组...至少最初?)

使用python 2.6.6(IDK,问RedHat)
运行以下代码会生成后续结果

f_picked = tkFileDialog.askopenfilename() test = type(f_picked) print (test)
结果:
<type 'unicode'>#未选择任何内容,取消点击了 <type 'tuple'>#文件已选中,取消点击了 <type 'str'>#文件已选中,确定点击了 <type 'tuple'>#选择了多个文件,确定点击了

答案 3 :(得分:0)

我有一个File -> Open菜单项,显示askopenfilename对话框。我发现使用python 2.73.6第一次,我使用对话框并选择Cancel或从窗口边框关闭对话框,它返回一个空元组,而不是''。此后每次对话框在''或关闭窗口时返回Cancel

也许这是某种功能,但感觉像是个错误,尤其是对于这种不支持选择多个文件的对话。一个空的元组从askopenfilenames中是有意义的。

我已经完成了这个简单的测试和清理工作,以解决AskopenFileName对话框返回的文件名:

if str(filename) == '()':
    filename = ''