tkinter类ppt的图片浏览组件

  • 引言
  • 框架
  • 添加图片
  • 显示图片
  • 完整代码
  • 效果
  • 结语

引言

这里指的类ppt是指组件主体由图片选择框,原始图片显示框组成,木有自己的编辑功能。

框架

类似PPT,左边是多个图片缩略图的选择框,右边大半部分是原始图片的显示区域。因为原始图片可能会超过显示框,所以显示框必须配备横向和纵向两个滚动条。

那么通过构思得到的组件框架如下:

class ImageView(LabelFrame):"""一个可以查看多个图片的组件,看起来像ppt"""def __init__(self,master,**kw):LabelFrame.__init__(self,master,**kw)self.imgtext=scrolledtext.ScrolledText(self,state='disabled',cursor='arrow')#缩小照片显示区self.imgtext.place(relx=0,rely=0,relwidth=0.21,relheight=1)self.imgtext.vbar['width']=10self.imgframe=Frame(self,bg='white',relief='flat')self.imgback=Text(self.imgframe,bg='white',relief='flat',cursor='arrow',state='disabled')#正常照片显示区self.vbar=Scrollbar(self.imgframe,orient='vertical',width=9)self.vbar.pack(side='right',fill='y')self.vbar.config(command=self.imgback.yview)self.hbar=Scrollbar(self.imgframe,orient='horizontal',width=9)self.hbar.pack(side='bottom',fill='x')self.hbar.config(command=self.imgback.xview)self.imgback.pack(side='right',fill='both',expand=True)self.imgback.config(xscrollcommand=self.hbar.set, yscrollcommand=self.vbar.set)self.imgframe.place(relx=0.21,rely=0,relwidth=0.79,relheight=1)self.images={}#存放缩略图与原图信息

在 scrolledtext.ScrolledText 中,可以直接更改滚动条颜色。在这里没有使用颜色参数。

添加图片

为了使组件加载时不用耗费过多时间,设立了专门的函数加入图片并进行显示操作。在添加图片的函数中,图片路径将被作为参数使用。

添加图片分为三个步骤。第一步,先对图片进行尺寸处理,使其能够完整显示在选择框内;第二步,生成与缩略图对应的图片信息,在稍后使用;第三步,显示缩略图,绑定单击信息。

当鼠标经过选项框的图片时,label最好还能够显示橙色(选定颜色)。

方便起见,该组件不对gif进行特殊处理。

#添加图片与生成相对应的图片信息
def append_image(self,img:str):path=imgimg=Image.open(img)width,height=img.sizeself.update()w=self.imgtext.winfo_width()h=w*2//3eimg=ImageTk.PhotoImage(img)img.thumbnail((w,h),Image.ANTIALIAS)eimgtk=ImageTk.PhotoImage(img)#键:小图片,值:大图片self.images[eimgtk]=eimgself._append_imagelabel(eimgtk,path)#显示图片#显示图片并绑定
def _append_imagelabel(self,eimgtk,path):#:eimgtk  经过ImageTk.Photoimage处理后的文件。同时是在字典中的缩小图片,键#通过label添加图片,让其能够绑定事件path=re.findall('.*\\\\(.*)',path)[0]self.imgtext['state']='normal'imglabel=Label(self.imgtext,relief='groove',image=eimgtk,text=path,compound='bottom')imglabel.bind('<Enter>',lambda event:imglabel.config(bg='#EED546'))#显示提醒与离开imglabel.bind('<Leave>',lambda event:imglabel.config(bg='#f0f0f0'))imglabel.bind('<Button-1>',lambda event:self.change_img(event,eimgtk))self.imgtext.window_create('end',window=imglabel)self.imgtext.insert('end','\n\n')self.imgtext.update()self.imgtext['state']='disabled'

显示图片

在图片label被单击后,在原图显示框中显示被选中缩略图的原图

