import os
from tkinter import filedialog, Tk
from PIL import Image, ImageTk, ImageSequence
import tkinter
from win32com.shell import shell, shellcon #####################
# 第一个完备的图片浏览器
##################### def 删除文件(filename):
# 删除文件,经过回收站
shell.SHFileOperation((0, shellcon.FO_DELETE, filename, None,
shellcon.FOF_SILENT | shellcon.FOF_ALLOWUNDO | shellcon.FOF_NOCONFIRMATION, None,
None)) # 删除文件到回收站 testpath = r"C:\Users\Administrator\Desktop\测试文件夹" class Application():
def __init__(self, root):
self.root = root
self.img = None
self.createLable() # 建立Lable对象 # self.files = self.载入路径文件列表(testpath)
self.files = self.载入路径文件列表()
# [{name:"",path="",tag=False}]
self.index = 0
self.显示图片() def 显示图片(self):
# 这里开始载入文件
path = self.files[self.index]
self.当前图片 = path
if path[-3:] in {"GIF", "gif"}:
self.显示动图(path)
else:
self.显示单个图片(path) def 显示单个图片(self, path):
# 单图片
image = Image.open(path)
width, height = self.auto_scale(image)
pic_image = image.resize((width, height), Image.ANTIALIAS)
self.img = ImageTk.PhotoImage(image=pic_image)
# self.img 当前图片的文件对象
# 载入文件结束
self.pic_lable['image'] = self.img def 显示动图(self, path):
self.帧列表 = list(map(ImageTk.PhotoImage, ImageSequence.Iterator(Image.open(path))))
self.帧位 = 0
self.帧总数 = len(self.帧列表)
self.动图路径 = path
self.显示帧() def 显示帧(self):
if self.当前图片 != self.动图路径:
return self.pic_lable['image'] = self.帧列表[self.帧位]
self.帧位 = (self.帧位 + 1) % self.帧总数
self.pic_lable.after(100, self.显示帧) def auto_scale(self, pic_image):
"""自动缩放"""
width, height = pic_image.size # 获取图片的width height
org_rate = width / height
if width > height * (1080 / 720):
# 宽缩放
rate = 1
while True:
scale_width = width * rate
if scale_width <= 1080:
break
rate -= 0.1
scale_height = scale_width / org_rate
return int(scale_width), int(scale_height)
else:
# 高缩放
rate = 1
while True:
scale_height = height * rate
if scale_height <= 720:
break
rate -= 0.1
scale_width = scale_height * org_rate
return int(scale_width), int(scale_height) def createLable(self):
self.pic_lable = tkinter.Label(self.root, width=1080, height=720)
self.pic_lable.focus_set()
self.pic_lable['image'] = self.img
self.pic_lable.pack() def 载入路径文件列表(self, path=None):
if not path:
path = filedialog.askdirectory()
self.root.focus_force() # 返回焦点
pic_list = [''.join([path, '/', img]) for img in os.listdir(path)]
return pic_list def prev(self):
self.show_file(-1) def next(self):
self.show_file(1) def show_file(self, n):
self.index += n
if self.index < 0:
self.index = len(self.files) - 1
if self.index > (len(self.files) - 1):
self.index = 0 self.显示图片() def 删除当前图片(self):
文件路径 = self.files[self.index]
删除文件(文件路径)
self.files.pop(self.index)
self.show_file(0)
# self.显示图片() def 滚动处理(event):
if event.delta > 0:
app.prev()
else:
app.next() def 按键(event):
if event.keycode == 37:
app.prev()
elif event.keycode == 39:
app.next()
elif event.keycode == 46:
# 这是删除键的
app.删除当前图片() root = Tk()
root.title('图片浏览器')
root.geometry("1080x720")
root['bg'] = '#333333'
root.resizable(False, False) app = Application(root) root.bind_all("<MouseWheel>", 滚动处理)
root.bind_all("<Key>", 按键)
# 左右的两个按钮1
btnPrev = tkinter.Button(root, text=" < ", command=app.prev)
btnPrev.place(x=-10, y=360)
# type()function None
# 左右的两个按钮2
btnNext = tkinter.Button(root, text=" > ", command=app.next)
btnNext.place(x=1050, y=360) # 左右的两个按钮2
delbtn = tkinter.Button(root, text=" 删除图片 ", command=app.删除当前图片)
delbtn.place(relx=1.0, rely=1.0,anchor=tkinter.SE)
root.mainloop()

