Python + Tkinter:图片浏览器(一)——最小体积

这篇博客介绍了如何使用Python的Tkinter和PIL库创建一个简洁的图片浏览器。内容包括布局设计(pack和place),图片展示(Canvas),自动适应窗口大小,选择图片目录的功能实现,以及模块介绍(tkinter, PIL, os)。该图片浏览器实现了基本的导航、图库浏览和窗口调整功能,并强调了界面的简洁和用户体验。" 106694030,5537039,Kotlin 高级技巧解析:从 plus 到单例,"['Kotlin', '编程语言', 'Android开发', '移动开发', '算法']
摘要由CSDN通过智能技术生成

前言

之前写过一篇关于图片浏览器的博文:Python + Tkinter:简易图片浏览器。由于仓促间完成,没有过多的琢磨和提炼,作品有些不尽人意。在使用过程中,觉得界面还不够清爽,做过一些改进。但一直没有更新。个人觉得还是图片浏览器,在视觉感官上,简洁纯粹的画面才是所追求的体验。

说明

布局方式

一开始是采用pack布局,格局简单,但是对于图片展示来说占用有限的初始空间。尝试使用绝对定位的place布局。place布局需要预设窗体大小,能做到精准设计。

图片展示

Tkinter库用于展示高清图片的容器主要有有两个:Label和Canvas。这里使用的是画布Canvas。

自动适应窗口

为了更好地展示高清图片,可能会调整窗口大小。显示图片的同时,需要考虑图片和按钮等组件自动适应窗口大小的变化的问题。

选择图片目录

一个具有良好用户体验的软件应该具有至少一个预设的初始化应用场景。同时,提供给用户自主选择的选项。

功能

图片导航

最基本的导航功能有三个:初始化、上一张和下一张。

浏览图库

初始化图片目录和重新选择图片目录。

窗口调整

窗口调整主要需要考虑的是:窗口居中、最大化、放大和缩小。在窗口调整时,也需要调整图片的大小:是放大还是缩小?通过监听窗口大小变化事件,及时原比例缩放图片是基本的要求。

模块

tkinter

PIL

os

自定义

imageutil.py

"""
@author: MR.N
@created: 2021-08-22 Sun. 21:54

"""
from PIL import Image, ImageTk

S_WIDTH = 560
S_HEIGHT = 640
SUB_WIDTH = 166
SUB_HEIGHT = 166
MIN_SUB_WIDTH = 16
MIN_SUB_HEIGHT = 16
I_WIDTH = S_WIDTH
I_HEIGHT = S_HEIGHT


def resize(path, scale=-1, screen_width=0, screen_height=0):
    image = Image.open(path)
    if scale == -1:
        if screen_width <= 0:
            screen_width = I_WIDTH
        if screen_height <= 0:
            screen_height = I_HEIGHT
        raw_width, raw_height = image.size[0], image.size[1]
        # max_width, max_height = I_WIDTH, I_HEIGHT
        max_width, max_height = raw_width, screen_height
        # '''
        min_width = max(raw_width, max_width)
        min_height = int(raw_height * min_width / raw_width)
        while min_height > screen_height:
            min_height = int(min_height * .9533)
        while min_height < screen_height:
            min_height += 1
        min_width = int(raw_width * min_height / raw_height)
        '''
        min_height = max(raw_width, max_width)
        min_width = int(raw_width * min_height / raw_height)
        '''
        while min_width > screen_width:
            min_width -= 1
        min_height = int(raw_height * min_width / raw_width)
    elif scale == 1:
        raw_width, raw_height = image.size[0], image.size[1]
        min_height = max(SUB_HEIGHT, max(I_HEIGHT, screen_height - 40) // 4)
        min_width = int(raw_width * min_height / raw_height)
    else:
        raw_width, raw_height = image.size[0], image.size[1]
        min_height = 18
        min_width = int(raw_width * min_height / raw_height)
    return image.resize((min_width, min_height))

imageviewer.py

# -*- coding: utf-8 -*-
"""
@file: imageviewer
@author: MR.N
@created: 2022/4/6 4月
@version: 1.0
@blog: https://blog.csdn.net/qq_21264377
"""

import tkinter as tk
from tkinter.filedialog import askdirectory
from imageutil import *
import os


def load_cache(media_dir=None):
    if media_dir is None:
        current_dir 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值