def change_img(self,event,eimgtk):#来自 _append_imagelabel 的单击绑定#:eimgtk  缩略图self.imgback['state']='normal'self.imgback.delete(1.0,'end')self.imgback.image_create('end',image=self.images[eimgtk])self.imgback['state']='disabled'

完整代码

class ImageView(LabelFrame):"""一个可以查看多个图片的组件,看起来像ppt"""def __init__(self,master,**kw):LabelFrame.__init__(self,master,**kw)self.imgtext=scrolledtext.ScrolledText(self,state='disabled',cursor='arrow')#缩小照片显示区self.imgtext.place(relx=0,rely=0,relwidth=0.21,relheight=1)self.imgtext.vbar['width']=10self.imgframe=Frame(self,bg='white',relief='flat')self.imgback=Text(self.imgframe,bg='white',relief='flat',cursor='arrow',state='disabled')#正常照片显示区self.vbar=Scrollbar(self.imgframe,orient='vertical',width=9)self.vbar.pack(side='right',fill='y')self.vbar.config(command=self.imgback.yview)self.hbar=Scrollbar(self.imgframe,orient='horizontal',width=9)self.hbar.pack(side='bottom',fill='x')self.hbar.config(command=self.imgback.xview)self.imgback.pack(side='right',fill='both',expand=True)self.imgback.config(xscrollcommand=self.hbar.set, yscrollcommand=self.vbar.set)self.imgframe.place(relx=0.21,rely=0,relwidth=0.79,relheight=1)self.images={}#存放缩略图与原图信息def change_img(self,event,eimgtk):#:eimgtk  缩略图self.imgback['state']='normal'self.imgback.delete(1.0,'end')self.imgback.image_create('end',image=self.images[eimgtk])self.imgback['state']='disabled'def _append_imagelabel(self,eimgtk,path):#:eimgtk  经过ImageTk.Photoimage处理后的文件。同时是在字典中的缩小图片,键#通过label添加图片,让其能够绑定事件path=re.findall('.*\\\\(.*)',path)[0]self.imgtext['state']='normal'imglabel=Label(self.imgtext,relief='groove',image=eimgtk,text=path,compound='bottom')imglabel.bind('<Enter>',lambda event:imglabel.config(bg='#EED546'))#显示提醒与离开imglabel.bind('<Leave>',lambda event:imglabel.config(bg='#f0f0f0'))imglabel.bind('<Button-1>',lambda event:self.change_img(event,eimgtk))self.imgtext.window_create('end',window=imglabel)self.imgtext.insert('end','\n\n')self.imgtext.update()self.imgtext['state']='disabled'def append_image(self,img:str):path=imgimg=Image.open(img)width,height=img.sizeself.update()w=self.imgtext.winfo_width()h=w*2//3eimg=ImageTk.PhotoImage(img)img.thumbnail((w,h),Image.ANTIALIAS)eimgtk=ImageTk.PhotoImage(img)#键:小图片,值:大图片self.images[eimgtk]=eimgself._append_imagelabel(eimgtk,path)

效果


Tin知识库

结语

虽然tkinter提供的原始组件比较少,但是通过组合和添加新的功能函数,同样可以让GUI界面变得丰富。

☀tkinter创新☀

