企业🤖AI Agent构建引擎,智能编排和调试,一键部署,支持私有化部署方案 广告
[TOC] # Menus PAGE支持顶层菜单栏和上下文菜单,通常称为弹出菜单。 PAGE不支持菜单按钮。 弹出菜单本质上是绑定到所选小部件的回调函数。当然,该绑定是使用“绑定窗口”指定的。 有一个菜单编辑器,可帮助创建和修改PAGE的所有菜单。 菜单栏的创建可能会造成混淆,因为PAGE桥接了Tcl和Python。让我尝试解释一下!创建顶层窗口并填充它时,实际上是在构建交互式tcl程序,该程序随后将转换为Python模块。如果用按钮填充顶层窗口小部件,PAGE会以这种方式绑定按钮1,从而在您单击按钮时会发生各种魔术:“属性编辑器”(Attribute Editor)会打开,并且菜单可能会弹出,允许您剪切和复制,指定绑定,等等-您实际上并未调用与该按钮相关联的任何回调。 使用菜单栏,情况有所不同,因为菜单在tcl世界中确实起作用。也就是说,如果您在菜单栏中指定了一个级联子菜单,例如File,然后单击菜单栏中的File,则会打开级联菜单,以便您可以看到它。我认为这很好,因为它允许您在创建菜单时看到菜单栏的结构。但是,如果您输入诸如Quit之类的命令条目并将其与要在Python世界中实现的函数“ quit”绑定,然后在PAGE中单击菜单中的Quit,则Tcl / Tk将尝试执行“放弃”。但是,在PAGE中没有定义tcl“退出”功能。因此,您将看到一个错误窗口,指出“无效的命令名称”退出”。为避免出现这种令人困惑的错误消息,我在4.8.9版中更改了PAGE,以在“菜单编辑器”窗口中未显示的“#”前面添加到在菜单编辑器中输入的实际命令,以便在菜单中选择一个命令。禁止评论被调用,即什么也没发生;这是一条评论。创建Python代码时,“#”为。当然,删除。这些修改对新指定或修改的菜单命令有效。使用较早版本指定的菜单命令仍会引起该错误。如果看到这样的错误消息,则可以放心地选择“确定”并继续使用PAGE,或者可以更改有问题的命令条目-就像我对示例所做的一样,只需一个字符即可-然后继续。 上下文(弹出)菜单不会引起混淆,因为它们是回调函数,因此在PAGE中从不可见。 ## 菜单创建 我最常使用的菜单功能是顶层窗口顶部的菜单栏。 **要创建菜单栏**, 可以通过以下几种方式之一调用菜单编辑器: 1. 选择顶层窗口,然后选择click-to-edit菜单 field in the Attribute Editor, 2. 右键单击“顶级”窗口小部件,然后选择 Widget->Edit Menu, 3. 右键单击“小部件树”中的“顶级”小部件,然后选择 Widget->Edit Menu. 当您编辑菜单时,您将看到菜单栏更改出现在“顶层小部件”中。 您将看不到任何级联菜单。 要创建弹出菜单,请在Widget工具栏中选择Popupmenu窗口小部件,然后在顶层窗口中单击。顶层窗口中不会出现任何窗口小部件,但是窗口小部件树中会出现带有标签“ Menu:Popupmenu \<n>”的菜单图标。然后在“小部件树”中右键单击该Popupmenu小部件图标,然后选择“小部件”->“编辑菜单”。您还可以选择Popupmenu小部件,然后选择“属性编辑器”中的\<click-to-edit>菜单字段。没有Popupmenu小部件出现在顶层窗口中,因为那没有任何意义。 Popupmenu窗口小部件具有可以在“属性编辑器”中修改的属性,例如颜色,字体和命令。在编辑弹出菜单时,在PAGE窗口中将看不到任何更改。您可以具有多个弹出窗口,并且一个弹出窗口可以与多个控件相关联。弹出菜单称为Popupmenu1,Popupmenu2等。反过来,它们在称为popup1,popup2等的相应类函数中实现。这些特殊名称应视为保留供PAGE使用。 请注意,虽然“小部件树”将菜单栏显示为顶级小部件的子小部件,但是上下文小部件显示为根小部件的子小部件。区别在于,上下文菜单仅通过将事件(通常是鼠标按钮)绑定到子控件来与子控件关联。 ## 菜单编辑器 菜单编辑器创建和修改菜单。 如上调用。 菜单中的某些项目可能是简单的命令,例如“ Quit”(退出),它会调用您的退出功能。 其他是诸如文件之类的级联菜单,它们是诸如“新建”,“打开”,“保存”等项的子菜单。要指定类似“退出”示例的操作, * 选择左侧字段顶部的 \<Menu> 项目. * Insert->Command. * Select the entry “New Command”. * 转到编辑器右侧的标签条目,并将标签更改为“退出”,然后按Enter键。 * 转到命令条目,然后输入quit命令的名称,然后按回车键。 * 您可以更改菜单编辑器右窗口中显示的任何选项,例如背景色,字体等。 * 通过选择图像选项右边的省略号并使用文件打开对话框选择图像文件,将图像添加到菜单项。 * 使用箭头按钮或“移动”菜单根据需要向上或向下移动选择。 要放入“文件”之类的级联菜单, * 选择左侧字段顶部的 \<Menu> 项目. * Insert->New Cascade. * 转到右侧的标签条目,然后输入文件。 * 使用箭头按钮或“移动”菜单根据需要向上或向下移动选择。 要将“打开”添加到“文件”菜单, * Select File on the left. * Insert->Command * Select “New Command” * Change its name as above. * Specify the command as above. * Move it up or down as desired. 当然,您可以将级联菜单添加到级联菜单等。完成所有操作后,请单击右侧的“检查”按钮。菜单编辑窗口重复如下: ![](https://img.kancloud.cn/78/b2/78b267092111957f93679bd1a6a515f0_815x756.jpg) 将条目添加到级联菜单时,该条目可以是另一个级联菜单。请参阅下面示例的参考。 创建菜单时,可以先添加最常见的命令,也可以添加指向第二级菜单的级联菜单。一些用于菜单栏的Tcl文档表明,只应该将级联项放在一个菜单栏中。但是,我发现在菜单栏中包含各种项目是非常有用和直观的。 菜单编辑器允许更改单个菜单项的各种颜色以及单个项的字体。此外,还应该能够设置菜单字体、前景和背景颜色的默认值的首选项。偏好处理就是这样。我不允许设置活动前景或背景值的首选项。设置在“字体和颜色”选项卡中;在主页面菜单中,转到“文件”->“首选项”->“字体或文件”->“首选项”->“颜色”。 有关将图像添加到菜单项的要点: * 此时,Tkinter仅适用于文件中的GIF,PNG或PGM / PPM图像。 例如,如果您有一个jpeg,则必须将其转换为一种可接受的格式。 * 同样,在将图像添加到菜单中并且您也有文本时,有必要在复合属性中设置适当的值,以告诉PAGE图像相对于文本位于左侧,右侧,顶部,底部还是中央。 同样,虽然可以在图像输入字段中插入一个图像名称,但不建议这样做,并且该字段已被涂成橙色,作为警告。 * 在XP下,menu.py示例在Linux Mint下无法正常运行。 具体来说,为菜单栏的左按钮指定的图像和标签被替换为“(图像)”。 我贸然认为这是Tk错误。 menu.tcl包含在examples子目录中,以说明我为测试菜单栏功能所做的一些事情。 加载它,生成Python并执行它。 我编写了该示例,以测试菜单字体和颜色的更改以及具有多个图像和多个级别的级联菜单。 我当然不主张到处使用怪异的图像,颜色和字体。 但是你可以。 我不确定处理菜单中字体的最佳方法。现在,PAGE设置了一个变量,该变量用作默认菜单字体,并且该规范在菜单中的其他任何地方都被强制执行,否则未进行其他指定。但是,一旦指定,它就是固定的。如果不重新指定使用位置,则无法更改它。我可能会再讨论这个问题。 单选菜单项类型具有“值”和“变量”选项,需要注意。选择单选按钮时,变量将设置为value。也就是说,如果选中单选按钮,则变量为x且值为a,则x设置为a。菜单编辑器的工作方式是,当将单选条目添加到菜单时,标签和值设置为“ NewRadio”,变量设置为“ selectedButton”。如果要使用变量设置,则必须将变量更改为其他值,即您要使用的值。 PAGE将更改以创建正确的Tkinter变量类型字符串类型。它还将威胁value字段的值作为字符串常量。将该字段更改为适合您的应用程序的值。切记,菜单中的无线电条目必须都共享一个单一变量。 检查菜单条目类型具有选项“ onvalue”,“ offvalue”和“ variable”,与单选条目非常相似。主要区别在于检查条目期望每个条目将具有其自己的变量。他们没有共享。同样,PAGE将变量实现为StringVar对象,将“ onvalue”和“ offvalue”实现为字符串常量。通过在命令选项中指定不同的功能或使用lambda函数将不同的参数传递给命令功能,可以绕过与菜单关联的变量。 ## 菜单栏修改 要修改菜单栏,需要打开菜单栏的菜单编辑器。可以这样做的几种方式。 打开菜单编辑器的一种方法是使用button-1在小部件树中选择菜单小部件,然后在属性编辑器窗口中选择\<click to edit>字段。属性编辑器还可用于更改菜单字体、菜单颜色等。 另一种方法是使用button-3在小部件树中选择菜单小部件。然后选择小部件->编辑菜单…. 另一种方法是选择TopPress小部件,然后在属性编辑器中的菜单标签旁边的“点击编辑”>字段。 另外,用button-3在widget树中选择顶层widget,然后选择widget->edit菜单栏。 ## 弹出菜单绑定 最后要讨论的主题是将弹出菜单绑定到各个小部件。弹出菜单通常由绑定到特定窗口小部件的鼠标事件激活。 Tk文档讨论了鼠标事件与不同操作系统的小部件的绑定,以及PAGE尝试遵循这些约定的PAGE。这是上述黑客之一。注意,GUI可以具有一个以上的上下文菜单,并且一个控件可以绑定到一个上下文菜单。作为后者的示例,请参见[Lib Demo](),这是一个像相册一样的示例,它显示许多缩略图图像,每个缩略图图像都可以调用相同的弹出菜单。 PAGE将弹出窗口的回调函数实现为顶级类的类方法,因为这些函数是由PAGE生成的。其他回调函数在支持模块中作为骨架函数生成。上下文菜单的回调函数和菜单本身具有特殊名称。上下文菜单具有PAGE生成的名称,如Popupmenu1,Popupmenu2等,并且包含的​​回​​调函数为popup1,popup2等。后者的名称保留用于pupup回调函数。这是上一段提到的黑客的一部分。由于菜单名称和回调名称Popupmenu \<n>和popup \<n>之间存在密切关系,因此请勿修改菜单别名。 传递给弹出例程的事件对象包含有关打开菜单的事件的大量信息,请参见[事件对象]()。但是,有时您希望将参数从GUI通过弹出菜单传递给支持模块中的回调例程。就是这样弹出菜单的def语句如下所示: ~~~ def popup1(event, *args, **kwargs): ~~~ 因此,使用绑定菜单,可以使用以下方式将Button-3事件绑定到弹出菜单: ~~~ self.Button1.bind('<Button-3>', lambda e: self.popup1(e,1)) ~~~ 使用绑定菜单: ![](https://img.kancloud.cn/1a/15/1a157c6f818591c4d1f8b760330bd3b7_668x590.png) 并在弹出菜单中将command属性设置为类似以下内容: ~~~ lambda:zzz(args[0]) ~~~ 结果是,当使用\<Button-3>选择窗口小部件Button1时,将出现弹出窗口,并且如果选择了适当的命令,则将使用参数“ 1”调用函数zzz。 看到[Popup example ‘positional’](file:///C:/Program%20Files/page/docs/html/examples.html#popup). 如果将弹出菜单绑定到窗口小部件,则该菜单适用于该窗口小部件的所有子窗口小部件。 因此,如果将弹出菜单绑定到顶层小部件,并且还将另一个弹出菜单绑定到子小组件,则说一个按钮,然后单击弹出按钮,在Linux中为Button-3,这两个菜单都会弹出。 ## 复制和粘贴菜单 当前,复制和粘贴仅在借用功能的上下文中适用于菜单栏。 因此,请参阅从现有项目中借用小部件以获取详细信息。我还没有查看复制和粘贴弹出菜单。