tkinter绘制组件(37)——普通图片

news2024/10/3 4:44:11

tkinter绘制组件(37)——普通图片

  • 引言
  • 布局
    • 函数结构
    • 添加图片
    • 图片缩放
    • 完整函数代码
  • 效果
    • 测试代码
    • 最终效果
  • github项目
  • pip下载
  • 结语

引言

其实,本来不打算专门为TinUI写图片元素控件的,让编写者自行使用PhotoImage类和画布自带的create_image方法。但是,因为TinUIXml类的使用,使得界面编写不再需要那么多与ui准备操作相关的逻辑代码,所以有必要(虽然我还是觉得没有太大必要)为TinUI添加image元素,来显示图片。

提前声明一下,add_image方法的具体目的:

  • 显示tkinter自身能够显示的图片格式(静态gif,png)

  • 支持图片缩放(none,fill,uniform三种格式)

  • 借鉴了小康2022项目小康2022 / tkintertools · GitCode中的PhotoImage

除了方便、总所周知的Canvas添加图片方法,这里主要讲三种缩放类型。


布局

函数结构

    def add_image(self,pos:tuple,width=None,height=None,state='fill',imgfile=None):#绘制静态图片
    '''
    pos-位置
    width-宽度
    height-高度
    state-缩放格式
    imgfile-图片文件
    '''

添加图片

这个就很简单,读者,就默认你已经熟悉了tkinter图片显示功能。

在三种缩放,none模式无疑是最简单的,就是从左上角裁剪。

        state=state.lower()
        if state=='none' and (width!=None or height!=None):#直接左上角裁剪
            image=PhotoImage(file=imgfile,width=width,height=height)
            width,height=None,None
        else:
            image=PhotoImage(file=imgfile)

现在,直接显示图片,方便我们获取图片原本的尺寸:

        self.images.append(image)#存储图片,防止被python垃圾回收
        img=self.create_image(pos,anchor='nw',image=self.images[-1])
        bbox=self.bbox(img)
        rwidth,rheight=bbox[2]-bbox[0],bbox[3]-bbox[1]

因为python传奇的垃圾回收机制,类中对PhotoImage的实例无法保存,需要使用一些固定的载体,比如BasicTinUI的属性之一:images:list

图片缩放

我也是借鉴(新学)的,tkinter自身可以实现图片任意比例缩放,不过可能比PIL慢些。

具体步骤:

  1. 通过zoom方法设定缩放最小基数(精确度)

  2. 通过subsample方法按比例缩放图片

翻译成代码就如下:

        if width!=None or height!=None:#缩放
            #缩放系数
            xrate=width/rwidth if width!=None else 1
            yrate=height/rheight if height!=None else 1
            if state=='uniform':#等比缩放
                #取最小值
                if yrate<xrate:
                    xrate=yrate
                else:#yrate>=xrate
                    yrate=xrate
            #else:state=='fill'
            key=round(2)
            image=PhotoImage.zoom(image,key,key)
            image=image.subsample(round(key/xrate),round(key/yrate))

当然咯,因为img元素不可能跟着改变,所以要重新为其指定图片信息,别忘了更改图片列表最后一个元素。

            #...
            self.images[-1]=image
            self.itemconfig(img,image=self.images[-1])

完整函数代码

    def add_image(self,pos:tuple,width=None,height=None,state='fill',imgfile=None):#绘制静态图片
        #这个控件是静态gif或者是png图片
        #state::none裁剪操作,fill填充,uniform等比缩放
        state=state.lower()
        if state=='none' and (width!=None or height!=None):#直接左上角裁剪
            image=PhotoImage(file=imgfile,width=width,height=height)
            width,height=None,None
        else:
            image=PhotoImage(file=imgfile)
        self.images.append(image)#存储图片,防止被python垃圾回收
        img=self.create_image(pos,anchor='nw',image=self.images[-1])
        bbox=self.bbox(img)
        rwidth,rheight=bbox[2]-bbox[0],bbox[3]-bbox[1]
        if width!=None or height!=None:#缩放
            #缩放系数
            xrate=width/rwidth if width!=None else 1
            yrate=height/rheight if height!=None else 1
            if state=='uniform':#等比缩放
                #取最小值
                if yrate<xrate:
                    xrate=yrate
                else:#yrate>=xrate
                    yrate=xrate
            #else:state=='fill'
            key=round(2)
            image=PhotoImage.zoom(image,key,key)
            image=image.subsample(round(key/xrate),round(key/yrate))
            self.images[-1]=image
            self.itemconfig(img,image=self.images[-1])
        return img

效果

测试代码

# 见 test\image.py

最终效果

在这里插入图片描述


github项目

TinUI的github项目地址

pip下载

pip install tinui

结语

image在tkinter其实并不是一个单独控件,而是一个参数,不过TinUI把它拎了出来,也就凑合着用吧。以后可能会接受PIL提供的ImageTk。TinUI4.0开始还会随包发布帮助手册应用。

🔆tkinter创新🔆

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

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

相关文章

[附源码]JAVA毕业设计计算机类课程实验平台(系统+LW)

[附源码]JAVA毕业设计计算机类课程实验平台&#xff08;系统LW&#xff09; 目运行 环境项配置&#xff1a; Jdk1.8 Tomcat8.5 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目…

【编程题】【Scratch一级】2022.09 踢足球

踢足球 1. 准备工作 &#xff08;1&#xff09;选择背景Baseball 2&#xff1b; &#xff08;2&#xff09;删除默认的小猫角色&#xff0c;选择角色Ben和Soccer Ball。 2. 功能实现 &#xff08;1&#xff09;Ben初始造型为ben-a&#xff0c;初始位置为舞台左下角&#xf…

开发3年入职饿了么P6,全靠这份MyBatis学习笔记了

前言 相信大部分程序员工作中都有接触过MyBatis&#xff0c;那么它到底重不重要呢&#xff1f;答案是肯定的呀&#xff01; 互联网公司基本都是用Mybatis做为持久层框架的&#xff0c;所以&#xff0c;Mybatis是一定要学的&#xff01;&#xff01;&#xff01; 不管是在工作中…

[附源码]Python计算机毕业设计Django公共台账管理系统

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;…

PMP项目管理中的各种图

直方图 柱状图,条形图,用来统计 帕累托图 就是把直方图进行排序 散点图 分析2个元素之间的相关性 矩阵图 在行列交叉的位置展示因素、原因和目标之间的关系强弱

10 个你必须要知道的重要JavaScript 数组方法

数组方法在 JavaScript 中是必不可少的&#xff0c;数组方法有很多。对于忙碌的初学者&#xff0c;我选择了 10 种最常见的数组方法&#xff0c;你必须学习它们&#xff0c;这些可以帮助你提升学习效率&#xff0c;节省时间。 为了便于理解&#xff0c;我为每个数组方法提供了…

不强迫登录!Apipost用着真爽!

Apipost在上个版本推出了Apipost网页版&#xff0c;用户无需下载软件在官网就可以直接体验到Apipost的很多强大功能。 Apipost 7版本在使用网页版时的登录问题上&#xff0c;让用户在无需下载的基础上&#xff0c;更无需登录&#xff0c;就可以便捷使用Apipost更多的功能&…

Promise期约函数的实现

前言 Promise也叫期约函数,是ES6中新增的特性,是解决异步编程的一种方案,取代回调函数避免回调地狱。 const p new Promise((resolve,reject)>{resolve(1); });// 链式调用 p.then(res > Promise.resolve(res 2)).then(res > Promise.resolve(res 3)).then(res &…

嵌入式系统硬件概述

文章目录嵌入式系统硬件平台(1) 嵌入式处理器的分类(2) 嵌入式微处理器MIPS处理器PowerPC处理器ARM处理器ARM发展历史ARM公司介绍ARM市场份额嵌入式微控制器&#xff08;MCU&#xff09;数字信号处理器&#xff08;DSP&#xff09;嵌入式片上系统&#xff08;SoC&#xff09;嵌…

【uni-app】总结uni-app订单支付和打包发布

前言 总结uni-app订单支付和打包发布 1- 支付 1.1 app的支付 1.1.1 准备工作 支付厂商 获取id 去微信支付平台接入微信支付 支付宝 打包时候 去mainifest.json文件下&#xff0c;找到 app模块配置 &#xff0c;勾选payment支付 1.1.2 代码 获取支付厂商 uni.getProvide() u…

Spring Boot 程序优化的 14 个小妙招!

