Tcl/Tk 中的菜单和工具栏
最后修改于 2023 年 10 月 18 日
在本 Tcl/Tk 教程中,我们将学习菜单和工具栏。
菜单栏是位于各种菜单中的一组命令。菜单将我们可以在应用程序中使用的命令分组。工具栏提供对最常用命令的快速访问。
简单菜单
第一个例子将展示一个简单的菜单。
#!/usr/bin/wish # ZetCode Tcl/Tk tutorial # # In this code example, we create # a simple menu. # # Author: Jan Bodnar # Website: www.zetcode.com menu .mbar . configure -menu .mbar menu .mbar.fl -tearoff 0 .mbar add cascade -menu .mbar.fl -label File \ -underline 0 .mbar.fl add command -label Exit -command { exit } wm title . "Simple menu" wm geometry . 350x250+300+300
我们的例子将显示一个包含一个项目的“文件”菜单。通过选择退出菜单项,我们关闭应用程序。
menu .mbar . configure -menu .mbar
我们创建一个菜单栏。菜单栏是菜单的一种特殊情况。
menu .mbar.fl -tearoff 0
创建“文件”菜单。-tearoff
选项指定菜单不能从菜单栏中移除。
.mbar add cascade -menu .mbar.fl -label File \ -underline 0
我们将“文件”菜单添加到菜单栏。-underline
选项给标签的第一个字符加下划线。现在,可以使用 Alt+F 快捷键下拉菜单。
.mbar.fl add command -label Exit -command { exit }
将一个“退出”命令添加到“文件”菜单中。这将创建一个菜单项。当选择菜单项时,应用程序终止。

子菜单
子菜单是插入到另一个菜单对象中的菜单。下一个例子演示了这一点。
#!/usr/bin/wish # ZetCode Tcl/Tk tutorial # # In this code example, we create # a submenu. # # Author: Jan Bodnar # Website: www.zetcode.com menu .mbar . configure -menu .mbar menu .mbar.fm -tearoff 0 .mbar add cascade -menu .mbar.fm -label File \ -underline 0 menu .mbar.fm.sb .mbar.fm.sb add command -label "News feed" .mbar.fm.sb add command -label Bookmarks .mbar.fm.sb add command -label Mail .mbar.fm add cascade -label Import -menu \ .mbar.fm.sb -underline 0 .mbar.fm add separator .mbar.fm add command -label Exit -underline 0 \ -command {exit} wm title . submenu wm geometry . 350x250+300+300
在这个例子中,我们在“文件”菜单的子菜单中有三个选项。我们创建一个分隔符和键盘快捷键。
menu .mbar.fm.sb .mbar.fm.sb add command -label "News feed" .mbar.fm.sb add command -label Bookmarks .mbar.fm.sb add command -label Mail
我们有一个包含三个命令的子菜单。子菜单是一个常规菜单。注意小部件路径名的层次结构。
.mbar.fm add cascade -label Import -menu \ .mbar.fm.sb -underline 0
通过将菜单添加到“文件”菜单而不是菜单栏,我们创建了一个子菜单。underline 参数创建一个键盘快捷键。我们提供一个应该加下划线的字符位置。在我们的例子中,它就是第一个字符。位置从零开始。当我们点击“文件”菜单时,会弹出一个弹出窗口。“导入”菜单有一个字符带下划线。我们可以使用鼠标指针或 Alt+I 快捷键来选择它。
.mbar.fm add separator
分隔符是一条水平线,它在视觉上分隔了菜单命令。通过这种方式,我们可以将项目分组到一些逻辑位置。

弹出菜单
在下一个例子中,我们创建一个弹出菜单。弹出菜单是一个上下文小部件,可以在窗口的客户端区域的任何地方显示。
#!/usr/bin/wish # ZetCode Tcl/Tk tutorial # # In this code example, we create # a popup menu. # # Author: Jan Bodnar # Website: www.zetcode.com menu .m -tearoff 0 .m add command -label Beep .m add command -label Exit -command {exit} bind . "<Button-3>" "showMenu %X %Y" wm title . popupmenu wm geometry . 350x250+300+300 proc showMenu {x y} { tk_popup .m $x $y }
在我们的例子中,我们创建一个包含两个命令的弹出菜单。
menu .m -tearoff 0 .m add command -label Beep .m add command -label Exit -command {exit}
上下文菜单是一个常规的 menu
小部件。tearoff
功能被关闭。
bind . "<Button-3>" "showMenu %X %Y"
我们将 <Button-3>
事件绑定到 showMenu
过程。当我们右键单击窗口的客户端区域时,会生成该事件。我们将两个参数传递给该过程。这些是鼠标点击的 x 和 y 坐标。
proc showMenu {x y} { tk_popup .m $x $y }
showMenu
过程显示上下文菜单。弹出菜单显示在鼠标点击的 x 和 y 坐标处。为了显示弹出菜单,我们使用 tk_popup
命令。

工具栏
菜单将我们可以在应用程序中使用的命令分组。工具栏提供对最常用命令的快速访问。在 Tk 中没有工具栏小部件。
#!/usr/bin/wish # ZetCode Tcl/Tk tutorial # # In this code example, we create # a toolbar. # # Author: Jan Bodnar # Website: www.zetcode.com package require Img menu .mbar . configure -menu .mbar menu .mbar.fl -tearoff 0 .mbar add cascade -menu .mbar.fl -label File \ -underline 0 frame .toolbar -bd 1 -relief raised image create photo img -file "exit.png" button .toolbar.exitButton -image img -relief flat -command {exit} pack .toolbar.exitButton -side left -padx 2 -pady 2 pack .toolbar -fill x wm title . toolbar wm geometry . 350x250+300+300
我们的工具栏将是一个放置按钮的框架。
frame .toolbar -bd 1 -relief raised
创建一个工具栏。它是一个 frame
。我们创建了一个凸起的边框,以便工具栏的边界可见。
image create photo img -file "exit.png" button .toolbar.exitButton -image img -relief flat -command {exit}
创建一个带有图像的退出按钮。
pack .toolbar.exitButton -side left -padx 2 -pady 2
工具栏是一个框架,框架是一个容器小部件。我们将按钮打包到左侧。我们添加了一些填充。
pack .toolbar -fill x
工具栏被打包到根窗口中;它被水平拉伸。

在本 Tcl/Tk 教程中,我们展示了如何创建一个带有菜单和菜单项的菜单栏以及一个工具栏。