Python实现GUI图片浏览程序

Python实现GUI图片浏览程序

下面程序需要pillow库。pillow是 Python 的第三方图像处理库,需要安装才能实用。pillow是PIL( Python Imaging Library)基础上发展起来的,需要注意的是pillow库安装用pip install pillow,导包时要用PIL来导入。更多情况可见https://blog.csdn.net/cnds123/article/details/126141838

一、简单的图片查看程序

功能,使用了tkinter库来创建一个窗口,用户可以通过该窗口选择一张图片并在窗口中显示。能调整窗口大小以适应图片。效果图如下:

源码如下:

import tkinter as tk
from tkinter import filedialog
from PIL import Image, ImageTk

# 创建一个Tkinter窗口
root = tk.Tk()
root.geometry("400x300")  # 设置宽度为400像素,高度为300像素
root.title("Image Viewer")

# 添加一个按钮来选择图片
def open_image():
    try:
        file_path = filedialog.askopenfilename()
        if file_path:
            image = Image.open(file_path)
            photo = ImageTk.PhotoImage(image)

            # 清除旧图片
            for widget in root.winfo_children():
                if isinstance(widget, tk.Label):
                    widget.destroy()
            
            label = tk.Label(root, image=photo)
            label.image = photo
            label.pack()

            # 调整窗口大小以适应图片
            root.geometry("{}x{}".format(image.width, image.height))
    except AttributeError:
        print("No image selected.")

button = tk.Button(root, text="Open Image", command=open_image)
button.pack()

# 运行窗口
root.mainloop()

此程序,创建一个tkinter窗口,设置窗口的大小为400x300像素,并设置窗口标题为"Image Viewer"。

添加一个按钮,当用户点击该按钮时,会弹出文件选择对话框,用户可以选择一张图片文件。

选择图片后,程序会使用PIL库中的Image.open方法打开所选的图片文件,并将其显示在窗口中。

程序会在窗口中显示所选的图片,并在用户选择新图片时清除旧图片。

示例中,使用try-except块来捕获FileNotFoundError,该错误会在用户取消选择图片时触发。当用户取消选择图片时,会打印一条消息提示用户没有选择图片。这样就可以避免因为取消选择图片而导致的报错。

二、图片查看程序1

“Open Directory”按钮用于指定一个目录,窗体上再添加两个按钮:“Previous Image” 和“Next Image”,单击这两个按钮实现切换显示指定目录中的图片。这三个按钮水平排列在顶部,在下方显示图片。如果所选图片的尺寸超过了窗口的大小,程序会将图片缩放到合适的尺寸以适应窗口。效果图如下:

源码如下:

import tkinter as tk
from tkinter import filedialog
from PIL import Image, ImageTk
import os

class ImageViewer:
    def __init__(self, root):
        self.root = root
        self.root.geometry("400x350")
        self.root.title("Image Viewer")

        self.image_dir = ""
        self.image_files = []
        self.current_index = 0

        # 创建顶部按钮框架
        self.button_frame = tk.Frame(self.root)
        self.button_frame.pack(side="top")

        # 创建打开目录按钮
        self.open_button = tk.Button(self.button_frame, text="Open Directory", command=self.open_directory)
        self.open_button.pack(side="left")

        # 创建上一张图片按钮
        self.prev_button = tk.Button(self.button_frame, text="Previous Image", command=self.show_previous_image)
        self.prev_button.pack(side="left")

        # 创建下一张图片按钮
        self.next_button = tk.Button(self.button_frame, text="Next Image", command=self.show_next_image)
        self.next_button.pack(side="left")

        # 创建图片显示区域
        self.image_label = tk.Label(self.root)
        self.image_label.pack()


    def open_directory(self):
        try:
            self.image_dir = filedialog.askdirectory()
            if self.image_dir:
                self.image_files = [f for f in os.listdir(self.image_dir) if f.endswith(".jpg") or f.endswith(".png") or f.endswith(".jfif")]
                self.current_index = 0
                self.show_image()
        except tk.TclError:
            print("No directory selected.")

    def show_image(self):
        if self.image_files:
            image_path = os.path.join(self.image_dir, self.image_files[self.current_index])
            image = Image.open(image_path)
            image.thumbnail((400, 300), Image.ANTIALIAS)
            photo = ImageTk.PhotoImage(image)
            self.image_label.config(image=photo)
            self.image_label.image = photo

    def show_previous_image(self):
        if self.image_dir:
            if self.image_files:
                self.current_index = (self.current_index - 1) % len(self.image_files)
                self.show_image()
            else:
                print("Please open a directory first.")
        else:
            print("Please open a directory first.")

    def show_next_image(self):
        if self.image_dir:
            if self.image_files:
                self.current_index = (self.current_index + 1) % len(self.image_files)
                self.show_image()
            else:
                print("Please open a directory first.")
        else:
            print("Please open a directory first.")

