macOS tkinter:askopenfilename 的文件类型如何工作

Posted

技术标签:

【中文标题】macOS tkinter:askopenfilename 的文件类型如何工作【英文标题】:macOS tkinter: how does filetypes of askopenfilename work 【发布时间】:2020-03-07 00:38:31 【问题描述】:

我的问题

    不能在filetypesFilter之间切换(见下图),因为它们处于灰色模式,如果设置filetypes如下
filetypes = [ 
            ("Python File", "*.py"), 
            ("Image File", "*.bmp"),
            ("All Files", "*.*")
            ]
    虽然默认文件类型是.py,但我们也可以在窗口中选择.bmp,因为test.bmp 会突出显示。这意味着filetypes.py.bmp 可以同时激活。这是Filter 的行为正常吗?

我希望我们可以从filetypes 的集合中挑选出一种类型,这些选项应该是mutually exclusive,即如果在Filter 中选择Python File (.py),那么只有.py 文件将可以在窗口中选择。

代码如下:

from tkinter import *
from tkinter import ttk
from tkinter.filedialog import askopenfilename
# from tkinter.filedialog import askopenfile
# from tkinter.filedialog import askopenfilenames

filetypes = [ 
            ("Python File", "*.py"), 
            ("Image File", "*.bmp"),
            ("All Files", "*.*")
            ]

def OpenFile():
    p = askopenfilename(initialdir="../",
                           filetypes =filetypes,
                           title = "Choose a file.")
    print ("Path to File: \n", p)
    #Using try in case user types in unknown file 
    # or closes without choosing a file.
    # try:
    #     with open(p, 'r') as f:
    #         print("Content of File:\n", f.read())
    # except:
    #     print("Error!")

root = Tk()
root.title( "File Opener")
label = ttk.Label(root, 
                    text ="File Read Test!", 
                    foreground="red", 
                    font=("Helvetica", 16))
label.pack()

menu = Menu(root)
root.geometry("300x200")
root.config(menu=menu)

file = Menu(menu)
file.add_command(label = 'Open', command = OpenFile)
file.add_command(label = 'Exit', command = root.quit)
menu.add_cascade(label = 'File', menu = file)

root.mainloop()

更多示例

如果删除("All Files", "*.*") 会怎样?仍然无法在文件类型之间切换,.py.bmp 都处于活动状态。并且所有其他文件类型都超出了与先前设置相同的范围。
filetypes = [ 
            ("Python File", "*.py"), 
            ("Image File", "*.bmp")]


只留下("All Files", "*.*")。这是我所期望的,*.* 终于生效了。
filetypes = [("All Files", "*.*")]

系统信息

macOS 卡塔利娜 python 3.7.5 TkV 版本 8.6

【问题讨论】:

在SPECIFYING FILE PATTERNS 上了解通配符( 和?)* 我在 macOS Catalina 10.15.5、从 python.org 下载的 python 3.7.6、Tk/Tcl 版本 8.6.8(内置)上遇到了同样的问题。相同的代码在 linux Ubuntu 20.24 上正确运行。我相信你的代码是正确的。如果您找到解决方案,请告诉我。 我相信这是一个 macOS 错误。 当按钮变灰时,我的电脑有时也会显示2020-07-20 10:27:23.723 Python[85149:23405473] *** Assertion failure in void simulateAppSendEvent(NSEvent *, void (^)(NSEvent *))(), /AppleInternal/BuildRoot/Library/Caches/com.apple.xbs/Sources/ViewBridge/ViewBridge-464.1/ViewBridgeUtilities.m:487 @Santi-Santichaivekin Python 3.8.5 问题仍然存在吗? 【参考方案1】:

在我的系统上:

macOS Mojave 10.4.6 Python 3.8.0 TkV 版本 8.6

我发现这个简单的解决方法让我得到了想要的行为:

filetypes = [ 
            ("All Files", "*.*"),
            ("Python File", "*.py"), 
            ("Image File", "*.bmp"),
            ]

也就是说,首先让它提出"All Files",然后在打开的对话框中切换到其他类型,从而适当地过滤文件。

【讨论】:

感谢您的回答。但是我使用 Python 3.8.0 和不同的文件类型组合重新运行此代码,过滤器问题是相同的。我使用 Pyenv 创建虚拟环境和 macOS Catalina 10.15.1。我还通过 Conda 虚拟环境检查了 Python 3.6.9, 3.7.3。 ALL 不能通过Options-->Filters选择文件类型

以上是关于macOS tkinter:askopenfilename 的文件类型如何工作的主要内容,如果未能解决你的问题,请参考以下文章

无法在 MacOS 上使用 pyenv Python 安装 tkinter

MacOS 10.14.6 更新后 Tkinter 导致计算机崩溃

在MacOS上,tkinter始终保持最佳状态

让 tkinter 在带有 asdf 的 macos 上使用 python 3.x

macOS tkinter:askopenfilename 的文件类型如何工作

python服务器文件上传下载+GUItkinter