Python Tkinter:向文件对话框添加小部件

4 投票
2 回答
1291 浏览
提问于 2025-04-17 14:41

我正在用 TkinterPython 2.6 以及 2.7 来编写图形用户界面。

这些用户界面里有打开文件和保存数据的对话框,这些对话框是通过 tkFileDialog 模块实现的。我想对这些对话框进行一些调整,添加一些额外的输入框,比如让用户可以留下评论。

有没有办法做到这一点呢?

看起来这些文件对话框是直接从操作系统中获取的。在 Tkinter 中,它们是从 tkCommonDialog 模块里的 Dialog 类派生出来的,并调用了一个叫 tk.call("tk_getSaveFile") 的方法,这个方法是用来保存数据的。

我找不到这个方法的定义在哪里。

2 个回答

1

我需要去掉canvasx/y的语句。现在那一行代码简单地写成了 set item [$data(canvas) find closest $x $y],这样运行得很好。单独使用 $data(canvas) canvasx $x 也能正常工作,但和 find closest 一起用就不行,无论是写在一行还是两行。

4

call 方法是在 _tkinter.c 文件中定义的,但对于你这个特定的任务来说,里面没有什么特别有用的内容。它只是调用了一个 Tcl 命令,而这个命令 tk_getSaveFile 才是真正完成工作的部分。

而且,是的,当操作系统上有本地文件对话框时,tk_getSaveFile 会使用这些对话框(比如在 Windows 上会用到 GetSaveFileName)。虽然可以在里面添加一些小部件,但这需要修改 Tk 的 C 源代码。如果你确定你的目标使用的是非本地的 Tk 对话框,你可以通过修改 Tk 的 ::tk::dialog::file:: 过程来在它的小部件层级中添加一些东西(可以查看 library/tkfbox.tcl)。

我更倾向于使用一个 替代实现的 tk_getSaveFile,这个实现是用纯 Tcl/Tk 写的,完全不依赖操作系统的功能。这样,我们就可以确保它在所有操作系统上的布局都是一样的,而且不会因为 Tk 的新版本而突然改变。虽然为 Python 提供一个方便的 API 仍然不是一件简单的事,但至少这是可能的。

撰写回答