tkinter绘制组件(42)——工具栏按钮组件

news2024/11/14 19:15:40

tkinter绘制组件(42)——工具栏按钮组件

  • 引言
  • 布局
    • 函数结构
    • 背景板
    • 创建按钮
    • 移动背景板
    • 完整代码函数
  • 效果
    • 测试代码
    • 最终效果
  • github项目
  • pip下载
  • 结语

引言

在TinUI中,并不存在工具栏这个概念,但是可以通过使用BasicTinUI控件,在程序界面中创造丰富的工具栏,不过这终究需要开发者自己来设计。当我们只想要一个简单的、带有按钮、分割线的工具栏时,这就没必要重新设计一个了。

我们来创造一个新的控件,工具栏按钮组件barbutton,来创建一组工具栏按钮。


布局

函数结构

def add_barbutton(self,pos:tuple,font='微软雅黑 14',fg='#636363',bg='#f3f3f3',line='#f3f3f3',linew=0,activefg='#191919',activebg='#eaeaea',activeline='#eaeaea',sepcolor='#e5e5e5',content=(('保存','\uE74E',None),('','\uE792',None),'',('','\uE74D',None)),anchor='nw'):#绘制一个工具栏按钮组件
"""
...
sepcolor::分割线颜色
content::按钮组内容
"""

背景板

因为在开始创建的时候,我们需要一个画布对象来创建uid,设计上,TinUI一般以大范围元素作为id来源。因此,我们需要创建边框和背景元素,但不需要急着给它们安排位置,只要创建出来就行了。

        font=tkfont.Font(font=font)
        font_size=float(font.cget('size'))/72*96
        pixel=round(font_size/2)*2
        del font_size
        outline=self.create_polygon(*pos,*pos,width=9,fill=line,outline=line)
        uid='barbutton'+str(outline)
        self.itemconfig(outline,tags=uid)
        buttons_id=uid+'button'
        back=self.create_polygon(*pos,*pos,width=7,fill=bg,outline=bg,tags=uid)

值得注意的是,这里我们重新创建了font对象,是为了获取字体大小,计算分割线的高度。

此外,我们使用buttons_id=uid+'button'的方式表示按钮和分割线,其中,按钮应当是add_button2()返回值的最后一个属性,代表圆角按钮的所有元素。

创建按钮

这是重头戏,但是非常简单,我们首先来约定一下content的内容。

(
    ('text','\ue70e',None),
    ('button text','Segoe Fluent Icons code',command),
    '',#分割线
    ...,
    (...)
)

就这么简单。

符号的添加得益于button2同期对于{Segoe Fluent Icons}的单独支持。

接下来,我们就可以创建按钮了,注意content里的'',这是分割线的意思。

        buttons=list()
        for i in content:
            if i=='':
                position=new_pos()
                sp_pos=(position[0],position[1]-pixel/2,position[0],position[1]+pixel/2)
                self.create_line(sp_pos,width=1,fill=sepcolor,tags=(uid,buttons_id))
                continue
            position=new_pos()
            button=self.add_button2(position,text=i[0],icon=i[1],font=font,fg=fg,bg=bg,line=line,linew=linew,activefg=activefg,activebg=activebg,activeline=activeline,anchor='w',command=i[2])
            self.addtag_withtag(buttons_id,button[-1])
            self.addtag_withtag(uid,button[-1])
            buttons.append(button)

移动背景板

当按钮全部创建完毕后,我们就可以根据button_id确定背景板的大小和位置了。

        bbox=self.bbox(buttons_id)
        bbox=(bbox[0],bbox[1],bbox[2],bbox[1],bbox[2],bbox[3],bbox[0],bbox[3])
        self.coords(back,bbox)
        self.coords(outline,bbox)
        self.__auto_anchor

