【问题标题】:How can I only accept certain file with tkinter?我怎样才能只接受 tkinter 的某些文件?
【发布时间】:2021-03-26 14:47:15
【问题描述】:

我想在 tkinter askopenfilename 对话框中接受某个文件 config.cfg,这是我的代码。

mod_config_path = tkinter.filedialog.askopenfilename(parent=None, 
                                                     title="Select config.cfg file", 
                                                     initialdir=steamapps, 
                                                     filetypes=[("config.cfg", "config.cfg")])

问题是,filetypes=[("config.cfg", "config.cfg")] 没有做我想做的事。

我只想接受 config.cfg 文件,而不是以 config.cfg 结尾的 misc_config.cfgotherconfig.cfg。但如下图,它接受*config.cfg文件,misc_config.cfg文件也显示在图片中。

所以,我想做的是,删除*config.cfg 中的*,使其只接受config.cfg 文件。

我在互联网上找不到任何相关的答案,这太令人失望了......

【问题讨论】:

  • 这可能吗?我认为 tkinter 在您在那里提供的任何扩展名的第一个上添加了一个额外的*。也许就这样,然后使用 python 来验证选择的文件只是config.cfg 而不是somethingconfig.cfg
  • 这似乎是依赖于操作系统的行为。我正在使用 Linux,并且提供的代码完全符合我们的要求:我只看到“config.cfg”,而不是“misc_config.cfg”或“otherconfig.cfg”
  • @j_4321 我猜你是对的。 在 Unix 和 Macintosh 平台上,扩展使用 glob 样式的模式匹配进行匹配。在 Windows 平台上,扩展由底层操作系统匹配。 Source
  • 您可以考虑使用ctypes 并尝试捕捉FileOK_Event,但这对我来说似乎工作量太大。如果您只想接受一个特殊文件,为什么不喜欢以编程方式获取它而不是用户选择?
  • 仅供reference MS 文档讨论这种情况。

标签: python tkinter


【解决方案1】:

总结一下我的cmets作为答案:

official docs of tcl 代表 tk 说:

在 Unix 和 Macintosh 平台上,扩展使用 glob 样式的模式匹配进行匹配。在 Windows 平台上,扩展由底层操作系统匹配。

因此,如果您在 Windows 下,要么编写自己的 FileDialog,要么尝试通过 ctypes 捕获 FileOK Event 并触发虚拟事件。

您也可以按照@CoolCloud 的建议在对话后验证文件。

【讨论】:

    猜你喜欢
    • 2010-11-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-09
    • 1970-01-01
    • 2012-09-13
    • 1970-01-01
    • 2014-04-14
    相关资源
    最近更新 更多