【问题标题】:Tkinter askopenfilename not returning as expected when user clicks "Cancel."当用户单击“取消”时,Tkinter askopenfilename 未按预期返回。
【发布时间】:2017-11-02 02:26:34
【问题描述】:

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

我做了这个小测试程序,行为和我的实际项目一模一样:

from tkinter import *
from tkinter import filedialog

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

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

将 '' 替换为 '()' 不会改变任何内容。

感谢任何帮助找出正在发生的事情。谢谢。

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

简单地检查两者是否符合我的需要,但这是一种奇怪的行为。

我在 Linux Mint 上使用 Python 3。

【问题讨论】:

  • 这符合我的预期。你用的是什么操作系统?
  • 你能引用你正在使用的文档吗?是effbot吗?该函数似乎返回一个空元组。也许这是py2和py3之间的变化。与'()' 的比较不起作用,因为那是一个字符串,而不是一个元组。而是尝试if name == ():(不带引号)或更惯用的if not name:。这些都对我有用。
  • @PaulRooney 做到了。谢谢您的帮助。供参考:我在 Linux Mint 上使用 python3。
  • 现在我得到了一些更奇怪的行为。更新了问题。
  • 如果你只是做if not name: 这不是处理这两个实例吗?它这样做很奇怪。我也能看到。我想这只是 python/tk 接口的怪癖之一。

标签: python python-3.x tkinter


【解决方案1】:

如果名称可以正常工作。

from tkinter import *
from tkinter import filedialog

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

【讨论】:

  • 这对我有用,但if not name: 的建议不起作用。我会接受这个作为答案并很高兴它有效,但我仍然非常困惑。
【解决方案2】:

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

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

(我没有尝试使用 initialdir 和 initialfile 选项,但我猜测它们也会导致返回一个空元组……至少最初是这样?)

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

f_picked = tkFileDialog.askopenfilename() test = type(f_picked) print (test)
结果:
<type 'unicode'> # 没有选择,取消点击
<type 'tuple'> # 文件选择,取消点击
<type 'str'> # 文件选择, OK clicked
<type 'tuple'> # 多个文件被选中,OK clicked

【讨论】:

    【解决方案3】:

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

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

    我已经决定对 askopenfilename 对话框返回的文件名进行这个简单的测试和清理:

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

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-10-05
        • 2017-03-31
        • 1970-01-01
        • 2016-08-14
        相关资源
        最近更新 更多