root = tk.Tk()
app = ImageViewer(root)
root.mainloop()

三、图片查看程序2

窗体上有3个控件,列表框和按钮和在窗体上左侧上下放置,右侧区域显示图片, “Open Directory”按钮用于指定目录中,列表用于放置指定目录中的所有图片文件名,点击列表中的图片文件名,图片在右侧不变形缩放显示到窗体上(图片缩放到合适的尺寸以适应窗口),效果图如下:

源码如下:

import tkinter as tk
from tkinter import filedialog
from PIL import Image, ImageTk
import os

# 创建主窗口
root = tk.Tk()
root.geometry("600x300")
root.title("Image Viewer")

# 创建一个Frame来包含按钮和列表框
left_frame = tk.Frame(root)
left_frame.pack(side=tk.LEFT, fill=tk.BOTH, padx=5, pady=5)

# 创建一个Frame来包含图片显示区域
right_frame = tk.Frame(root)
right_frame.pack(side=tk.RIGHT, fill=tk.BOTH, expand=True)

# 创建一个列表框来显示文件名
listbox = tk.Listbox(left_frame)
listbox.pack(fill=tk.BOTH, expand=True)

# 创建一个滚动条并将其与列表框关联
scrollbar = tk.Scrollbar(root, orient=tk.VERTICAL)
scrollbar.pack(side=tk.RIGHT, fill=tk.Y)
scrollbar.config(command=listbox.yview)
listbox.config(yscrollcommand=scrollbar.set)

# 创建一个标签来显示图片
image_label = tk.Label(right_frame)
image_label.pack(fill=tk.BOTH, expand=True)

# 函数:打开目录并列出图片文件
def open_directory():
    directory = filedialog.askdirectory()
    if directory:
        # 清空列表框
        listbox.delete(0, tk.END)
        # 列出目录中的所有图片文件
        for file in os.listdir(directory):
            if file.lower().endswith(('.jpg', '.jpeg', '.png', '.gif','.jfif')):
                listbox.insert(tk.END, file)
        # 保存当前目录
        open_directory.current_directory = directory

# 函数:在右侧显示选中的图片
def show_selected_image(event):
    if not hasattr(open_directory, 'current_directory'):
        return
    # 获取选中的文件名
    selected_file = listbox.get(listbox.curselection())
    # 构建完整的文件路径
    file_path = os.path.join(open_directory.current_directory, selected_file)
    # 打开图片并进行缩放
    image = Image.open(file_path)
    image.thumbnail((right_frame.winfo_width(), right_frame.winfo_height()), Image.ANTIALIAS)
    # 用PIL的PhotoImage显示图片
    photo = ImageTk.PhotoImage(image)
    image_label.config(image=photo)
    image_label.image = photo  # 保存引用,防止被垃圾回收

# 创建“Open Directory”按钮
open_button = tk.Button(left_frame, text="Open Directory", command=open_directory)
open_button.pack(fill=tk.X)

# 绑定列表框选择事件
listbox.bind('<<ListboxSelect>>', show_selected_image)

# 运行主循环
root.mainloop()

附录、文件路径

如果你要操作一个文件,那么你首先要知道这个文件的路径。何为文件的路径呢?

文件路径简单地说就是文件的存放位置,或者说文件的路径表示用户在磁盘上寻找文件时,所历经的文件夹线路它包含具体的盘符号,也就是位于电脑上哪个磁盘分区、哪个文件夹(目录)和最终这个文件的名称+文件类型扩展名。

路径分为绝对路径和相对路径。对Windows系统而言,绝对路径通常以根目录开始,如C:\Users\username\Documents\file.txt(Windows系统)。相对路径则是相对于当前工作目录的位置,如./folder/file.txt表示文件在当前工作目录的上一级目录中的folder文件夹中。

