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. ES索引瘦身 禁用_source后需要设置field store才能获取数据 否则无法显示搜索结果

    在默认情况下,开启_all和_source 这样索引下来,占用空间很大. 根据我们单位的情况,我觉得可以将需要的字段保存在_all中,然后使用IK分词以备查询,其余的字段,则不存储. 并且禁用_sou ...

  2. linux安装与卸载软件

    在ubuntu系统中,通常使用apt-get命令完成对软件的安装与卸载 安装的软件通常都放置在一些源中,国内有很多镜像源供下载使用,而系统设置的源保存在目录/etc/apt/sources.list文 ...

  3. 【LeetCode】Maximum Product Subarray 求连续子数组使其乘积最大

    Add Date 2014-09-23 Maximum Product Subarray Find the contiguous subarray within an array (containin ...

  4. CF 438 E & bzoj 3625 小朋友和二叉树 —— 多项式开方

    题目:http://codeforces.com/contest/438/problem/E https://www.lydsy.com/JudgeOnline/problem.php?id=3625 ...

  5. vijos:P1190繁忙的都市

    描述 城市C是一个非常繁忙的大都市,城市中的道路十分的拥挤,于是市长决定对其中的道路进行改造.城市C的道路是这样分布的:城市中有n个交叉路口,有些交叉路口之间有道路相连,两个交叉路口之间最多有一条道路 ...

  6. JavaScript与DOM常见面试题

    1. JavaScript 1.1.简要描述 JavaScript的数据类型? 参考答案: Java Sc ri pt 的数据类型可以分为原始类型和对象类型.原始类型包括 string. number ...

  7. c# dll自动注册

    在网上看到一个c# dll自动注册的文章,我测试了一下,可用. 下面是具体代码 [DllImport("Ry4SCom.dll")] public static extern in ...

  8. eclipse中jquery.js文件有错误提示…

    eclipse中jquery.js文件有错误提示的解决办法 2013-04-06 19:18 浏览次数:382 由于jquery.js文件进行了压缩,压缩之后的语法eclipse无法完全识别,所以有错 ...

  9. 7.17实习培训日志-java基础

    总结 今天主要是学习了java基础,java面向对象方面的知识,然后下午老师讲了软件的设计模式,今天看了一部分,印象深刻的是单例模式,用枚举实现单例模式.晚上主要讲了maven的一些基础知识和idea ...

  10. matlab新手入门(一)(翻译)

    桌面基础知识 启动MATLAB®时,桌面将以其默认布局显示. 桌面包括以下面板: 当前文件夹 - 访问您的文件. 命令窗口 - 在命令行中输入命令,由提示符(>>)指示. 工作区 - 浏览 ...