首页 > 编程语言 >python tk增加菜单项的便捷封装

python tk增加菜单项的便捷封装

时间:2023-07-11 22:45:36浏览次数:35  
标签:name python menus window tk File New 菜单项

TK增加菜单项的编码是比较复杂的, 为方便使用, 我做了一下封装, 用户使用场景:

root = tk.Tk()
AddMenuItem(root,'File.New.Close',lambda:print('111'))
AddMenuItem(root,'File.Hzq',lambda:print('abc'))
root.mainloop()

实现源码:

'''Tk扩展'''
import tkinter as tk

class _Vars:
    MenuDictName = 'MenuDict'   # 存放菜单相关的对象字典
    pass

def AddMenuItem(window:tk.Tk,name:str,action:callable=None):
    '''
    增加一个菜单项;
    name: 形如: 'File.New', 支持多级菜单, 名字用'.'分割
    action: void f(), 菜单项的回调函数
    '''
    menus = _GetMenuDict(window)
    if name in menus: return
    # 创建顶级菜单
    if '.' not in name: _CreateCascadeMenu(window,name); return
    # 把形如'File.New.Close'分解为'File.New','Close'
    cascadeMenuName,menuItemName = name.rsplit('.', 1)
    cascadeMenu = _GetCascadeMenu(window,cascadeMenuName)
    if action==None: cascadeMenu.add_command(label=menuItemName)
    else: cascadeMenu.add_command(label=menuItemName,command=action)

def _CreateCascadeMenu(window:tk.Tk,name:str)->tk.Menu:
    '''创建层级菜单'''
    menus = _GetMenuDict(window)
    # 顶级菜单项的处理
    if '.' not in name: 
        menubar = _GetMenubar(window)
        menu = tk.Menu(menubar, tearoff=0)
        menubar.add_cascade(label=name, menu=menu)
        menus[name] = menu
        return menu
    # 把形如'File.New.Close'分解为'File.New','Close'
    upMenuName, curMenuName = name.rsplit('.', 1)
    upMenu = _GetCascadeMenu(window,upMenuName)
    curMenu = tk.Menu(upMenu, tearoff=0)
    upMenu.add_cascade(label=curMenuName, menu=curMenu)
    menus[name] = curMenu
    return curMenu

def _GetCascadeMenu(window:tk.Tk,name:str)->tk.Menu:
    '''获得形如'File.New'的cascadeMenu对象'''
    menus = _GetMenuDict(window)
    if name not in menus: _CreateCascadeMenu(window,name)
    return menus[name]

def _GetMenubar(window:tk.Tk)->tk.Menu:
    '''获得菜单栏'''
    menus = _GetMenuDict(window)
    if '.' not in menus:
        menubar = tk.Menu(window)
        menus['.'] = menubar
        window.config(menu=menubar)
    return menus['.']

def _GetMenuDict(window:tk.Tk)->dict:
    '''获得存放菜单相关对象的字典'''
    if not hasattr(window,_Vars.MenuDictName): 
        setattr(window,_Vars.MenuDictName,{})
    menus = getattr(window,_Vars.MenuDictName)
    return menus

root = tk.Tk()
AddMenuItem(root,'File.New.Close',lambda:print('111'))
AddMenuItem(root,'File.Hzq',lambda:print('abc'))
root.mainloop()

标签:name,python,menus,window,tk,File,New,菜单项
From: https://www.cnblogs.com/huzhongqiang/p/17546142.html

相关文章

  • python - 类
    1.类classDog: """一次模拟小狗的简单尝试。""" def__init__(self,name,age):#当根据Dog类创建实例时,python会自动运行__init__()方法。 """初始化属性name和age""" self.name=name#属性。以self.为前缀的变量可供类中所有方......
  • Personal utils in Python
    #-*-coding:utf-8-*-importosimportsysimportshutilfromtimeimportperf_counterfromcollectionsimportdefaultdictfromdatetimeimporttimedeltafromtypingimportSequence,List,Dict,Hashable,Callablefromconfig.commonimportDEBUG#项目......
  • Python抓取音乐音乐
    #encoding=utf8importrequestsfrombs4importBeautifulSoupimporturllib.requestheaders={'Referer':'http://music.163.com/','Host':'music.163.com','User-Agent':'Mozilla/5.0(Wi......
  • 请不要再用被淘汰的Python库了,这几个新的更具优势!
    随着每个Python版本的发布,都会添加新模块,并引入新的更好的做事方式,虽然我们都习惯了使用好的旧Python库和某些做事方式,但现在也时候升级并利用新的和改进的模块及其特性了。Pathlib而不是OSpathlib绝对是Python标准库中最近添加的更大的内容之一,自Python3.4以来,它一......
  • django python manage.py migrate 后报错字段长度超了 django.db.utils.OperationalE
     现象:在models.py将CharField字段的maxlength=修改后,执行ythonmanage.pymigrate 报错django.db.utils.OperationalError:(1118 'Rowsizetoolarge.Themaximumrowsizefortheusedtabletype,notcountingBLOBs,is65535.Thisincludes storageoverhead,c......
  • python 之 mysql8 基础
    一、表操作1、查看当前所在的库>selectdatabase():+------------+|database()|+------------+|oldboy|+------------+2、usedatabase选择库3、查看表>showtables 查看有几个表>showcreatetablestudent; 查看创建表的过程+---------+-----------......
  • 使用Python读取图片
    一、Python学习两大道具1.dir()工具作用:支持打开package,看到里面的工具函数示例:(1)输出torch库包含的函数dir(torch)(2)输出torch.AVG函数中的参数dir(torch.AVG)2.help()工具作用:说明书,查看库中函数某个参数的说明或使用方法示例:(1)输出torch库中AVG......
  • 「Python」参数化查询防止SQL注入攻击
    importpymysql#1.链接mysqlconn=pymysql.connect(user='root',password="123",host='127.0.0.1',database='cars'#需要去数据库创建表,无法在此创建) #2.获取一个游标cursor=conn.cursor(cursor=pymysql.cursors.DictCursor)#返回的查询结果以字典的形式表示,其......
  • 基于python的租房网站-房屋出租租赁系统(python+django+vue)
    该项目是基于python/django/vue开发的房屋租赁系统/租房平台,作为本学期的课程作业作品。欢迎大家提出宝贵建议。功能介绍平台采用B/S结构,后端采用主流的Python+Django进行开发,前端采用主流的Vue.js进行开发。整个平台包括前台和后台两个部分。前台功能包括:首页、房屋详情页、......
  • 基于python+django的酒店预定网站-酒店管理系统
    该系统是基于python+django开发的酒店预定管理系统。适用场景:大学生、课程作业、毕业设计。学习过程中,如遇问题可在github给作者留言。演示地址前台地址:http://hotel.gitapp.cn后台地址:http://hotel.gitapp.cn/admin后台管理帐号:用户名:admin123密码:admin123源码地址h......