如何在Tcl / Tk中创建一个简单的菜单?

时间:2014-09-17 15:48:31

标签: tcl tk

当我在

之后写任何东西时

.win configure -menu(这里的东西)

控制台向我显示消息"无效的命令名称tk :: MenuDup"所以我不能继续创造任何类型的菜单。在哪里犯了错误?

1 个答案:

答案 0 :(得分:3)

对于初学者而言, 相当难以从文档中整理出来:需要使用示例来了解它们的工作原理。一旦掌握了它,它们实际上非常简单。

我自己并不多使用菜单,所以我可能会忘记在这里提及的事情。不过,我会尽我所能。尝试阅读菜单小部件文档,以了解可以做些什么。

基本菜单管理的基本基础

您需要至少一个菜单小部件(如果您要从菜单栏中获得级联下拉菜单,则需要几个)。

menu .m

接下来,在菜单中添加一些项目。命令itens是最常见的:选择后,它们会执行添加项目时命名的命令。您还需要一个标签,它将是菜单文本。

.m add command -command filecmd   -label File
.m add command -command searchcmd -label Search
.m add command -command helpcmd   -label Help

当然,你也需要编写命令。这些只是虚拟程序。

proc filecmd {} {tk_messageBox -message Filing!}
proc searchcmd {} {tk_messageBox -message Searching!}
proc helpcmd {} {tk_messageBox -message Helping!}

现在我们可以将菜单放在窗口中。 .win窗口可能是toplevel,即由运行的Tk进程创建的新独立窗口。我们将把菜单放在主窗口中。

. configure -menu .m

再次感受

添加级联下拉菜单的示例。

使用对话框模拟命令很麻烦,我会添加一个简短显示文字的标签。

grid [ttk::label .status -width 30] -sticky ew

proc status txt {
    .status configure -text $txt
    after 1500 [list .status configure -text {}]
}

status命令只是将标签设置为显示文本,然后等待1.5秒并再次清空标签。

下拉菜单具有“撕下”功能,可让您将菜单拖离,并将其悬停在屏幕上的其他位置。当写入Tk时,Tearoff菜单会很简单,因此默认情况下它们处于打开状态。您应该始终禁用撕裂功能,除非您绝对希望能够撕下菜单。你可以通过为单个菜单指定它来做到这一点(这个菜单就是一个例子,你不需要它来运行下面的代码):

menu .foobar -tearoff 0

您也可以将默认设置更改为“关闭”(我强烈建议您这样做):

option add *TearOff off

现在我们创建两个菜单,一个是水平条的主菜单,另一个是我们可以从第一个菜单拉下来的菜单。

menu .m
menu .m.file

下拉菜单应该是主菜单的子菜单,而不是我之前写的兄弟姐妹。同级窗口也可以工作,但那里可能存在一定程度的不良。

第一个菜单与第一个示例中的菜单类似,但第一个项目是级联项目而不是命令项目。这意味着它不会调用命令而是打开另一个菜单。

.m add cascade -menu .m.file      -label File
.m add command -command searchcmd -label Search
.m add command -command helpcmd   -label Help

我们也填写了第二个菜单......

.m.file add command -command {filecmd new}  -label New
.m.file add command -command {filecmd open} -label Open
.m.file add command -command {filecmd save} -label Save

我们需要创建命令......

proc filecmd op {status "File operation {$op} selected"}
proc searchcmd {} {status "Search selected"}
proc helpcmd {} {status "Help selected"}

最后,我们将主菜单添加到主窗口。试试吧!

. configure -menu .m

实际上,我想我会在这里停下来。显然,这里的答案应该有助于解决特定问题而不是如何描述。无论如何,上面的内容应该让你开始。

Tk文档:gridmenuoption

Tcl文档:afterproc