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

如何在Tcl/Tk中创建简单菜单?,tcl,tk,Tcl,Tk,当我以后写什么的时候 .win配置-菜单(此处的某些内容) 控制台向我显示消息“无效命令名tk::MenuDup”,因此我无法继续创建任何类型的菜单。我犯了什么错误?对于初学者来说,仅仅从文档中拼凑菜单是相当困难的:需要示例来理解它们是如何工作的。一旦一个人掌握了窍门,他们实际上相当直截了当 我自己不怎么使用菜单,所以我可能忘了在这里提及一些事情。不过我会尽力的。尝试阅读菜单小部件文档,了解可以做什么 基本菜单管理的基本知识 您至少需要一个菜单小部件(如果要从菜单栏中获得级联下拉菜单,则需要几个

当我以后写什么的时候

.win配置-菜单(此处的某些内容)

控制台向我显示消息“无效命令名tk::MenuDup”,因此我无法继续创建任何类型的菜单。我犯了什么错误?

对于初学者来说,仅仅从文档中拼凑菜单是相当困难的:需要示例来理解它们是如何工作的。一旦一个人掌握了窍门,他们实际上相当直截了当

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

基本菜单管理的基本知识 您至少需要一个菜单小部件(如果要从菜单栏中获得级联下拉菜单,则需要几个)

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

.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秒并再次清空标签

下拉菜单具有“撕下”功能,可以将菜单拖走,并将其悬停在屏幕上的其他位置。TEAROF菜单在编写Tk时曾一度流行,因此默认情况下处于打开状态。您应该始终禁用tearoff功能,除非您绝对希望能够删除菜单。您可以通过为单个菜单指定它来实现这一点(此菜单只是一个示例,您不需要它来运行下面的代码):

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

现在我们创建了两个菜单,一个用于水平条的主菜单,以及一个可以从第一个菜单下拉的菜单

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
事实上,我想我就到此为止。显然,这里的答案应该是帮助回答一个特定的问题,而不是如何描述。无论如何,以上内容应该会让你开始

传统知识文献:

Tcl文档:,

对于初学者来说,仅仅从文档中拼凑菜单是相当困难的:需要示例来理解它们是如何工作的。一旦一个人掌握了窍门,他们实际上相当直截了当

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

基本菜单管理的基本知识 您至少需要一个菜单小部件(如果要从菜单栏中获得级联下拉菜单,则需要几个)

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

.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秒并再次清空标签

下拉菜单具有“撕下”功能,可以将菜单拖走,并将其悬停在屏幕上的其他位置。TEAROF菜单在编写Tk时曾一度流行,因此默认情况下处于打开状态。您应该始终禁用tearoff功能,除非您绝对希望能够删除菜单。您可以通过为单个菜单指定它来实现这一点(此菜单只是一个示例,您不需要它来运行下面的代码):

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

现在我们创建了两个菜单,一个用于水平条的主菜单,以及一个可以从第一个菜单下拉的菜单

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
事实上,我想我就到此为止。显然,这里的答案应该是帮助回答一个特定的问题,而不是如何描述。无论如何,以上内容应该会让你开始

传统知识文献:

Tcl文档:,

我们需要了解很多