Python tkinter Notebook标签添加关闭按钮元素,及左侧添加存储状态提示图标案例,类似Notepad++页面

news2024/10/7 10:13:29

效果图展示

图片展示
粉色框是当前页面,橙色框是鼠标经过,红色框是按下按钮,灰色按钮是其他页面的效果;
存储标识可以用来识别页面是否存储:例如当前页面已经保存用蓝色,未保存用红色,其他页面已经保存用灰色,未保存用淡红色。

首先导入模块

import tkinter as tk
from tkinter import ttk

定义一个名为CustomNotebook的类,继承自ttk.Notebook

class CustomNotebook(ttk.Notebook):
    """定义一个名为CustomNotebook的类,继承自ttk.Notebook"""

    __initialized = False  # 初始化一个私有变量,用于标记是否已经初始化

    def __init__(self, *args, **kwargs):
        # 如果尚未初始化,则调用自定义初始化方法,并设置已初始化标志
        if not self.__initialized:
            self.__initialize_custom_style()
            #CustomNotebook.__initialized = True
            self.__inititialized = True

        # 设置notebook的样式为"CustomNotebook"
        kwargs["style"] = "CustomNotebook"
        # 调用父类的初始化方法
        ttk.Notebook.__init__(self, *args, **kwargs)

        self._active = None # 初始化一个私有变量,用于存储当前活动的tab

        # 绑定鼠标左键按下事件到on_close_press方法
        self.bind("<ButtonPress-1>", self.on_close_press, True)
        # 绑定鼠标左键释放事件到on_close_release方法
        self.bind("<ButtonRelease-1>", self.on_close_release)

    def on_close_press(self, event):
        """当按钮被按下时触发,位于关闭按钮上方"""

        # 获取鼠标点击位置的元素
        element = self.identify(event.x, event.y)

        # 如果元素包含"close",则执行以下操作
        if "close" in element:
            # 获取鼠标点击位置的索引值
            index = self.index("@%d,%d" % (event.x, event.y))
            # 将按钮状态设置为按下
            self.state(['pressed'])
            # 将_active属性设置为点击的索引值
            self._active = index

    def on_close_release(self, event):
        """ 
        当鼠标在关闭按钮上释放时调用此方法。
        event:  包含鼠标事件信息的对象。
        """
        if not self.instate(['pressed']): # 如果按钮没有按下状态,直接返回
            return
        try:
            element =  self.identify(event.x, event.y) # 获取鼠标释放位置的元素
            index = self.index("@%d,%d" % (event.x, event.y)) # 获取元素在列表中的索引
            if "close" in element and self._active == index: # 如果元素是关闭按钮,并且当前激活的标签页与释放位置的标签页相同
                self.forget(index)  # 删除该标签页
                self.event_generate("<<NotebookTabClosed>>") # 生成一个表示标签页关闭的事件
        except: pass
        self.state(["!pressed"]) # 将按钮状态设置为非按下状态
        self._active = None # 将当前激活的标签页设置为None

    def __initialize_custom_style(self):
        # 创建一个ttk样式对象
        style = ttk.Style()
        # 定义四个图片对象,分别表示关闭按钮的不同状态
        self.images = (
            # 元素普通状态时图标
            tk.PhotoImage("img_closenormal", data='''
                R0lGODdhCwALAIMAAJKSkpeXl5ubm5+fn6CgoKampqqqqq2trbGxsba2tr29vcHBwdnZ2QAAAAAAAAAA
                ACwAAAAACwALAAAIXQAXJEBwwEDBAgUGHEigYOCBhwYMEBCAIAEDBgYQXhwg4ACCiwwKgOQIEeRGjgUK
                GgBJYABKgyYZuBRAQORFmwwEBBhgE6FNAQAEDCBAtCVHoAcC6AzANAAAAAYCAgA7
                '''),
            # 选中的选项卡的关闭图标
            tk.PhotoImage("img_closeselected", data='''
                R0lGODdhCwALAIVUAJ9dcptfe6NfcpthfZ5hfJ9ifp5nfaNjda9lc6Rmea1nfqRpe6Fqfq9ofK1ofqxr
                frFndbJqeLJufZ9rgKpngaBqgKtpg6tphK5uhKxvia5xhq91iq1xjK1zj692jLFyg7N1hrJ3i7B2jbF4
                ja51ka94kq97l698mq9+m7B8mbB/nLCDn6aEoayMprCForGMq7KNq7KPrrOXt7WfwP///wAAAAAAAAAA
                AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACwAAAAACwALAAAIcgBnwFiBwoQJEh0yUGARQ8YLFwRPHLwQ
                wEUMGjQOcsB4YYAKFxhpbMRooYCJFSlCYlTgoAAJFSlMhHTgQEGBDilSqoyggACGEiFFhGxwAINQGiNC
                gMAIQcADDR48bAjxQUIEBABaGJgwoQKDBQkOCGAREAA7
                '''),
            # 鼠标经过时选项卡的关闭图标
            tk.PhotoImage("img_closeactive", data='''
                R0lGODdhCwALAIVSAN5IN+lRNeBQP+5bPvtSP+FSQuJXR+VbRu5dQetfRuVbSf9dS/xeTO5iR+hhTOxl
                TP1wTP1iUP1kUv9lVPxnVv9rVP1pWP9rWv9vXv5/WP54Xf9yYv11YP90ZP99YP94af97bP99bv6BW/6C
                Yv6FYP+BZf6JZv+Eb/6Jav+Oa+eJe/+Bcf+Edf+Hef+KfP+Rd/+WfP+bev+Pgu+Rhv+RhP+ViP+Zjf+h
                lv+lmv+1rP+/twAAAAAAAAAAAAAAACwAAAAACwALAAAIcwB13KDhgkWIEB8wRJiBIwcOGzRktFjx
                wUKBGjh27GABYoNGCQZc2NC4owNJkCsIktRYoYKCDywmkizhQYODDSFWrNyRYsSDCSY1wiBJosGCCxpP
                vIihMcMAAgwoXOBQAoUJERACzAAAoICAAwkaIAigIiAAOw==
                '''),
            # 按下关闭按钮时选项卡的关闭图标
            tk.PhotoImage("img_closepressed", data='''
                R0lGODdhCwALAIUAAGsiD20jEHIkEHYlEXsnEX4oEogrE4orFIwsFJEtFJUvFZoxFpwwFp4yF6EzF6Yz
                F642GbU3GbY4Grk5Grk6G7s7G7w6G7w8G8A+HcJAHcVDH8ZEH8dEIMhGIMtJIsxKIs1KIpdxZ8eAbtqI
                cuKdiQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
                AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACwAAAAACwALAAAIcABDABBA4AACBQscNBARIAGDBxAkVKhw
                oeIABiRIRJhQIeMFDAUeZCTRMWOGCwYgRBhpMgMGBBEqWBipYcOGDAoolBz5wcOGBRdGchjps0FQEhk6
                eMgIgoODihgycOgAAoQHDiIsYMBwoeYGDhtGBAQAOw==
                '''),
            )

        # 使用element_create方法创建一个名为"close"的元素,类型为"image",图像文件名为"img_closenormal"
        style.element_create("close", "image", "img_closenormal",
                            # 下面设置各状态图标,激活顺序越往后的越要写在前面,比如按下要先鼠标经过激活,按下就要写在鼠标经过前
                            # 当元素处于激活、按下、未禁用状态时,显示"img_closepressed"图片
                            ("active", "pressed", "!disabled", "img_closepressed"),
                            # 当元素处于激活且未禁用状态时,显示"img_closeactive"图片
                            ("active", "!disabled", "img_closeactive"), 
                            # 当选项卡处于选中状态时,显示"img_closeselected"图片
                            ("selected", "img_closeselected"), 
                            # 设置元素的边框宽度为10像素,无边框;设置元素的粘性属性为空字符串,表示不粘附在其他元素上。
                            border=10, sticky='')
        '''
        notebook有如下状态可以设置
            disabled    禁用状态,该状态下的控件无法接收用户输入。
            normal      正常状态,该状态下的控件可以接收用户输入。
            active      激活状态(鼠标经过),该状态下的控件可以接收用户输入,并且会显示特殊效果(如闪烁)。
            selected    选中状态,该状态下的控件会显示特殊效果(如高亮)。
            insensitive 不敏感状态,该状态下的控件不会响应用户的键盘操作。
            focus       聚焦状态,该状态下的控件会显示特殊效果(如边框)。
        '''
        # 设置Notebook的样式为"CustomNotebook",并为"CustomNotebook.client"添加一个样式选项,设置其"sticky"属性为"nswe"
        style.layout("CustomNotebook", [("CustomNotebook.client", {"sticky": "nswe"})])
        # 设置CustomNotebook.Tab的布局样式
        style.layout("CustomNotebook.Tab", [
            ("CustomNotebook.tab", { # 设置 CustomNotebook.tab 的样式
                "sticky": "nswe", # 设置 tab 的粘性属性为 NSWE,表示在水平方向上可拉伸,垂直方向上可滚动
                "children": [     # 设置 tab 的子元素
                    ("CustomNotebook.padding", { # 设置 CustomNotebook.padding 的样式
                        "side": "top",      # 设置 padding 的侧边距在顶部
                        "sticky": "nswe",   # 设置 padding 的粘性属性为 NSWE
                        "children": [       # 设置 padding 的子元素
                            ("CustomNotebook.focus", { # 设置 CustomNotebook.focus 的样式
                                "side": "top",    # 设置 focus 的侧边距在顶部
                                "sticky": "nswe", # 设置 focus 的粘性属性为 NSWE
                                "children": [     # 设置 focus 的子元素
                                    # 设置 CustomNotebook.label 的样式
                                    ("CustomNotebook.label", {"side": "left", "sticky": ''}), # 设置 label 的侧边距在左侧,无粘性
                                    # 设置 CustomNotebook.close 的样式
                                    ("CustomNotebook.close", {"side": "left", "sticky": ''}), # 设置 close 的侧边距在左侧,无粘性
                                ]
                            })
                        ]
                    })
                ]
            })
        ])