当前目录就是你正在使用的目录,又称为“工作目录”。

以./开头,代表当前目录和文件目录在同一个目录里,./也可以省略不写;

以../开头:向上走一级,代表目标文件在当前文件所在的上一级目录。

关于计算机windows操作系统中的目录、文件夹 、路径更多情况可见https://blog.csdn.net/cnds123/article/details/105169800

python文件或文件夹操作https://blog.csdn.net/cnds123/article/details/123583020

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

javaEE -14(10000字 JavaScript入门 - 1)

一&#xff1a;初始 JavaScript JavaScript (简称 JS)是世界上最流行的编程语言之一&#xff0c;它是一个脚本语言, 通过解释器运&#xff0c;主要在客户端(浏览器)上运行, 现在也可以基于 node.js 在服务器端运行. JavaScript 和 HTML 和 CSS 之间的关系&#xff1a; HTML…

Rellax.js,一款超酷的 JavaScript 滚动效果库

嗨&#xff0c;大家好&#xff0c;欢迎来到猿镇&#xff0c;我是镇长&#xff0c;lee。 又到了和大家见面的时间&#xff0c;今天和大家分享一款轻松实现视差滚动效果的 JavaScript 库——Rellax.js。无需大量的配置&#xff0c;即可为你的网站增色不少。 什么是Rellax.js&am…

simulinkveristandlabview联合仿真环境搭建

目录 开篇废话 软件版本 明确需求 软件安装 matlab2020a veristand2020 R4 VS2017 VS2010 软件安装验证 软件资源分享 开篇废话 推免之后接到的第一个让人难绷的活&#xff0c;网上开源的软件资料和成功的案例很少&#xff0c;查来查去就那么几篇&#xff0c;而且版本…

以pycharm为例,生成Python项目所需要的依赖库/包文档:requirements.txt

平时我们在编写或者使用别人的Python项目时&#xff0c;往往会看到一个文档requirements.txt&#xff0c;该文档是描述一个Python项目中的第三方库的名称以及版本。本文介绍导出python当前项目依赖包requirements.txt的操作步骤。 方法一&#xff1a;如果每个项目有对应的虚拟…

Java零基础——Elasticsearch篇

1.Elasticsearch简介 Elasticsearch是一个基于Lucene的一个开源的分布式、RESTful 风格的搜索和数据分析引擎。Elasticsearch是用Java语言开发的&#xff0c;并作为Apache许可条款下的开放源码发布&#xff0c;是一种流行的企业级搜索引擎。Elasticsearch用于云计算中&#xf…

13. MySQL 日志

目录 错误日志 binlog日志 概述 日志格式 查询日志 慢查询日志 错误日志 错误日志是MySQL中最重要的日志之一&#xff0c;它记录了当mysqld启动和停止时&#xff0c;以及服务器在运行过程中发生任何严重错误时的相关信息。当数据库出现任何故障导致无法正常使用时&#…

用Rust刷LeetCode之26 删除有序数组中的重复项

