当我在
之后写任何东西时.win configure -menu(这里的东西)
控制台向我显示消息"无效的命令名称tk :: MenuDup"所以我不能继续创造任何类型的菜单。在哪里犯了错误?
答案 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
实际上,我想我会在这里停下来。显然,这里的答案应该有助于解决特定问题而不是如何描述。无论如何,上面的内容应该让你开始。