完整代码函数

    def add_barbutton(self,pos:tuple,font='微软雅黑 14',fg='#636363',bg='#f3f3f3',line='#f3f3f3',linew=0,activefg='#191919',activebg='#eaeaea',activeline='#eaeaea',sepcolor='#e5e5e5',content=(('保存','\uE74E',None),('','\uE792',None),'',('','\uE74D',None)),anchor='nw'):#绘制一个工具栏按钮组件
        def new_pos():
            #获取最新位置
            bbox=self.bbox(buttons_id)
            if bbox:
                return bbox[2]+5,(bbox[1]+bbox[3])/2
            else:
                return pos
        #获取字体大小,转化为像素大小
        font=tkfont.Font(font=font)
        font_size=float(font.cget('size'))/72*96
        pixel=round(font_size/2)*2
        del font_size
        outline=self.create_polygon(*pos,*pos,width=9,fill=line,outline=line)
        uid='barbutton'+str(outline)
        self.itemconfig(outline,tags=uid)
        buttons_id=uid+'button'
        back=self.create_polygon(*pos,*pos,width=7,fill=bg,outline=bg,tags=uid)
        #左侧纵轴线对齐,anchor=w
        buttons=list()
        for i in content:
            if i=='':
                position=new_pos()
                sp_pos=(position[0],position[1]-pixel/2,position[0],position[1]+pixel/2)
                self.create_line(sp_pos,width=1,fill=sepcolor,tags=(uid,buttons_id))
                continue
            position=new_pos()
            button=self.add_button2(position,text=i[0],icon=i[1],font=font,fg=fg,bg=bg,line=line,linew=linew,activefg=activefg,activebg=activebg,activeline=activeline,anchor='w',command=i[2])
            self.addtag_withtag(buttons_id,button[-1])
            self.addtag_withtag(uid,button[-1])
            buttons.append(button)
        bbox=self.bbox(buttons_id)
        bbox=(bbox[0],bbox[1],bbox[2],bbox[1],bbox[2],bbox[3],bbox[0],bbox[3])
        self.coords(back,bbox)
        self.coords(outline,bbox)
        self.__auto_anchor(uid,pos,anchor)
        return outline,back,buttons,uid

效果

测试代码

b.add_barbutton((1500,150))

最终效果

在这里插入图片描述


github项目

TinUI的github项目地址

pip下载

pip install tinui

结语

如果想使用界面菜单,可以直接使用menubutton,去掉标识符即可。

🔆tkinter创新🔆

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

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

相关文章

第二证券:港股交易规则有哪些?

港股的生意规矩: 1、港股生意时间:港股商场的生意时间分为上午和下午两个时段,上午的生意时间通常是9:30至12:00,而下午的生意时间则是13:00至16:00。需求留心的是,港股在周末及法定节假日会休市,此外恶劣…

ECC加密算法:一种高效且安全的加密技术

ECC(Elliptic Curve Cryptography),即椭圆曲线密码算法,是一种基于椭圆曲线数学理论的公钥加密算法。自1985年由Neal Koblitz和Victor S. Miller分别独立提出以来,ECC凭借其独特的数学原理和高效的性能,逐渐…

【数据结构】大根堆和小根堆

大根堆实现逻辑 从整棵树的最后一颗子树开始调整,每次都让根节点和左右孩子去比较,如果根节点比左右孩子的最大值要小,那么就将这两个值进行交换,然后此时这颗子树变成了大根堆,再看下一颗树 然后对下一颗树进行相同…

【大模型框架】【基本结构】transformer

论文地址:https://arxiv.org/pdf/1706.03762 1. 整体结构 2. 内部结构 3. 公式 Transformer工作原理四部曲:Embedding(向量化)、Attention(注意力机制)、MLPs(多层感知机)和Unembedding(模型输出)。

域名过期了网站还能访问吗?怎么查询域名过期?

在当今数字化的时代,网站已经成为企业、个人展示形象和提供服务的重要窗口。而域名作为网站的标识,其重要性不言而喻。然而,域名是有一定有效期的,那么当域名过期了,网站还能访问吗?又该如何查询域名的过期…

Mysql的事务隔离级别实现原理

一、事务隔离级别 mysql支持四种事务隔离级别: 读未提交:一个事务可以读取到另一个事务还未提交的数据;读已提交:一个事务可以读取到另一个事务已经提交的数据;可重复读:同一个事务中,无论读取…

【C语言】数组和函数实践:扫雷游戏

