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组件的更多相关文章

  1. Python之GUI的最终选择(Tkinter)

    首先,Tkinter是Python默认的GUI库,想IDLE就是用Tkinter设计出来的,因此直接导入Tkinter模块就可以啦 1 import tkinter (1)Tkinter初体验: 1 ...

  2. GUI的最终选择 Tkinter(五):Text用法

    Text组件 绘制单行文本使用Label组件,多行选使用Listbox,输入框使用Entry,按钮使用Button组件,还有Radiobutton和Checkbutton组件用于提供单选或多选的情况, ...

  3. GUI的最终选择 Tkinter(四):Entry、Listbox、Scrollbar和Scale组件

    Entry组件 Entry组件就是平时所说的输入框.输入框是程序员用到的最多的一个程序,例如在输入账号和密码的时候需要提供两个输入框,用于接收密码的输入框还会有星号将实际输入的内容隐藏起来. Tkin ...

  4. GUI的最终选择 Tkinter(九):事件

    Tkinter事件处理 Tkinter应用会花费大部分的时间在处理事件循环中(通过mainloop()方法进入),事件可以是触发的鼠标,键盘的操作,管理窗口触发的重绘事件(在多数情况下都是有用户间接引 ...

  5. GUI的最终选择 Tkinter(二):Label和Button组件

    Label组件 Lable组件是用于界面上输出描述的标签,例如提示用户“您下载的电影含有未成年人限制内容,请满18岁以后点击观看!”,先来上结果图: 在来看下它的代码: from tkinter im ...

  6. GUI的最终选择 Tkinter(八):Message组件、Spinbox组件、PanedWindow组件、Toplevel组件

    Message组件 Message(消息)组件是Label组件的变体,用于显示多行文本消息,Message组件能够自动执行,并调整文本的尺寸使其适应给定的尺寸. from tkinter import ...

  7. GUI的最终选择 Tkinter(六):Canvas组件

    Canvas组件,是一个可以让你任性的组件,一个可以让你随心所欲地绘制界面的组件.Canvas是一个通用的组件,它通常用于显示和编辑图形,可以用它来绘制直线,圆形,多边形,甚至是绘制其他组件. 在Ca ...

  8. GUI的最终选择Tkinter模块初级篇

    一.Tkinter模块的基本使用 1)实例化窗口程序 import tkinter as tk app = tk.Tk() app.title("FishC Demo") app. ...

  9. GUI的最终选择 Tkinter(一):Tkinter最初体验

    EasyGui就是一个简单的文字交互界面模块,从今天开始来开始学习Tkinter Tkinter是Python标准的Gui库,它实际是建立在Tk技术上的,Tk最初是为Tcl(一门工具名语言)所涉及的, ...

随机推荐

  1. AtCoder Grand Contest 013 C:Ants on a Circle

    题目传送门:https://agc013.contest.atcoder.jp/tasks/agc013_c 题目翻译 给你一个周长为\(L\)的圆,有\(N\)只蚂蚁在圆上爬,速度为一单位距离每秒. ...

  2. bzoj 5093 图的价值 —— 第二类斯特林数+NTT

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=5093 每个点都是等价的,从点的贡献来看,得到式子: \( ans = n * \sum\li ...

  3. 为VSFTP用户指定登录后的目录.原创测试通过.

    VSFTP用户目录指定1修改VSFTP配置文件Vi /etc/vsftpd/vsftp.conf  #启动chroot列表chroot_list_enable=YES#指定列表位置chroot_lis ...

  4. 【转】Pro Android学习笔记(六):了解Content Provider(中)

    Content Provider的架构 Authority类似web中的域名,每个content provider会通过AndroidManifest.xml向系统注册authority,如下.其中n ...

  5. Spring框架中的@Import、@ImportResource注解

    spring@Import @Import注解在4.2之前只支持导入配置类 在4.2,@Import注解支持导入普通的java类,并将其声明成一个bean 使用场景: import注解主要用在基于ja ...

  6. <正则吃饺子> :关于微信支付的简单总结说明(二)

    关于微信退款 一.官方文档 申请退款:https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=9_4&index=6 二.退款流程 ...

  7. java 放射机制简介

    放射,说白了就是通过名字加载相应的类,以及类的方法和属性,是为了解决开发中不知道别人会写什么类而采取的一种顺利开发的东东. package com.io; //学生业务类 不知道别人写的 这个是别人写 ...

  8. 用expressjs写RESTful API

    http://blog.csdn.net/kiwi_coder/article/details/36424671     用expressjs写RESTful API http://blog.csdn ...

  9. UGUI ScrollRect滑动居中CenterOnChild实现

    NGUI有一个UICenterOnChild脚本,可以轻松实现ScrollView中拖动子物体后保持一个子物体位于中心位置.然而UGUI就没这么方便了,官方并没有类似功能的脚本.网上找到一些运行效果都 ...

  10. 关于WPF的弹出窗口

    几个重要的概念需要清楚: Show和ShowDialog区别 1.调用Show方法后弹出子窗口后,线程会继续往下执行.调用ShowDialog方法弹出子窗口后,线程会阻塞,直到子窗口关闭才继续往下执行 ...