将定义好的Notebook应用到tk窗口,并添加存储标识,不需要的删除即可

if __name__ == "__main__":
    root = tk.Tk()
    notebook = CustomNotebook(width=400, height=400, padding=(2,5,2,2))
    notebook.pack(side="top", fill="both", expand=True)

    images = (
        # 原色
        tk.PhotoImage('save_original', data = '''
            R0lGODdhDgAOAIU9ADFjpTFjrTFjtTFrtTljrTlrrcDAwEJzvUpzvUp7vVJ7rVJ7vVqEvWOEvWOMzmuU
            zmuU1nOUxnOc1nOc3nuUxnucxnul53ut54Slzoylxoyl1oyt1ozGY5StxpS13py13qWtxqW9563G57XO
            773O78bW78bW987e9zlrvQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
            AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACwAAAAADgAOAAAIjAAzUFhwIIXBgykYgDAQ4cQJFBAjQiTh
            oEOCExdQOJA4kcSBAycsaOSIwkKJASlCkoQ4IYSAFCYsOHDwoOZMBxI+vIxpoWfPCRKC6kxRwqdPoEE9
            BEhBwqiFoFA3LG26EgUEDUtHiOTAtSuHBxiybvXK1UEFAAhEiKhagUIBCg0ODBBAN4DdAAAIKAgIADs=
            '''),
        # 黑白
        tk.PhotoImage('save_gray', data = '''
            R0lGODdhDgAOAIU9AFxcXF1dXV9fX2JiYmRkZGVlZW1tbW9vb3R0dHZ2dn5+foGBgYeHh46Ojo+Pj5CQ
            kJKSkpaWlpeXl6CgoKGhoaOjo6WlpaioqKmpqa2trbCwsLKysru7u8DAwMLCwsrKys3NzdTU1NXV1dzc
            3P///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
            AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACwAAAAADgAOAAAIiwApQEhgoIDBgwUUZOjwYMQIEhAjQgTB
            4AKCERZIMJA4EYQBAyMmaORIYkKIAQVCkoQogUOAAiImMGDQoOZMBhE2vIw5oWdPCRGC6iwQwqdPoEE1
            ACgAwuiEoFAvLG26koSDCks/iMTAtSuGBhOybvXKlYEEAAc8eKgqAQIBCAsMDAhAF4BduwIQBAQAOw==
            '''),
        # 红色
        tk.PhotoImage('save_red', data = '''
            R0lGODdhDgAOAIU9AP/h4f++vv+3t/+2tv+vr/+srP+kpP+iov+dnf+UlP+Skv+Pj/+Li/+Kiv+Hh/+F
            hf+Dg/+Cgv95ef94eP90dP9ycv9xcf9wcP9paf9jY/9gYP9YWP9WVv9RUf9PT/tHR/pGRvhERPVBQfM/
            P/I+PgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
            AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACwAAAAADgAOAAAIiwAhUNjg4YPBgx80LDhQIUAAABAjQiSA
            oQGHAA4AYJA4kYAHDwEiaOQIIMKAEB9CkoQoAcGIDwIiYMBwoeZMDBMSvIwZoWdPCROC6vwwwKdPoEEV
            kPhAwGiEoFAbLG26EoCFB0sLiGTAtSuDCxGybvXKFYMEEh0MGKgqgQIIChk8hBhBl4RduyI4BAQAOw==
            '''),
        # 淡红色
        tk.PhotoImage('save_lowred', data = '''
            R0lGODdhDgAOAIU9AP/w8P/p6f/o6P/h4f/e3v/W1v/U1P/Pz//Gxv/ExP/Bwf+9vf+8vP+5uf+3
            t/+1tf+0tP+rq/+qqv+mpv+kpP+jo/+iov+bm/+Vlf+Skv+Kiv+IiP+Dg/+Bgft5efp4ePh2dvVzc/Nx
            cfJwcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
            AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACwAAAAADgAOAAAIiwAhUNjg4YPBgx80LDhQIUAAABAjQiSA
            oQGHAA4AYJA4kYAHDwEiaOQIIMKAEB9CkoQoAcGIDwIiYMBwoeZMDBMSvIwZoWdPCROC6vwwwKdPoEEV
            kPhAwGiEoFAbLG26EoCFB0sLiGTAtSuDCxGybvXKFYMEEh0MGKgqgQIIChk8hBhBl4RduyI4BAQAOw==
            '''),
        )

    colour = {"blue":None, "red":None, "violet":None, "orange":None, "green":None}
    for color in colour.keys():
        colour[color] = tk.Frame(notebook, background=color) # 新建Frame作为标签内容
        notebook.add(colour[color], text=color) # 将新建的Frame添加到notebook生成一个标签

    colour['white'] = tk.Frame(notebook) 
    notebook.add(colour['white'], text='white', image='save_gray' , compound='left') # 新建一个直接带image元素的标签,图标元素位于左侧
    notebook.insert(3, colour['white'])  #将'white'标签移动到3的位置
    notebook.select(colour['white'])

    # 修改标签的image元素
    notebook.tab(colour['blue']  , image='save_original', compound='left')
    notebook.tab(colour['red' ]  , image='save_red'     , compound='left')
    notebook.tab(colour['violet'], image='save_lowred'  , compound='left')

    root.mainloop()

上面代码中的base64编码的字符串,可以用下面代码获取,要用gif格式文件转换,传入文件路径即可。

from PIL import Image
import base64, io
def bmp_to_base64(img_path):
    "将gif图片转为base64编码的字符串"
    # 打开图片
    img = Image.open(img_path)
    # 将图片数据转为字节流
    byte_arr = io.BytesIO()
    img.save(byte_arr, format='GIF')
    img_bytes = byte_arr.getvalue()
    # 将字节流转为base64编码的字符串
    base64_str = base64.b64encode(img_bytes).decode()
    return base64_str
print (bmp_to_base64('gif文件路径'))

#想要拖动标签切换位置的可以绑定鼠标事件,自己试试吧。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/886728.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

数据分析 | 调用Optuna库实现基于TPE的贝叶斯优化 | 以随机森林回归为例

1. Optuna库的优势 对比bayes_opt和hyperoptOptuna不仅可以衔接到PyTorch等深度学习框架上&#xff0c;还可以与sklearn-optimize结合使用&#xff0c;这也是我最喜欢的地方&#xff0c;Optuna因此特性可以被使用于各种各样的优化场景。 2. 导入必要的库及加载数据 用的是sklea…

idea插件开发-自定义语言01Language和LanguageType

Intellij platform本质是对不同的开发语言提供支持&#xff0c;举例来说我们也可以用notebook.app来开发java代码&#xff0c;但效率上可能没有可比性。因为Intellij idea提供了很多语言特定功能&#xff08;例如语法高亮显示和代码分析&#xff09;。很多插件本质上都是效率插…

AI项目二:基于mediapipe的虚拟鼠标控制

若该文为原创文章&#xff0c;转载请注明原文出处。 一、项目介绍 由于博主太懒&#xff0c;mediapipe如何实现鼠标控制的原理直接忽略&#xff0c;最初的想法是想控制摄像头识别手指控制鼠标&#xff0c;达到播放电影的效果。基本上效果也是可以的。简单的说是使用mediapipe检…

【软件测试】随笔系统测试报告

博主简介&#xff1a;想进大厂的打工人博主主页&#xff1a;xyk:所属专栏: 软件测试 随笔系统采用 SSM 框架前后端分离的方法实现&#xff0c;本文主要针对功能&#xff1a;登录&#xff0c;注册&#xff0c;注销&#xff0c;写随笔&#xff0c;删除随笔&#xff0c;随笔详情页…

SQLite数据库实现数据增删改查

当前文章介绍的设计的主要功能是利用 SQLite 数据库实现宠物投喂器上传数据的存储&#xff0c;并且支持数据的增删改查操作。其中&#xff0c;宠物投喂器上传的数据包括投喂间隔时间、水温、剩余重量等参数。 实现功能&#xff1a; 创建 SQLite 数据库表&#xff0c;用于存储宠…

【KD】2023 ICML Linkless Link Prediction via Relational Distillation

1、简介 图神经网络(GNN)有很强的链接预测能力,但是其计算依赖于对邻居节点知识的聚合,因此导致其在实际应用中往往有较高的延迟。与GNN不同,多层感知机(MLP)在预测时不依赖于邻居节点信息,因此其推理速度更快,但也在一定程度上影响了其预测准确性。为了同时利用这两…

Linux下如何修改CPU 电源工作模式

最近处理一起历史遗留问题&#xff0c;感觉很爽。 现象&#xff1a; 背景&#xff1a;设备采用ARM&#xff0c;即rk3568处理器&#xff0c;采用Linux系统&#xff1b;主要用于视觉后端处理 现象&#xff1a;当软件运行一段时间&#xff0c;大概1个小时&#xff08;也不是很固定…

安卓开发问题记录:app:checkDebugDuplicateClasses

开发过程中报错&#xff1a; Duplicate class android.support.v4.app.INotificationSideChannel found in modules core-1.7.0-runtime (androidx.core:core:1.7.0) and support-v4-21.0.3-runtime (com.android.support:support-v4:21.0.3)按网上找到的说法&#xff1a;新引…

Java学习路线大全推荐来啦!

Java作为目前最热门使用最广泛的编程语言之一&#xff0c;许多人都想学习它。但Java学习书籍那么多&#xff0c;如何选择适合自己的呢?在这里&#xff0c;小编将为大家推荐两本Java学习书籍。 1.动力节点Java 《Java从零基础到精通》是一本Java实用教材&#xff0c;由动力节点…

Maven(四)常用命令大全

目录 一、mvn 命令参数二、mvn 插件命令1.介绍2.查看插件的使用文档3.常用的插件命令 官网地址&#xff1a; https://maven.apache.org/官方插件清单&#xff1a; https://maven.apache.org/plugins/index.html Maven 是一个强大的构建工具&#xff0c;它提供了许多命令来进行项…