扫雷游戏 1. 扫雷游戏分析和设计1.1 扫雷游戏的功能说明1.2 游戏的分析和设计1.2.1 数据结构的分析1.2.2 ⽂件结构设计 2. 扫雷游戏的代码实现(1)菜单menu函数(2)设计main函数(3)设计game函数(4…

免费分享:2013中国沙漠(沙地)分布数据集(附下载方法)

沙漠是指地面完全被沙所覆盖、植物非常稀少、雨水稀少、空气干燥的荒芜地区。沙漠亦作“沙幕”,干旱缺水,植物稀少的地区,通常为风成地貌。中国是世界上沙漠面积较大、分布较广、沙漠化危害严重的国家之一,因此我国十分注重防沙治…

发布Meta Segment Anything Model 2 (SAM 2):开启图像和视频分割的新时代

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领…

DiffusionModel-latent diffusion,VAE,U-Net,Text-encoder

Diffusers StableDdiffusion Latent Diffusion 稳定扩散(Stable Diffusion)模型中使用的三个关键组件:自编码器(VAE)、U-Net和文本编码器(Text-encoder) 由于潜在扩散模型的U-Net操作在低维空…

掌握FluentResults:.NET中优雅处理结果与错误

在.NET开发中,结果和错误处理是构建健壯应用程序的关键部分。FluentResults是一个.NET库,它提供了一种优雅的方式来处理操作结果和错误。它允许开发者以声明性和链式调用的方式构建结果对象,使得代码更加清晰和易于维护。本文将介绍FluentRes…

云原生大数据平台KDP,实战疑难问题解答

智领云的KDP(Kubernetes Data Platform)是一款自主研发的容器化云原生大数据平台,它是市场上首个能够完全在Kubernetes上部署的大数据平台。KDP深度整合了云原生架构的优势,解决了传统Hadoop大数据平台在架构限制、部署、运维、运…

ctfshow~菜狗杯 flag一分为二

第一步:解压附件得到miku.png文件 第二步:修改图片高度出现一半的flag 第三步:使用盲水印提取工具得到另一半工具 ctfshow{FirstPRTSecondPrTMikumiku~}

认识systemctl

1: 概述 systemctl命令可以帮助systemd管理和维护所有服务,系统启动完成后,systemctl命令会向systemd发送消息进行服务启动和停止等操作,想知道为什么systemctl命令可以向systemd传递消息吗,其实它是通过一个叫D_Bus(desktop bus)桌面总线的东西实现这一点,它可以并行的处理多…

劝你先别更新!!最新Stable Diffusion WebUI 1.10已来!WebUI终于支持SD3大模型了!你跑起来了么?

你的SD3大模型在SD WebUI1.10.0中跑起来了么? 今天发现Stable Diffusion WebUI于昨日推出了最新SD WebUI1.10.0 版本。令人比较兴奋的是该版本支持了SD3大模型,同时也新增了DDIM CFG采样器。主要更新内容如下: 最新版本地址: 更新…

跨境电商TikTok达人合作策略:驱动口碑传播,助力经济增长

通过与TikTok达人的深度合作,跨境电商不仅能够有效提升品牌曝光度和销售额,还能激发用户的口碑传播,形成强大的“口碑经济”效应。本文Nox聚星将和大家分析这种合作模式如何引发口碑经济效应,并探讨如何通过优化合作策略&#xff…

Python酷库之旅-第三方库Pandas(058)

目录 一、用法精讲 221、pandas.Series.interpolate方法 221-1、语法 221-2、参数 221-3、功能 221-4、返回值 221-5、说明 221-6、用法 221-6-1、数据准备 221-6-2、代码示例 221-6-3、结果输出 222、pandas.Series.isna方法 222-1、语法 222-2、参数 222-3、功…

JAVA的String类的contains方法,Indexof方法不使用KMP算法

今天做力扣的一道题目,在一个字符串中找出字符串的时候,想到了JAVA有一个contains方法,于是我去看了一下源码,发现他就是简单地调用了一下java的indexof方法, 然后我又去看了Indexof的源码,发现他就是简单的…

深入探讨C++编译期多态:提高效率与安全性

目录 一、引言 二、编译期多态技术详解 函数重载(Function Overloading) 运算符重载(Operator Overloading) 模板元编程(Template Metaprogramming) 使用std::enable_if实现条件模板特化 使用if con…