26. 删除排序数组中的重复项[1] 难度: 简单 老的描述: 新的描述: 注意是 排序数组,非严格递增排列,即已经是排好序的,只不过有重复元素 func removeDuplicates(nums []int) int { if len(nums) 0 { return 0 } i : 0 for j : 1; j < len(nums); j { …

Kubernetes架构及核心部件

文章目录 1、Kubernetes集群概述1.1、概述1.2、通过声明式API即可 2、Kubernetes 集群架构2.1、Master 组件2.1.1、API Server2.1.2、集群状态存储2.1.3、控制器管理器2.1.4、调度器 2.2、Worker Node 组件2.2.1、kubelet2.2.2、容器运行时环境2.2.3、kube-proxy 2.3、图解架构…

AI隆重软件,AI原创文章隆重软件

随着信息量的急剧增加&#xff0c;许多写作者、网站管理员和内容创作者们纷纷感受到了文章降重的压力。原始文本的降重&#xff0c;需要保留关键信息的同时避免重复&#xff0c;这是一项既繁琐又耗时的任务。 改写软件的批量降重功能 147SEO改写软件在降重领域的卓越表现主要体…

PHP基础 - 注释变量

一. 语言开始标识 在PHP中,文件的开头需要使用语言开始标识来指定该文件是PHP代码。标识通常为"<?php",也可以是"<?",但建议使用"<?php"以确保代码的兼容性和可读性。 <?php // PHP代码从这里开始写 二. PHP注释 注释是用…

svn使用步骤

服务器端主要用来创建仓库&#xff0c;然后供客户端去访问与下载。 客户端&#xff1a; 图形化界面的使用&#xff1a;这里使用的是tortoise工具 1.创建一个文件夹作为自己的本地仓库目录 2.鼠标右键文件夹&#xff0c;在菜单中点击SVN checkout 3.找个图 这一步骤相当于git中…

nodejs+vue+微信小程序+python+PHP的基于大数据的家电销售分析系统设计与实现-计算机毕业设计推荐django

系统按照用户的实际需求开发而来&#xff0c;贴近生活。从管理员通过正确的账号的密码进入系统&#xff0c;可以使用相关的系统应用。管理员总体负责整体系统的运行维护&#xff0c;统筹协调。 系统整体模块设计&#xff1a;系统分为管理员和用户两大角色&#xff0c;系统管理员…

Linux 系统上配置 SSH 密钥

1. 生成 SSH 密钥 打开终端&#xff0c;运行以下命令来生成 SSH 密钥&#xff1a; ssh-keygen -t rsa -b 4096 -C "wqzbxhexample.com" 替换 "wqzbxhexample.com" 为你在 GitHub 注册时使用的邮箱地址。 2. 添加 SSH 密钥到 SSH 代理 运行以下命令来启…

贪心算法和动态规划

目录 一、简介 二、贪心算法案例&#xff1a;活动选择问题 1.原理介绍 三、动态规划案例&#xff1a;背包问题 1.原理介绍 四、贪心算法与动态规划的区别 五、总结 作者其他文章链接 正则表达式-CSDN博客 深入理解HashMap&#xff1a;Java中的键值对存储利器-CSDN博客…

知名的Mac系统清理软件CleanMyMac发布了最新的CleanMyMac X 4.14.5 破解版下载

最新版CleanMyMac X 让您的Mac焕然一新&#xff0c;时刻保持安全 CleanMyMac X是一款专业的Mac清理软件&#xff0c;可智能清理mac磁盘垃圾和多余语言安装包&#xff0c;快速释放电脑内存&#xff0c;轻松管理和升级Mac上的应用。同时CleanMyMac X可以强力卸载恶意软件&#x…

Arduino驱动MPX5700AP气压传感器(压力传感器)

目录 1、传感器特性 2、硬件原理图 3、控制器和传感器连线图 4、驱动程序 4.1、采集数据 4.2、校准传感器 MPX5700AP测量范围15~700kPa&#xff0c;支持I2C数字输出&#xff0c;可以根据已知气压值进行标定&#xff0c;可以快速、准确的测量管路或其他环境中的气压值。…

【数据结构】——二叉树功能

前言&#xff1a;我们前面已经了解了二叉树的一些概念&#xff0c;那么我们今天就来了解下二叉树的遍历实现和一些性质。 二叉树的遍历方式有三种&#xff1a;前序&#xff0c;中序&#xff0c;后序。 前序&#xff1a;先根节点&#xff0c;再左子树&#xff0c;最后右子树。 中…

如何用Qt配置git项目并上传Gitee

1.进入到Qt项目文件夹内&#xff0c;打开 “Git Bash Here” 2.初始化&#xff0c;在“Git Bash Here”中输入 git init 3.加入所有文件&#xff0c;在“Git Bash Here”中输入 git add . (需要注意&#xff0c;git add 后面还有一个点) 4.添加备注&#xff0c;git com…

蓝桥杯航班时间

蓝桥杯其他真题点这里&#x1f448; //飞行时间 - 时差 已过去的时间1 //飞行时间 时差 已过去的时间2 //两个式子相加会发现 飞行时间 两段时间差的和 >> 1import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader;public cl…

分类信息发布小程序效果如何

信息发布系统连接信息供需双方&#xff0c;打造信息聚合平台&#xff0c;用户可获取和发布需求信息、参与互动交流&#xff0c;适用于同城、社区交流、客户互动、业务员/经纪人发布信息场景。 制作分类信息小程序后&#xff0c;商家后台设置信息项&#xff0c;发布者填写内容发…
最新文章