tkinter菜单图标,工具栏

简介:    所用的图片:   import tkinter as tk from tkinter import messagebox, filedialog, simpledialog, colorchooser from tkinter...

 

 所用的图片:

 

                   

import tkinter as tk
from tkinter import messagebox, filedialog, simpledialog, colorchooser
from tkinter import ttk
from PIL import Image, ImageTk

import time
import threading

def showdialog():
    '''各种窗口'''
    #res = messagebox.askokcancel(title='标题', message='提示信息。。。', default=messagebox.CANCEL) # default=messagebox.CANCEL,指定默认焦点位置,另 ABORT/RETRY/IGNORE/OK/CANCEL/YES/NO
    #res = messagebox.showinfo(title='标题', message='提示信息。。。')
    #res = messagebox.showwarning(title='标题', message='提示信息。。。')
    #res = messagebox.showerror(title='标题', message='提示信息。。。')
    #res = messagebox.askquestion(title='标题', message='提示信息。。。') 
    #res = messagebox.askyesno(title='标题', message='提示信息。。。')
    #res = messagebox.askyesnocancel(title='标题', message='提示信息。。。')
    #res = messagebox.askretrycancel(title='标题', message='提示信息。。。')
    
    #res = filedialog.askdirectory()
    #res = filedialog.askopenfile(filetypes=[('xml', '*.xml')])
    #res = filedialog.askopenfiles()
    #res = filedialog.askopenfilename()
    #res = filedialog.askopenfilenames()
    #res = filedialog.asksaveasfile()
    #res = filedialog.asksaveasfilename()
   
    #res = simpledialog.askinteger(title='整数', prompt='输入一个整数', initialvalue=100)
    #res = simpledialog.askfloat(titlee='实数', prompt='输入一个实数', minvalue=0, maxvalue=11)
    res = simpledialog.askstring(title='字符串', prompt='输入一个字符串')
    
    #res = colorchooser.askcolor()
    print(res)
   



class Application(tk.Tk):
    
    def __init__(self):
        super().__init__()
        self.geometry('677x442')                  # 窗口大小
        #self.resizable(width=False, height=False) # 禁止改变窗口大小
        
        self.createUI()

    # 生成界面
    def createUI(self):
        self.createICO()
        self.createMenu()
        self.createToolbar()
        self.bindAll()
    
    # 创建菜单
    def createMenu(self):
        '''只支持两层嵌套'''
        menus = ['文件', '编辑', '帮助']
        items = [['新建', '打开', '保存', '另存为...', '关闭', '-', '退出'],
                 ['撤销', '-',  '剪切', '复制', '粘贴', '删除', '选择所有',['更多...','数据', '图表', '统计']],
                 ['索引', '关于']]
        callbacks = [[showdialog, showdialog, showdialog, showdialog, showdialog, None, showdialog],
                     [showdialog, None, showdialog, showdialog, showdialog, showdialog, showdialog, [showdialog, showdialog, showdialog]],
                     [showdialog, showdialog]]
        icos = [[self.img1, self.img2, self.img3, None, self.img4, None, None],
                [self.img1, None, self.img2, self.img3, None, self.img4, None, [self.img3, None, self.img4]],
                [self.img1, self.img2]]
        
        menubar = tk.Menu(self)
        for i,x in enumerate(menus):
            m = tk.Menu(menubar, tearoff=0)
            for item, callback, ico in zip(items[i], callbacks[i], icos[i]):
                if isinstance(item, list):
                    sm = tk.Menu(menubar, tearoff=0)
                    for subitem, subcallback, subico in zip(item[1:], callback, ico):
                        if subitem == '-':
                            sm.add_separator()
                        else:
                            sm.add_command(label=subitem, command=subcallback, image=subico, compound='left')
                    m.add_cascade(label=item[0], menu=sm)
                elif item == '-':
                    m.add_separator()
                else:
                    m.add_command(label=item, command=callback, image=ico, compound='left')
            menubar.add_cascade(label=x, menu=m)
        self.config(menu=menubar)
        
    # 生成所有需要的图标
    def createICO(self):
        self.img1 = ImageTk.PhotoImage(Image.open('ico_new_16_16.jpg'))
        self.img2 = ImageTk.PhotoImage(Image.open('ico_open_16_16.jpg'))
        self.img3 = ImageTk.PhotoImage(Image.open('ico_save_16_16.jpg'))
        self.img4 = ImageTk.PhotoImage(Image.open('ico_close_16_16.jpg'))
        #self.img5 = ImageTk.PhotoImage(Image.open('ico_new.jpg'))
        #self.img6 = ImageTk.PhotoImage(Image.open('ico_open.jpg'))
        
    # 生成工具条
    def createToolbar(self):
        toolframe = tk.Frame(self, height=20, bg='#F7EED6')#, relief=tk.RAISED)
        frame = tk.Frame(toolframe, bg='#F7EED6')
        ttk.Button(frame, width=20, image=self.img1, command=showdialog).grid(row=0, column=0, padx=1, pady=1, sticky=tk.E)
        ttk.Button(frame, width=20, image=self.img2, command=showdialog).grid(row=0, column=1, padx=1, pady=1, sticky=tk.E)
        ttk.Button(frame, width=20, image=self.img3, command=showdialog).grid(row=0, column=2, padx=1, pady=1, sticky=tk.E)
        frame.pack(side=tk.LEFT)
        toolframe.pack(fill=tk.X)
        
    #def createLayout(self):
        leftframe = tk.Frame(self, width=120, bg='#0000FF')
        ttk.Treeview()
        leftframe.pack(side=tk.LEFT, fill=tk.Y)
        mainframe = tk.Frame(self, bg='#00FFFF')
        tk.Text(mainframe).pack(side=tk.LEFT, fill=tk.X)
        ttk.Scrollbar(mainframe).pack(side=tk.LEFT,fill=tk.Y)
        mainframe.pack(side=tk.LEFT, fill=tk.BOTH)
        
    # 绑定快捷键
    def bindAll(self):
        self.bind_all('<Control-n>', lambda event:showdialog()) # 此处必须 lambda

    # 打包入线程(耗时的操作)
    @staticmethod
    def thread_it(func, *args):
        t = threading.Thread(target=func, args=args) 
        t.setDaemon(True)
        t.start()

        
        
app = Application()
app.mainloop()

 

目录
相关文章
|
1天前
|
云安全 人工智能 自然语言处理
|
6天前
|
搜索推荐 编译器 Linux
一个可用于企业开发及通用跨平台的Makefile文件
一款适用于企业级开发的通用跨平台Makefile,支持C/C++混合编译、多目标输出(可执行文件、静态/动态库)、Release/Debug版本管理。配置简洁,仅需修改带`MF_CONFIGURE_`前缀的变量,支持脚本化配置与子Makefile管理,具备完善日志、错误提示和跨平台兼容性,附详细文档与示例,便于学习与集成。
314 116
|
8天前
|
数据采集 人工智能 自然语言处理
Meta SAM3开源:让图像分割,听懂你的话
Meta发布并开源SAM 3,首个支持文本或视觉提示的统一图像视频分割模型,可精准分割“红色条纹伞”等开放词汇概念,覆盖400万独特概念,性能达人类水平75%–80%,推动视觉分割新突破。
602 53
Meta SAM3开源:让图像分割,听懂你的话
|
21天前
|
域名解析 人工智能
【实操攻略】手把手教学,免费领取.CN域名
即日起至2025年12月31日,购买万小智AI建站或云·企业官网,每单可免费领1个.CN域名首年!跟我了解领取攻略吧~
|
5天前
|
人工智能 Java API
Java 正式进入 Agentic AI 时代:Spring AI Alibaba 1.1 发布背后的技术演进
Spring AI Alibaba 1.1 正式发布,提供极简方式构建企业级AI智能体。基于ReactAgent核心,支持多智能体协作、上下文工程与生产级管控,助力开发者快速打造可靠、可扩展的智能应用。
|
4天前
|
弹性计算 人工智能 Cloud Native
阿里云无门槛和有门槛优惠券解析:学生券,满减券,补贴券等优惠券领取与使用介绍
为了回馈用户与助力更多用户节省上云成本,阿里云会经常推出各种优惠券相关的活动,包括无门槛优惠券和有门槛优惠券。本文将详细介绍阿里云无门槛优惠券的领取与使用方式,同时也会概述几种常见的有门槛优惠券,帮助用户更好地利用这些优惠,降低云服务的成本。
269 132
|
8天前
|
机器学习/深度学习 人工智能 自然语言处理
AgentEvolver:让智能体系统学会「自我进化」
AgentEvolver 是一个自进化智能体系统,通过自我任务生成、经验导航与反思归因三大机制,推动AI从“被动执行”迈向“主动学习”。它显著提升强化学习效率,在更少参数下实现更强性能,助力智能体持续自我迭代。开源地址:https://github.com/modelscope/AgentEvolver
415 29
|
15天前
|
安全 Java Android开发
深度解析 Android 崩溃捕获原理及从崩溃到归因的闭环实践
崩溃堆栈全是 a.b.c?Native 错误查不到行号?本文详解 Android 崩溃采集全链路原理,教你如何把“天书”变“说明书”。RUM SDK 已支持一键接入。
726 223