[python]tkinter简易的图片浏览器的更多相关文章

  1. 基于Python PIL实现简单图片格式转化器

    基于Python PIL实现简单图片格式转化器 目录 基于Python PIL实现简单图片格式转化器 1.简介 2.前期资料准备 2.1.1如何实现图片格式转换? 2.1.2如何保存需要大小的图片? ...

  2. Python爬虫下载美女图片(不同网站不同方法)

    声明:以下代码,Python版本3.6完美运行 一.思路介绍 不同的图片网站设有不同的反爬虫机制,根据具体网站采取对应的方法 1. 浏览器浏览分析地址变化规律 2. Python测试类获取网页内容,从 ...

  3. Python Tkinter基础控件入门实例

    分享一个Python Tkinter基础控件用法的入门例子,包括窗口的显示.显示内置图片.弹出窗口.菜单等. 例子,Python Tkinter基础控件的用法 # -*- coding: utf-8 ...

  4. python搭建简易服务器实例参考

    有关python搭建简易服务器的方法. 需求分析: 省油宝用户数 已经破了6000,原有的静态报表 已经变得臃肿不堪, 每次打开都要缓上半天,甚至浏览器直接挂掉 采用python搭建一个最最简易的 w ...

  5. 用WPF窗体打造个性化界面的图片浏览器

    原文:用WPF窗体打造个性化界面的图片浏览器 本文使用WPF窗体(XAML及C#)与Win Form控件(FolderBrowserDialog)结合的方式, 演示制作了一个简易漂亮的WPF图片浏览器 ...

  6. Python编写简易木马程序(转载乌云)

    Python编写简易木马程序 light · 2015/01/26 10:07 0x00 准备 文章内容仅供学习研究.切勿用于非法用途! 这次我们使用Python编写一个具有键盘记录.截屏以及通信功能 ...

  7. 纯JS打造比QQ空间更强大的图片浏览器-支持拖拽、缩放、过滤、缩略图等

    在线演示地址(打开网页后,点击商家图册): http://www.sport7.cn/cc/jiangnan/football5.html 先看一看效果图: 该图片浏览器实现的功能如下: 1. 鼠标滚 ...

  8. iOS开发系列--无限循环的图片浏览器

    --UIKit之UIScrollView 概述 UIKit框架中有大量的控件供开发者使用,在iOS开发中不仅可以直接使用这些控件还可以在这些控件的基础上进行扩展打造自己的控件.在这个系列中如果每个控件 ...

  9. 一步一步打造自己的Android图片浏览器(原创)

    今天我们试着来制作一个自己的Android图片浏览器. 图片浏览器应该具有什么功能呢?鉴于不同的人不同的理解,这里提出一个基本的需求: 搜索手机内的所有图片,展示于一个列表中: 列表中展示的是图片的缩 ...

  10. Android 图片浏览器 从原来位置放大至全屏显示

    android 图片浏览器 特点: 1.从网络加载图片,只需要传图片地址数组即可 2.点击图片,从原来位置放大至全屏 3.支持手势操作 4.完全自定义布局 项目源码请到GitHub下载:https:/ ...

随机推荐

  1. TEB学习

    官方资料:http://wiki.ros.org/teb_local_planner/Tutorials set up and test Optimization(重要) Inspect optimi ...

  2. 4 .NET Core笔试题

    1.说说.NET7中 _ViewImports文件的作用? 2.什么是Razor页面? 3.说说.NET5中 __ViewStart文件的作用? 4.如何在Razor页面中实现数据模型绑定? 5.如何 ...

  3. ClickHouse exception, code: 62, host: hadoop102, port: 8123; Code: 62, e.displayText() = DB::Exception: Syntax error: failed at position 183 (end of query):

    报错 ClickHouse exception, code: 62, host: hadoop102, port: 8123; Code: 62, e.displayText() = DB::Exce ...

  4. playwright 实现高亮、is_visible 等源码修改

    一. 前言 高亮是什么? 在ui自动化中可以执行js来让某个页面元素高亮,比如背景颜色.字体颜色.边框颜色等发生改变,以此更加方便执行的时候点了哪一步操作.(如果有不清楚怎么实现的可以转到我的介绍se ...

  5. JZOJ 4276【NOIP2015模拟10.28A组】递推

    [NOIP2015模拟10.28A组]递推 思路一 对于 \(30%\) 的数据,由于 \(n\) 和 \(x_i\) 都比较小,所以依题暴力枚举每个整点的坐标算贡献即可 思路二 对于额外 \(20% ...

  6. PDO使用返回结果集的方法输出数据库里面的单个值

    1 <?php 2 header('content-type:text/html; charset=utf-8'); 3 /* 通过调用驱动程序创建一个PDO实例 */ 4 $dsn = 'my ...

  7. K3S系列文章-使用AutoK3s在腾讯云上安装高可用K3S集群

    开篇 <K3s 系列文章> <Rancher 系列文章> 方案 在腾讯云上安装 K3S 后续会在这套 K3S 集群上安装 Rancher 方案目标 高可用 3 台master ...

  8. slate源码解析(二)- 基本框架与数据模型

    源码架构 首先来看下最核心的slate包下的目录: 可以看到,作为一个开源富文本库,其源码是相当之少.在第一篇文章中说过,Slate没有任何开箱即用的功能,只提供给开发者用于构建富文本所需的最基本的一 ...

  9. CF846F - Random Query

    题意:对于一个序列,每次随机选择两个数 \(l,r\),如果 \(l\gt r\) 就交换,求 \(l,r\) 中本质不同的数个数的期望. 我们发现,在所有的 \(n^2\) 个选择方案中,其实就是 ...

  10. 【深入浅出 Yarn 架构与实现】4-6 RM 行为探究 - 申请与分配 Container

    本小节介绍应用程序的 ApplicationMaster 在 NodeManager 成功启动并向 ResourceManager 注册后,向 ResourceManager 请求资源(Contain ...