Python进阶(四)-图形界面编程Tkinter(4)

四、Tkinter创建图像界面4

4.1 组件介绍

4.1.1 Menu

Menu 控件(菜单控件)可以说是 GUI 中“精髓所在”,它以可视化的方式将一系列的“功能选项卡”进行分组,并在每个分组下又“隐藏”了许多其他的“选项卡”。当打开菜单时,这些选项卡就会“显式”的呈现出来,方便用户进行选择,比如 Windows 系统中记事本文件(.txt文件类型)的界面:

menu菜单控件

图1:Menu菜单界面

通过使用菜单控件(Menu)可以充分地节省有限的窗口区域,让我们的界面更加简洁优雅,避免臃肿、混乱。

Tkinter Menu 控件提供了三种类型的菜单,分别是:topleve(主目录菜单)、pull-down(下拉式菜单)、pop-up(弹出式菜单,或称快捷式菜单)。

下表列出创建菜单时用到的相关方法,如下所示:

方法 说明
add_cascade(**options) 添加一个父菜单,将一个指定的子菜单,通过 menu 参数与父菜单连接,从而创建一个下拉菜单。
add_checkbutton(**options) 添加一个多选按钮的菜单项
add_command(**options) 添加一个普通的命令菜单项
add_radiobutton(**options) 添加一个单选按钮的菜单项
add_separator(**options) 添加一条分割线
add(add(itemType, options)) 添加菜单项,此处 itemType 参数可以是以下几种:“command”、“cascade”,“checkbutton”、“radiobutton”、“separator” 五种,并使用 options 选项来设置

菜单其他属性
除了上述方法之外,Menu 控件也提供了一些其他方法来操作菜单项,比如删除菜单项、获取菜单项、设置指定的菜单项等,如下表所示:

方法 说明
delete(index1, index2=None) 删除 index1 ~ index2(包含)的所有菜单项,如果忽略 index2 参数,则删除 index1 指向的菜单项
entrycget(index, option) 获得指定菜单项的某选项的值
entryconfig(index, **options) 设置指定菜单项的选项
index(index) 返回与 index 参数相应的选项的序号
insert(index, itemType, **options) 插入指定类型的菜单项到 index 参数指定的位置,类型可以是
是:“command”,“cascade”,“checkbutton”,"radiobutton"或 “separator” 中的一个,或者也可以使用 insert_类型() 形式来,比如 insert_cascade(index, **options)…等
invoke(index) 调用 index 指定的菜单项相关联的方法
post(x, y) 在指定的位置显示弹出菜单
type(index) 获得 index 参数指定菜单项的类型
unpost() 移除弹出菜单
yposition(index) 返回 index 参数指定的菜单项的垂直偏移位置

下面对 Menu 控件的 options 参数做简单地介绍,如下所示:

属性 说明
accelerator 设置菜单项的快捷键,快捷键会显示在菜单项目的右边,比如 accelerator = “Ctrl+O” 表示打开;注意,此选项并不会自动将快捷键与菜单项连接在一起,必须通过按键绑定来实现
command 选择菜单项时执行的 callback 函数
label 定义菜单项内的文字
image 指定菜单项的图标
compound 指定菜单项中图标位于文字的那个部位
menu 此属性与 add_cascade() 方法一起使用,用来新增菜单项的子菜单项
selectcolor 指定当菜单项显示为单选按钮或多选按钮时选择中标志的颜色
state 定义菜单项的状态,可以是 normal、active 或 disabled
onvalue/offvalue 默认情况下,variable 选项设置为 1 表示选中状态,反之设置为 0,设置 offvalue/onvalue 的值可以自定义未选中状态的值
tearoff 如果此选项为 True,在菜单项的上面就会显示一个可选择的分隔线;注意:分隔线会将此菜单项分离出来成为一个新的窗口
underline 设置菜单项中哪一个字符要有下画线
value 设置按钮菜单项的值,在同一组中的所有按钮应该拥有各不相同的值,通过将该值与 variable 选项的值对比,即可判断用户选中了哪个按钮
variable 当菜单项是单选按钮或多选按钮时,与之关联的变量
4.1.1.1 创建目录菜单

主目录菜单也称之为“顶级菜单”,下拉菜单等其他子菜单的都需要建立在“顶级菜单”的基础之上,下面示例创建了一个类似于“记事本”界面的程序,代码如下:
本次使用一个方便实际使用的菜单程序做示例,可以通过更改菜单元组来更新显示菜单。方便程序的更新。

