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(一门工具名语言)所涉及的, ...
随机推荐
- skynet实践(9)-随机数重复问题
最近在使用skynet的过程中,遇到需要为玩家的每次请求产生一个随机序列的场景.简化如下: main.lua中每隔1S便发出一次随机数请求: local skynet = require " ...
- ubuntu c++ 关机 重启 挂起 API
#include <unistd.h> #include <linux/reboot.h> int main() { reboot(LINUX_REBOOT_MAGIC1, L ...
- 【Lintcode】159.Find Minimum in Rotated Sorted Array
题目: Suppose a sorted array is rotated at some pivot unknown to you beforehand. (i.e., 0 1 2 4 5 6 7 ...
- AtCoder Regular Contest 073 E:Ball Coloring
题目传送门:https://arc073.contest.atcoder.jp/tasks/arc073_c 题目翻译 给你\(N\)个袋子,每个袋子里有俩白球,白球上写了数字.对于每一个袋子,你需要 ...
- ie下使用文本编辑器导致input文本框无法聚焦的问题原因
最近公司的一个项目遇到一个如下问题: 描述:测试发现,每当我们在发布活动的页面发布完活动后,页面跳转到我的活动,然后再次回到发布活动页面,发现所有的input文本框都不能聚焦.然后再去看看其他页面(我 ...
- Camera Vision - video surveillance on C#
转自:http://blog.csdn.net/xyz_lmn/article/details/6072897 http://www.codeproject.com/KB/audio-video/ca ...
- Python pip 报错
1,pip ssl certification ssl: certificate_verify_failed... 2,Could not find a version that satisfies ...
- Moco框架jar下载地址
1.打开url:http://repo1.maven.org/maven2/com/github/dreamhead/moco-runner/0.10.0/ 2.下载最大的jar包,如下图所示:
- Tomcat的目录结构详解
转自:https://blog.csdn.net/u012661010/article/details/73381599
- 2.5玩转xargs
我们可以利用管道将一个命令的stdout(标准输出)重定向到另一个命令的stdin(标准输入).有些命令只能以命令行参数的形式接受数据,而无法通过stdin接受数据流.这时候就没法使用管道.那么xar ...