GUI的最终选择 Tkinter(七):菜单Menu组件、Menubutton组件、OptionMenu组件
Menu组件
今天说的Menu组件就是一些菜单组件,开始点点点。。。
Tkinter提供了一个Menu组件,可以实现顶级菜单,下拉菜单和弹出菜单。由于底层是代码实现和优化的,所以不太建议通过按钮和其他组件实现菜单功能。
from tkinter import * root = Tk()
def check():
print("被调用查看了")
def slave():
print("调用保存了")
menubar = Menu(root)
filemenu = Menu(menubar,tearoff=)
filemenu.add_command(label="保存",command=slave)
filemenu.add_command(label="查看",command=check)
menubar.add_cascade(label="菜单",menu=filemenu)
root.config(menu=menubar)
mainloop()
执行结果:

创建下拉菜单(或者其他子菜单),方法都是一样的,只是他们最后都添加到主菜单中,而不是窗口上。
from tkinter import * root = Tk()
def open():
print("被调用open...")
def slave():
print("调用save...")
def cut():
print("被调用cut...")
def slave():
print("被调用slave...")
def copy():
print("被调用copy...")
def paste():
print("被调用paste...")
menubar = Menu(root)
#创建一个下拉菜单·文件,然后讲台添加到顶级菜单中
filemenu = Menu(menubar,tearoff=)
filemenu.add_command(label="保存",command=slave)
filemenu.add_command(label="打开",command=open)
filemenu.add_separator()#下拉菜单的分隔线
filemenu.add_command(label="退出",command=root.quit)
menubar.add_cascade(label="文件",menu=filemenu)
editmenu = Menu(menubar,tearoff=)
editmenu.add_command(label="剪切",command=cut)
editmenu.add_command(label="拷贝",command=copy)
editmenu.add_command(label="粘贴",command=paste)
menubar.add_cascade(label="编辑",menu=editmenu)
#显示菜单
root.config(menu=menubar)
mainloop()
执行结果:

这里需要注意下,在调用command后面的函数的时候不能加括号的,因为在执行的时候回从上到下执行一遍,如果添加括号会直接调用,不加括号会等待操作后调用。
创建一个弹出菜单方法也是一致的,不过需要使用post()方法明确地将其显示出来。
from tkinter import * root = Tk()
menubar = Menu(root)
def printItem():
print("popup menu")
filemenu = Menu(menubar,tearoff=)
for kk in ["python","php","jave"]:
filemenu.add_command(label=kk,command=printItem)
filemenu.add_separator()
menubar.add_cascade(label="language",menu=filemenu)
def popup(event):
#显示菜单
menubar.post(event.x_root,event.y_root)
#在这里相应鼠标右键事件,右键调用popup,此时与菜单绑定的是root,可以设置为其他的控件,在绑定的控件上右击可以弹出菜单
root.bind("<Button-3>",popup)
mainloop()
执行结果:

还有一个就是tearoff方法的用法,上面的例子中我们使用最多的是tearoff=False,如果有兴趣可以试下等于True。这是tearoff的用法,也可以用0和1,区别在于,用False的时候第一菜单就是Language下有一个横杠,在右键生成的顶端没有,点击横杠的时候直接生成一个窗口,如果使用True会生成两个一级菜单一个,二级菜单一个。
下面是Menu组件的最后一个用法,不但可以添加单选项的按钮也可以添加多选按钮,就是Checkbutton组件和Radiobutton组件类似。
from tkinter import * root = Tk()
def check():
print("python3")
menubar = Menu(root)
openVar = IntVar()
saveVar = IntVar()
exitVar = IntVar()
filemenu = Menu(menubar,tearoff=)
filemenu.add_checkbutton(label="打开",command=check,variable=openVar)
filemenu.add_checkbutton(label="保存",command=check,variable=saveVar)
#创建一个横线是退出上面的
filemenu.add_separator()
filemenu.add_checkbutton(label="退出",command=root.quit,variable=exitVar)
#顶级菜单名称
menubar.add_cascade(label="文件",menu=filemenu)
editVar = IntVar()
editVar.set()
editmenu = Menu(menubar,tearoff=True)
editmenu.add_radiobutton(label="剪切",command=check,variable=editVar,value=)
editmenu.add_radiobutton(label="拷贝",command=check,variable=editVar,value=)
editmenu.add_radiobutton(label="粘贴",command=check,variable=editVar,value=)
menubar.add_cascade(label="编辑",menu=editmenu)
root.config(menu=menubar)
mainloop()
执行结果:

注意:程序运行后点击顶级菜单下的横杠,会有一个菜单,可以单选可以多选。
Menubutton组件
Menubutton组件是一个和Menu组件相关联的按钮,Menubutton组件生成的窗口可以放在任意位置,也可以调用下拉菜单。早期版本的Tkinter会使用Menubutton组件实现顶级菜单,但是现在会直接使用Menu组件,因此,如果想自己定义菜单按钮的位置时,可以使用Menubutton组件。
先创建一个Menubutton组件,然后在创建一个Menu组件,让他们两个进行关联。
from tkinter import * root = Tk()
def call():
print(" python3.x")
menubar = Menu(root)
mb = Menubutton(root,text="python3",relief=RAISED)
mb.pack()
filemenu = Menu(mb,tearoff=)
filemenu.add_checkbutton(label="打开",command=call)
filemenu.add_command(label="保存",command=call)
filemenu.add_separator()
filemenu.add_command(label="退出",command=root.quit)
mb.config(menu=filemenu)
mainloop()
执行结果:

通过点击“python3”调用filemenu,然后进行操作。
OptionMenu组件
OptionMenu(选项菜单)说白了就是一个下拉菜单的改版,只是弥补了Listbox组件无法实现下拉列表的遗憾。如果想要创建一个选择菜单,只需要一个Tkinter变量即可。
from tkinter import * root = Tk()
root.title("选择菜单")
variable = StringVar()
variable.set("python")
w = OptionMenu(root,variable,"python","php","c#","c++")
w.pack()
mainloop()
执行结果:

选择菜单建好了,如果想根据自己的选择进行操作的话,我们可以使用Tkinter变量的get()方法。
from tkinter import * root = Tk()
root.title("选择菜单")
variable = StringVar()
variable.set("python")
def call():
print(variable.get())
w = OptionMenu(root,variable,"python","php","c#","c++")
w.pack()
Button(root,text="点我",command=call).pack()
mainloop()
执行结果:

最后演示一下如何将更多的选项添加到选项菜单中:
from tkinter import * project = ["python3.6","java","go","php"]
root = Tk()
root.title("选择菜单")
variable = StringVar()
variable.set("python")
def call():
print(variable.get())
w = OptionMenu(root,variable,*project)
w.pack()
Button(root,text="点我",command=call).pack()
mainloop()
执行结果:

GUI的最终选择 Tkinter(七):菜单Menu组件、Menubutton组件、OptionMenu组件的更多相关文章
- Python之GUI的最终选择(Tkinter)
首先,Tkinter是Python默认的GUI库,想IDLE就是用Tkinter设计出来的,因此直接导入Tkinter模块就可以啦 1 import tkinter (1)Tkinter初体验: 1 ...
- GUI的最终选择 Tkinter(五):Text用法
Text组件 绘制单行文本使用Label组件,多行选使用Listbox,输入框使用Entry,按钮使用Button组件,还有Radiobutton和Checkbutton组件用于提供单选或多选的情况, ...
- GUI的最终选择 Tkinter(四):Entry、Listbox、Scrollbar和Scale组件
Entry组件 Entry组件就是平时所说的输入框.输入框是程序员用到的最多的一个程序,例如在输入账号和密码的时候需要提供两个输入框,用于接收密码的输入框还会有星号将实际输入的内容隐藏起来. Tkin ...
- GUI的最终选择 Tkinter(九):事件
Tkinter事件处理 Tkinter应用会花费大部分的时间在处理事件循环中(通过mainloop()方法进入),事件可以是触发的鼠标,键盘的操作,管理窗口触发的重绘事件(在多数情况下都是有用户间接引 ...
- GUI的最终选择 Tkinter(二):Label和Button组件
Label组件 Lable组件是用于界面上输出描述的标签,例如提示用户“您下载的电影含有未成年人限制内容,请满18岁以后点击观看!”,先来上结果图: 在来看下它的代码: from tkinter im ...
- GUI的最终选择 Tkinter(八):Message组件、Spinbox组件、PanedWindow组件、Toplevel组件
Message组件 Message(消息)组件是Label组件的变体,用于显示多行文本消息,Message组件能够自动执行,并调整文本的尺寸使其适应给定的尺寸. from tkinter import ...
- GUI的最终选择 Tkinter(六):Canvas组件
Canvas组件,是一个可以让你任性的组件,一个可以让你随心所欲地绘制界面的组件.Canvas是一个通用的组件,它通常用于显示和编辑图形,可以用它来绘制直线,圆形,多边形,甚至是绘制其他组件. 在Ca ...
- GUI的最终选择Tkinter模块初级篇
一.Tkinter模块的基本使用 1)实例化窗口程序 import tkinter as tk app = tk.Tk() app.title("FishC Demo") app. ...
- GUI的最终选择 Tkinter(一):Tkinter最初体验
EasyGui就是一个简单的文字交互界面模块,从今天开始来开始学习Tkinter Tkinter是Python标准的Gui库,它实际是建立在Tk技术上的,Tk最初是为Tcl(一门工具名语言)所涉及的, ...
随机推荐
- html5--2.9新的布局元素(5)-hgroup/address
html5--2.9新的布局元素(5)-hgroup/address 学习要点 了解hgroup/address元素的语义和用法 通过实例理解hgroup/address元素的用法 对照新元素布局与d ...
- 2015 年最热门的国人开发开源软件 TOP 50
开源中国在 2015 年得到了快速的发展,单开源软件收藏量就接近 40000 款,其中不乏优质的国产开源项目.本文从软件的收藏.下载.访问等多角度挑选出了 2015 年最热门的国产开源软件前五十名,让 ...
- ubuntu c++ 关机 重启 挂起 API
#include <unistd.h> #include <linux/reboot.h> int main() { reboot(LINUX_REBOOT_MAGIC1, L ...
- 机器学习 F1-Score, recall, precision
在机器学习,模式识别中,我们做分类的时候,会用到一些指标来评判算法的优劣,最常用的就是识别率,简单来说,就是 Acc=Npre/Ntotal 这里的 Npre表示预测对的样本数,Ntotal表示测试集 ...
- 【Lintcode】018.Subsets II
题目: Given a list of numbers that may has duplicate numbers, return all possible subsets Notice Each ...
- 数据结构与算法(3)----->队列和栈
1. 栈和队列的基本性质 栈是先进后出;(像是子弹夹,后进先打出) 队列是先进先出;(像是平时排队买冰淇淋,按顺序轮流) 栈和队列在实现的结构上可以有数组和链表两种形式; (1)数组结构实现容易; ( ...
- codevs2189数字三角形w——最优性转化
题目:http://codevs.cn/problem/2189/ 通过增加一维,将最优性转化为可行性. 代码如下: #include<iostream> #include<cstd ...
- RT-Thread信号量使用(动态/静态信号量) 及 信号量的四种使用场合
信号量(Semaphore),有时被称为信号灯,是在多线程环境下使用的一种设施,是可以用来保证两个或多个关键代码段不被并发调用.在进入一个关键代码段之前,线程必须获取一个信号量:一旦该关键代码段完成了 ...
- JAVA操作cassandra数据库
如果是maven项目,在pom.xml里加入依赖.不是的话下载相应的jar包放到lib目录下.这里驱动包的版本要和你cassandra的大版本一致.我这里cassandra的版本是最新的3.9,驱动是 ...
- 在python 3.6的eclipse中,导入from lxml import etree老是提示,Unresolved import:etree的错误
支持代码运行没问题,暂时没有找到真正解决办法,只能通过一下办法暂时解决.如下图: