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 = photolabel.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 osclass ImageViewer:def __init__(self, root):self.root = rootself.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 = 0self.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 = photodef 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()

OK!

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

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

相关文章

【改进YOLOv8】融合可扩张残差(DWR)注意力模块的小麦病害检测系统

1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 研究背景与意义&#xff1a; 随着计算机视觉技术的快速发展&#xff0c;深度学习在图像识别和目标检测领域取得了巨大的突破。其中&#xff0c;YOLO&#xff08;You Only Look O…

TruLens RAG Triad 学习

TruLens RAG Triad 学习 0. 背景1. RAG 三元组2. TruLens 快速入门2-1. 安装依赖2-2. 初始化 OpenAI 认证信息2-3. 获取数据2-4. 创建向量存储2-5. 从头构建自定义 RAG2-6. 设置反馈函数2-7. 构建应用程序2-8. 运行应用程序0. 背景 近年来,RAG 架构已成为为大型语言模型 (LLM…

Nexus搭建npm私库(角色管理、上传脚本)

安装Nexus 官网下载 https://www.sonatype.com/products/sonatype-nexus-oss-download 进入官网下载&#xff0c;最新下载方式需要输入个人信息才能下载了 选择对应的系统进行下载 Windows 推荐也下载 UNIX 版本&#xff08;Windows 版本配置比较难改&#xff09; 如果没有下…

Qt 中的窗口类

目录 QWidget 设置父对象 窗口位置 测试代码 窗口尺寸 窗口标题和图标 信号 槽函数 QDialog 常用API QDialog的子类 QMessageBox QFileDialog QFontDialog QFontDialog类的静态API QColorDialog 颜色类 QColor 静态API函数 测试代码 QInputDialog 静态函数…

GPT4停止订阅付费了怎么办? 怎么升级ChatGPT plus?提供解决方案

11月中旬日OpenAI 暂时关闭所有的升级入口之后&#xff0c;很多小伙伴就真的在排队等待哦。其实有方法可以绕开排队&#xff0c;直接付费订阅升级GPT的。赶紧用起来立马“插队”成功&#xff01;亲测~~~ 一、登录ChatGPT账号 1、没有账号可以直接注册一个&#xff0c;流程超级…

前端使用视频作为背景图的方法

实现思路 通过 video source 引入视频&#xff0c;并对视频播放属性进行设置&#xff0c;再通过 css 使视频覆盖背景即可。 代码 <!DOCTYPE html> <html> <head> <meta charset"utf-8"> <title>有开发问题可联系作者</title>…

学习git后,真正在项目中如何使用?

文章目录 前言下载和安装Git克隆远程仓库PyCharm链接本地Git创建分支修改项目工程并提交到本地仓库推送到远程仓库小结 前言 网上学习git的教程&#xff0c;甚至还有很多可视化很好的git教程&#xff0c;入门git也不是什么难事。但我发现&#xff0c;当我真的要从网上克隆一个…

SQL事务的开启,提交和回滚

在处理数据库数据的时候会出现一种情况就是我们删除两个关联的表其中一个表的信息&#xff0c;另一个表也需要改动&#xff0c;但是我们SQL语句在同时更改两个表的同时&#xff0c;难免会出现一个表修改成功&#xff0c;另一个出现错误&#xff0c;这时候表与表之间就会出现矛盾…

webrtc网之sip转webrtc

OpenSIP是一个开源的SIP&#xff08;Session Initiation Protocol&#xff09;服务器&#xff0c;它提供了一个可扩展的基础架构&#xff0c;用于建立、终止和管理VoIP&#xff08;Voice over IP&#xff09;通信会话。SIP是一种通信协议&#xff0c;用于建立、修改和终止多媒体…

geolife 笔记:将所有轨迹放入一个DataFrame

单条轨迹的处理&#xff1a;geolife笔记&#xff1a;整理处理单条轨迹-CSDN博客 1 加载数据 import pandas as pd import numpy as np import datetime as dt import osdata_dir Geolife Trajectories 1.3/Data/ 1.1 列出所有文件夹 dirlist os.listdir(data_dir) dirlist…

Esxi登录超时:“由于不活动超时,您已被注销“,修改UserVars.HostClientSessionTimeout为0永不超时

Esxi登录超时:“由于不活动超时&#xff0c;您已被注销”,修改UserVars.HostClientSessionTimeout为0永不超时 UserVars.HostClientSessionTimeout0永不超时 Esxi网页登录后,一段时间不操作就会被注销 提示: 由于不活动超时&#xff0c;您已被注销 主机→管理→系统→高级设…

【linux】查看CPU和内存信息

之前咱们一起学习了查看内存的和CPU的命令。 ​mpstat &#xff1a; 【linux】 mpstat 使用 uptime&#xff1a;【Linux】 uptime命令使用 CPU的使用率&#xff1a;【linux】查看CPU的使用率 nmon &#xff1a;【linux】nmon 工具使用 htop &#xff1a;【linux】htop 命令…

文件格式对齐、自定义快捷键、idea

文件格式对齐 Shift Alt F 自动格式化代码的快捷键&#xff08;如何配置自动格式化&#xff09; 日常编码必备idea快捷键 [VS Code] 入门-自定键盘快捷键 文件格式对齐 文件格式对齐通常是通过编辑器或IDE提供的快捷键或命令完成的。以下是一些常见编辑器和IDE中进行文件…

快速认识什么是:Docker

Docker&#xff0c;一种可以将软件打包到容器中并在任何环境中可靠运行的工具。但什么是容器以及为什么需要容器呢&#xff1f;今天就来一起学快速入门一下Docker吧&#xff01;希望本文对您有所帮助。 假设您使用 Cobol 构建了一个在某种奇怪风格的 Linux 上运行的应用程序。您…

InnoDB Architecture MySQL 5.7 vs 8.0

innodb-architecture-5-7 innodb-architecture-8-0 图片均来源于MySQL官网

【Vue】props与$emit的简单理解

Vue组件 组件是Vue中不可或缺的一个功能&#xff0c;它可以将一个页面划分为多个独立的内部组件&#xff0c;方便代码的管理。 定义组件 <body><div id"App"><bcomp></bcomp></div><script>const app Vue.createApp({})cons…

【2023传智杯-新增场次】第六届传智杯程序设计挑战赛AB组-ABC题复盘解题分析详解【JavaPythonC++解题笔记】

本文仅为【2023传智杯-第二场】第六届传智杯程序设计挑战赛-题目解题分析详解的解题个人笔记,个人解题分析记录。 本文包含:第六届传智杯程序设计挑战赛题目、解题思路分析、解题代码、解题代码详解 文章目录 一.前言二.赛题题目A题题目-B题题目-C题题目-二.赛题题解A题题解-…

Servlet should have a mapping

第一种可能&#xff1a; 你就是没写Servlet <servlet><servlet-name>SpringMVC</servlet-name><servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class><!-- 配置springMVC需要加载的配置文件--><init-par…

Android studio生成二维码

1.遇到的问题 需要生成一个二维码&#xff0c;可以使用zxing第三方组件&#xff0c;增加依赖。 //生成二维码 implementation com.google.zxing:core:3.4.1 2.代码 展示页面 <ImageViewandroid:id"id/qrCodeImageView"android:layout_width"150dp"an…

【Linux】echo命令使用

​echo命令 功能是在显示器上显示一段文字&#xff0c;一般起到一个提示的作用。此外&#xff0c;也可以直接在文件中写入要写的内容。也可以用于脚本编程时显示某一个变量的值&#xff0c;或者直接输出指定的字符串。 ​ 著者 由布莱恩福克斯和切特拉米撰写。 语法 echo […