tkinter类ppt的图片浏览组件相关推荐

  1. 基于ViewFlipper实现图片浏览组件

    转载请说明出处:http://blog.csdn.net/ff20081528 前段时间一个朋友问我有没有做过手机商城的广告浏览的功能,如下图: 我也看了下,基本上所有的商城也都有衣蛾这样的东西.在网 ...

  2. Vue图片浏览组件v-viewer简单应用

    v-viewer 用于图片浏览的Vue组件,支持旋转.缩放.翻转等操作,基于viewer.js. 安装 npm install v-viewer 使用 引用插件 main.js import View ...

  3. Vue - 图片浏览组件v-viewer

    1. 介绍和安装 v-viewer组件可以实现图片点击放大,缩小,旋转,切换等操作 在Vue项目中打开终端,npm引入v-viewer组件 npm install v-viewer --save 2. ...

  4. Python使用tkinter编写图片浏览程序

    代码要点:1)使用tkinter的Label显示图片:2)tkinter的PhotoImage支持的图片格式较少,使用pillow扩展库的Image和ImageTk弥补了这个缺点. import os ...

  5. 使用Aspose组件将WORD、PDF、PPT转为图片

    using System; using System.Collections.Generic; using System.Text; using OMCS.Engine.WhiteBoard; usi ...

  6. 懒人图片浏览(image galleries,相册)功略——highslide篇

    网站特别社交类,经常用到图片浏览或相册集.对于FLASH不是很懂的我来说,只好寻求网络,还真让我找到两个相当易用,又酷炫的组件.基于脚本的highslide和基于FLASH的Simpleviewer. ...

  7. 原创“.NET研究”企业级控件库之图片浏览控件

    在上两篇:我介绍了原创企业级控件库之组合查询控件 和原创企业级控件库之大数据量分页控件,受到了很多朋友的支持,给了我很大的动力,在此我特表感谢.有的朋友要求把源码提供上来,我在第一篇就讲了,源码会在我 ...

  8. 一起撸个朋友圈吧 图片浏览(上)【图片点击前景色】

    项目地址:github.com/razerdp/Fri- (能弱弱的求个star或者fork么QAQ) 上篇链接:一起撸个朋友圈吧 (Step6)- 评论对齐(点击评论对齐)[下] 下篇链接:一起撸个 ...

  9. python中mainloop添加背景_Python实例讲解 - tkinter canvas (设置背景图片及文字)

    Python实例讲解 -- tkinter canvas (设置背景图片及文字) 先来一个绘图: from Tkinter import * master = Tk() w = Canvas(mast ...

最新文章

  1. 智能车竞赛技术报告 | 双车接力组 - 东北大学 - 三好学生
  2. C语言入坑指南-数组之谜
  3. Springboot2 Quartz实现JAVA定时任务的动态配置
  4. c语言程序设计电加热炉,基于80C52单片机的电加热数字恒温控制系统设计
  5. 无法Debug SQL: Unable to start T-SQL Debugging. Could not attach to SQL Server process on
  6. 论文赏析[TACL19]生成模型还在用自左向右的顺序?这篇论文教你如何自动推测最佳生成顺序
  7. (原创)十大危险cmd命令代码总结
  8. 台式计算机cpu品牌,台式电脑CPU天梯图2018年9月最新版 桌面CPU性能排名
  9. fan4801开关电源原理图_开关电源各模块原理实图讲解精编版
  10. Citrix ADC中SNIP的三种配置场景
  11. csdn博客更换皮肤
  12. 【Redis】RedisCluster 批量删除key
  13. 计算机教室学生上机须知,微机室上机须知
  14. user和userdebug的应用签名在哪里配置?
  15. 转 虫师的selenium借助AutoIt识别上传(下载)详解
  16. C# 体温录入及打印体温折线图
  17. 图解研发效能:让过程被看见,让工作更高效
  18. 《安富莱嵌入式周报》第247期:2022.01.03--2022.01.09
  19. 水星UD6S网卡Linux驱动,水星UD6S无线usb网卡驱动程序下载-水星网络UD6S网卡驱动1.0 最新版-东坡下载...
  20. 3.5寸TFT彩屏模块如何区分是否带触摸功能?

热门文章

  1. macOS 安装 emscripten补充爬坑
  2. 用java模拟计算器的基本四则运算
  3. tf.truncated_normal()用法
  4. JAVA本地方法详解,什么是JAVA本地方法?
  5. wlk修复最好的服务器,cwlk中那些最容易获得的服务器第一成就
  6. Codeforces 444C DZY Loves colors(分块)
  7. solr-5.4.1 和 mmseg4j-2.3.0版本的配置
  8. 阿里云服务器绑定域名
  9. centos7镜像在VMware上安装centos7详细教程
  10. 【MongoDB】BSON的介绍及BSON与JSON的区别