macOS tkinter:askopenfilename 的文件类型如何工作
Posted
技术标签:
【中文标题】macOS tkinter:askopenfilename 的文件类型如何工作【英文标题】:macOS tkinter: how does filetypes of askopenfilename work 【发布时间】:2020-03-07 00:38:31 【问题描述】:我的问题
-
不能在
filetypes
和Filter
之间切换(见下图),因为它们处于灰色模式,如果设置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 导致计算机崩溃
让 tkinter 在带有 asdf 的 macos 上使用 python 3.x