from thinter import *
from thinter import ttk
from collections import OrderedDict
#导入需要的库文件
#以下,页面初始化程序
class App:
    def __init__(self,master):
        self.master = master
        self.initWidgets()
    def initWidgets(self):
        #调用init_icons()初始化菜单、工具条用到的图标
        self.init_icons()
        #调用init_menu()初始化主菜单
        self.init_menu()
        #调用init_toolbar()初始化工具条
        self.init_toolbar()
        #调用init_workarea()初始化主工作区
        self.init_workarea()
    #生成所有需要的图标:
    def init_icons(self):
        self.master.filenew_icon = PhottoImage(file='images/filenew.png')
        self.master.fileopen_icon = PhottoImage(file='images/fileopen.png')
        self.master.filesave_icon = PhottoImage(file='images/filesave.png')
        self.master.filesaveas_icon = PhottoImage(file='images/filesaveas.png')
        self.master.filesignout_icon = PhottoImage(file='images/filesignout.png')
    #创建菜单
    def init_menu(self):
        #定义主菜单菜单标题
        menus = ('文件','编辑','帮助'#定义一级&二级菜单数据元组
        items = (/
        #'文件'菜单数据,数据结构为['子菜单文字',(菜单图标,事件处理函数)
        #'文件'菜单子菜单
        OrderedDict([/
        ('新建',(self.master.filenew_icon,None)),/
        ('打开',(self.master.fileopen_icon,None)),/
        ('保存',(self.master.filesave_icon,None)),/
        ('另存为...',(self.master.filesaveas_icon,None)),/
        ('-1',(None.None)),/
        ('退出',(self.master.filesignout_icon,None)),/
        ]),
        #'编辑'菜单子菜单
        OrderedDict([/
        ('撤销',(None.None)),/
        ('重做',(None.None)),/
        ('-1',(None.None)),/
        ('剪切',(None.None)),/
        ('复制',(None.None)),/
        ('粘贴',(None.None)),/
        ('删除',(None.None)),/
        ('选择',(None.None)),/
        ('-2',(None.None)),/
        #一级'更多'菜单子菜单
        ('更多',OrderedDict([/
            ('显示数据',(None.None)),/
            ('显示统计',(None.None)),/
            ('显示图表',(None.None)),/        
            ]))
        ]),
        #'帮助'菜单子菜单
        OrderedDict([/
        ('帮助主题',(None.None)),/
        ('-1',(None.None)),/
        ('关于',(None.None))])
        )
        #使用Menu创建主菜单栏,注意:添加对象为master
        menubar = Menu(self.master)
        self.master['menu'] = menubar
        #为主菜单栏添加一级菜单
        for i ,m_title in enumerate(menus):
            #创建菜单,注意:添加对象为menubar菜单栏
            m0 = Menu(menubar,tearoff=0)
            #为菜单栏菜单添加一级菜单
            menubar.add_cascade(label=m_title,menu=m0)
            #找到当前处理主菜单的下级菜单数据,并赋值给tm
            tm = item[i]
            #处理子菜单
            for label in tm:
                 print(lable)
                #如果value又是OrderedDict,说明是下级菜单
                 if isinstance(tm[label],OrderedDict):
                    #创建子菜单并添加,注意:添加对象为一级菜单m1
                     m12 = Menu(m0,tearoff=0)
                     m0.add_cascade(label=label,menu=m12)
                     sub_dict = tm[lable]
                    #再次遍历二级菜单的OrderedDict,默认只遍历他的Key
                     for sub_label in sub_dict:
                         if sub_dict.startwith('-'):
                            #添加分割条
                             m12.add_separator()
                         else:
                            #添加菜单项
                             m12.add_command(label=sub_label,image=sub_dict[sub_label][0],command=sub_dict[sub_label][1],compound=LEFT)
                    elif lable.startwith('-'):
                         m0.add_separator()
                     else:
                     m0.add_command(label=label,image=tm[label][0],command=tm[label][1],compound=LEFT)
    #生成工具条
    def init_toolbar(self):                     
        #创建并添加一个Frame作为工具条的容器
        toolframe = Frame(self.master,height=20,bg='lightgray')
        toolframe.pack(fill=X)
        #再次创建并添加一个Frame作为工具按钮的容器
        frame = ttk.Frame(toolframe)
        frame.pack(side=LEFT)
        #遍历self.master的全部数据,根据系统图标来创建工具条按钮
        
  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值