【问题标题】:TkInter inserts spurious wildcard in filename pattern matchingTkInter 在文件名模式匹配中插入虚假通配符
【发布时间】:2019-01-03 20:28:24
【问题描述】:

我正在尝试向用户显示适合特定模式的文件的文件打开对话框。它们的格式为 prefix_*.suffix,其中星号表示通配符。

这是我假设应该如何使用 TkInter 完成的一个最小示例:

from tkinter.filedialog import askopenfilename

my_dir = 'C:\\path\\to\\some\\directory'
pattern = (('File type', 'prefix_*.suffix'),)
title = 'Title'
my_file = askopenfilename(initialdir=my_dir, filetypes=pattern, title=title)

但是,生成的对话框在我的模式前面添加了一个虚假的通配符,因此它现在看起来像 *prefix_*.suffix。这不是我所期望的。

我做错了吗?我找不到任何关于 TkInter 中的这个接口应该如何工作的像样的文档,所以它可能比我预期的更有限。如果是这样,是否有一个内置的 Python 库可以支持这个特定的用例?

如果它与问题相关,我在 Windows 10 上安装了 32 位 Python。

【问题讨论】:

  • Python 通过在第一种类型的文件中自动包含 * 来做到这一点,当你放一个逗号时,它会使其成为一种新的指定文件类型。
  • @TrooperZ 如果是这样,我应该可以尝试 \\prefix_*.suffix,但这不起作用。它只是删除反斜杠并在前面加上一个星号。这似乎是 TkInter 特有的

标签: python python-3.x user-interface tkinter fileopendialog


【解决方案1】:

filetypes 中的值被解释为文件扩展,而不是文件模式

来自official tcl/tk documentation(tkinter 是 tcl/tk 的薄包装):

-filetypes 选项给出的 filePatternList 值是一个文件模式列表。每个文件模式都是表单的列表 typeName {extension ?extension ...?} ?{macType ?macType ...?}? typeName 是此文件模式描述的文件类型的名称,并且是出现在文件类型列表框中的文本字符串。 扩展名是此文件模式的文件扩展名

它继续说:

由于各个平台的模式匹配规则不同,为保证可移植性,扩展名中不允许使用通配符,特殊扩展名“*”除外。允许不带句号的扩展名(例如“~”),但可能不适用于所有平台。

【讨论】:

  • 好吧,这更有意义,我来自更多的 Qt 背景,其中模式更常见。出于好奇,你知道为什么像 *_suffix.txt 这样的东西仍然有效吗?这只是巧合,而不是预期的用例吗?
猜你喜欢
  • 1970-01-01
  • 2010-10-13
  • 2011-03-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-01-22
  • 2021-10-05
相关资源
最近更新 更多