1.定义配置文件信息 有时候我们为了统一管理会把一些变量放到yml配置文件中 例如 图片 用 ConfigurationProperties 代替Value 使用方法 定义对应字段的实体 Data // 指定前缀 ConfigurationProperties(prefix "developer") Component public class Developer…

数据看板是什么?

一 数据看板定义 数据看板是数据可视化的载体。数据看板是一个可视化工具&#xff0c;通过合理的页面布局、效果设计&#xff0c;将可视化数据更直观、更形象的展现出来&#xff1b;数据看板是一个交流工具&#xff0c;通过数据公开和呈现&#xff0c;公司内部能够共享有效信息…

大二学生基于Html+Css+javascript的网页制作——动漫设计公司响应式网站模板 (10个页面)

HTML实例网页代码, 本实例适合于初学HTML的同学。该实例里面有设置了css的样式设置&#xff0c;有div的样式格局&#xff0c;这个实例比较全面&#xff0c;有助于同学的学习,本文将介绍如何通过从头开始设计个人网站并将其转换为代码的过程来实践设计。 ⚽精彩专栏推荐&#x1…

JAVAWEB_实验二 JSP 的内置对象

文章目录一、Part 1 JSP 的内置对象一、实验目的二、实验要求三、实验内容二、Part 2 JSP 的内置对象一、实验目的二、实验要求三、实验内容思考&#xff1a;页面重定向有哪些方式&#xff1f;区别时什么&#xff1f;一、Part 1 JSP 的内置对象 一、实验目的 通过编程和上机实…

算法刷题打卡第33天:香槟塔

香槟塔 难度&#xff1a;中等 我们把玻璃杯摆成金字塔的形状&#xff0c;其中第一层有 1 个玻璃杯&#xff0c;第二层有 2 个&#xff0c;依次类推到第 100 层&#xff0c;每个玻璃杯 (250ml) 将盛有香槟。 从顶层的第一个玻璃杯开始倾倒一些香槟&#xff0c;当顶层的杯子满…

【JavaWeb】Servlet系列 --- 使用纯Servlet做一个单表的CRUD操作(oa小项目,超详细笔记)

使用纯Servlet做一个单表的CRUD操作实现步骤第一步&#xff1a;准备一张数据库表&#xff08;sql脚本/可视化工具&#xff09;第二步&#xff1a;准备一套HTML页面&#xff08;页面原型&#xff09;【前端开发工具使用vscode / IDEA】第三步&#xff1a;分析我们这个系统包括哪…

分布式共识协议 Raft 是如何工作的?

Raft 解决的问题 提供一种共识算法&#xff08;分布式一致性算法&#xff09;。 Paxos是早先的一个分布式共识算法&#xff0c;Paxos 逻辑复杂而难以理解和实现。相比早先的 Paxos&#xff0c; Raft 提供一个容易理解和实现的共识算法&#xff0c;在很多的系统比如 etcd, ozon…

力扣hot100——第3天:11盛最多水的容器、21合并两个有序链表、22括号生成

文章目录1.11盛最多水的容器1.1.题目1.2.解答1.2.1.题解1.2.2.自己对参考题解的进一步解释2.21合并两个有序链表2.1.题目2.2.题解3.22括号生成3.1.题目3.2.题解1.11盛最多水的容器 参考&#xff1a;力扣题目链接&#xff1b;题解 1.1.题目 1.2.解答 1.2.1.题解 这道题目可以…

GIS工具maptalks开发手册(一)——hello world初始化

GIS工具maptalks开发手册(一)——hello world初始化 为何使用maptalks&#xff1f; ​ Maptalks项目是一个HTML5的地图引擎, 基于原生ES6、Javascript开发的二三维一体化地图。 通过二维地图的旋转、倾斜增加三维视角&#xff0c;通过插件化设计, 能与其他图形库echarts、d3.…

微信小程序实战十四:小程序及APP端实现客服功能

文章目录 1.效果预览2.小程序后台添加客服3.小程序代码中集成客服4.APP中添加客服5.企业微信登陆6.获取企业ID值7.设置多客服说明:项目用uni开发的,有小程序版本和APP版本,最开始项目中集成了第三方美洽的客服,2个客服一年收3600,老哥咨询我是否有稍微优惠点的方案,老哥带…