EasyV用户必须了解的实操方法论|模板复用五步法

本文根据元宝 在模板复用训练课程上的分享整理而成。 从我们模板复用课程上线到现在&#xff0c;每一期我们都在反复强调&#xff1a;**如何让「所有的」EasyV用户都能搭建制作出「可以落地交付」的可视化大屏是我们课程制作的初衷&#xff0c;跳出「大屏搭建 大屏设计」的思维…

【机器视觉系统】NoobVision

NoobVision 基于Qt/C实现的视觉框架平台&#xff0c;已有多款项目成功实施 功能不算非常完善&#xff0c;但架构设计成熟 Q 2903612753

Spring事务的隔离级别介绍说明以及怎么去修改Spring事务的隔离级别

&#x1f600;前言 本篇是Spring 声明式事务系列的最后一篇介绍了Spring事务的隔离级别介绍说明 &#x1f3e0;个人主页&#xff1a;尘觉主页 &#x1f9d1;个人简介&#xff1a;大家好&#xff0c;我是尘觉&#xff0c;希望我的文章可以帮助到大家&#xff0c;您的满意是我的…

SystemVerilog中$timeformat的用法

在SystemVerilog中&#xff0c;输出信息显示时间时&#xff0c;经常会在输出信息格式中指定“%t”格式符&#xff0c;一般情况下“%t”输出的格式都是固定的&#xff0c;但是这样固定的输出显示的时间可能有时会让用户看起来感觉比较诧异&#xff0c;例如下面的示例。 【示例】…

【word密码】设置word只读模式

想要将word文档设置为只读模式&#xff0c;方法有很多&#xff0c;今天小奥超人介绍几个方法给大家。 方法一&#xff1a;文件属性 常见的、简单的设置方法&#xff0c;不用打开word文件&#xff0c;只需要右键选择文件&#xff0c;打开文件属性&#xff0c;勾选上【只读】选…

ROSE75 GAS DM蓝牙5.2双模热插拔PCB

键盘使用说明索引&#xff08;均为出厂默认值&#xff09; 软件支持&#xff08;驱动的详细使用帮助&#xff09;一些常见问题解答&#xff08;FAQ&#xff09;首次使用步骤蓝牙配对规则&#xff08;重要&#xff09;蓝牙和USB切换键盘默认层默认触发层0的FN键配置的功能默认功…

助力金融服务行业转型,NETCLOUD的全方位解决方案!

随着科技的飞速发展和数字化时代的到来&#xff0c;金融行业也面临着前所未有的变革和挑战。在这个信息爆炸的时代&#xff0c;数字化转型已经成为金融行业不可忽视的趋势。从传统的银行、保险到投资管理&#xff0c;无一不受到数字化浪潮的影响。那么&#xff0c;为什么金融行…

Android CameraX适配Android13的踩坑之路

AndroidCameraX适配Android13的踩坑之路 前言&#xff1a; 最近把AGP插件升级到8.1.0&#xff0c;新建项目的时候目标版本和编译版本都是33&#xff0c;发现之前的demo使用Camerax拍照和录像都失败了&#xff0c;于是查看了一下官网和各种资料&#xff0c;找到了Android13的适…

中远麒麟堡垒机 SQL注入漏洞复现

0x01 产品简介 中远麒麟依托自身强大的研发能力,丰富的行业经验&#xff0c;自主研发了新一代软硬件一体化统一安全运维平台一-iAudit 统一安全运维平台。该产品支持对企业运维人员在运维过程中进行统一身份认证、统一授权、统一审计、统一监控&#xff0c;消除了传统运维过程中…

十七、地物识别

描述了使用2D卷积神经网络图像识别的全过程。下载和安装标注工具,对图像进行标注,生成标注后的图像。然后对数据进行增强,划分训练集和测试集。最后通过神经网络建立分类模型,对现有图片进行分类应用。 1、Labelme工具 Labelme工具是语义分割标注工具,在地物类型或建…