自制简单的图片查看器(python)
图片格式:支持常见的图片格式(JPG、PNG、BMP、GIF)。
import os
import tkinter as tk
from tkinter import filedialog, messagebox
from PIL import Image, ImageTkclass ImageViewer:def __init__(self, root):self.root = rootself.root.title("图片查看器")self.root.geometry("800x600")self.root.configure(bg="#2E3440") # 设置背景颜色# 当前图片路径self.current_image_path = Noneself.image = Noneself.photo = Noneself.scale_factor = 1.0self.is_auto_scaling = True # 是否自动缩放# 创建界面self.create_widgets()def create_widgets(self):"""创建界面组件"""# 顶部工具栏toolbar = tk.Frame(self.root, bg="#3B4252") # 工具栏背景颜色toolbar.pack(side=tk.TOP, fill=tk.X)# 打开按钮btn_open = tk.Button(toolbar, text="打开", command=self.open_image, bg="#81A1C1", fg="white", activebackground="#5E81AC", activeforeground="white", font=("微软雅黑", 12))btn_open.pack(side=tk.LEFT, padx=5, pady=5)# 放大按钮btn_zoom_in = tk.Button(toolbar, text="放大", command=self.zoom_in, bg="#81A1C1", fg="white", activebackground="#5E81AC", activeforeground="white", font=("微软雅黑", 12))btn_zoom_in.pack(side=tk.LEFT, padx=5, pady=5)# 缩小按钮btn_zoom_out = tk.Button(toolbar, text="缩小", command=self.zoom_out, bg="#81A1C1", fg="white", activebackground="#5E81AC", activeforeground="white", font=("微软雅黑", 12))btn_zoom_out.pack(side=tk.LEFT, padx=5, pady=5)# 图片显示区域self.canvas = tk.Canvas(self.root, bg="#2E3440", highlightthickness=0)self.canvas.pack(fill=tk.BOTH, expand=True)# 绑定窗口大小变化事件self.root.bind("<Configure>", self.on_window_resize)def open_image(self):"""打开图片"""file_path = filedialog.askopenfilename(title="选择图片",filetypes=[("图片文件", "*.jpg *.jpeg *.png *.bmp *.gif")])if file_path:self.current_image_path = file_pathself.load_image()def load_image(self):"""加载图片"""try:self.image = Image.open(self.current_image_path)self.scale_factor = 1.0self.is_auto_scaling = True # 加载图片时启用自动缩放self.update_image()except Exception as e:messagebox.showerror("错误", f"无法加载图片: {str(e)}")def update_image(self):"""更新显示的图片"""if self.image:# 计算缩放后的尺寸canvas_width = self.canvas.winfo_width()canvas_height = self.canvas.winfo_height()image_width, image_height = self.image.sizeif self.is_auto_scaling:# 自动缩放时计算缩放比例width_ratio = canvas_width / image_widthheight_ratio = canvas_height / image_heightself.scale_factor = min(width_ratio, height_ratio)# 缩放图片width = int(image_width * self.scale_factor)height = int(image_height * self.scale_factor)resized_image = self.image.resize((width, height), Image.Resampling.LANCZOS)self.photo = ImageTk.PhotoImage(resized_image)# 清除画布并显示图片self.canvas.delete("all")self.canvas.create_image(canvas_width // 2,canvas_height // 2,anchor=tk.CENTER,image=self.photo)def zoom_in(self):"""放大图片"""if self.image:self.is_auto_scaling = False # 手动缩放时禁用自动缩放self.scale_factor *= 1.2self.update_image()def zoom_out(self):"""缩小图片"""if self.image:self.is_auto_scaling = False # 手动缩放时禁用自动缩放self.scale_factor /= 1.2self.update_image()def on_window_resize(self, event):"""窗口大小变化时自动调整图片大小"""if self.image and self.is_auto_scaling:self.update_image()if __name__ == "__main__":root = tk.Tk()app = ImageViewer(root)root.mainloop()
相关文章:
自制简单的图片查看器(python)
图片格式:支持常见的图片格式(JPG、PNG、BMP、GIF)。 import os import tkinter as tk from tkinter import filedialog, messagebox from PIL import Image, ImageTkclass ImageViewer:def __init__(self, root):self.root rootself.root.…...
RD-搭建测试环境
测试团队职责 环境验证:确保开发部署的测试环境可访问,页面/接口无阻塞问题; 配置检查**:核对数据库连接、接口域名、HT证书等关键配置; 数据准备**:导入基线数据,隔离测试与生产数据࿱…...
从零搭建微服务项目Base(第5章——SpringBoot项目LogBack日志配置+Feign使用)
前言: 本章主要在原有项目上添加了日志配置,对SpringBoot默认的logback的配置进行了自定义修改,并详细阐述了xml文件配置要点(只对日志配置感兴趣的小伙伴可选择直接跳到第三节),并使用Feign代替原有RestT…...
【深度学习】使用飞桨paddle实现波士顿房价预测任务
使用飞桨实现波士顿房价预测任务 由于开始学习深度学习,因此每次开始都熟悉一下深度学习模型的基本步骤: 在之前的学习中,我们学习了使用Python和NumPy实现波士顿房价预测任务的方法,本章我们将尝试使用飞桨paddle重写房价预测任…...
钉钉多维表:数据管理与协作的新篇章
在当今数字化时代,数据的高效管理和团队协作已成为企业竞争力的关键因素之一。钉钉多维表,作为一款基于钉钉平台的数据协作管理工具,正以其独特的功能和优势,引领着数据管理与协作的新潮流。本文将为您全面解析钉钉多维表的定义、特点、功能亮点、应用场景以及如何使用,让您轻松…...
高级推理的多样化推理与验证
25年2月来自波士顿大学、NotBadMath.AI、谷歌、哥伦比亚大学、MIT、Intuit公司和斯坦福大学的论文“Diverse Inference and Verification for Advanced Reasoning”。 OpenAI o1、o3 和 DeepSeek R1 等推理 LLM 在数学和编码方面取得重大进展,但仍发现 IMO 组合问题…...
深入理解 MySQL 8 C++ 源码:SELECT MOD(MONTH(NOW()), 2) 的函数执行过程
MySQL 作为最流行的关系型数据库之一,其内部实现机制一直是开发者探索的热点。本文将以一条简单的 SQL 查询 SELECT MOD(MONTH(NOW()), 2) 为例,深入分析 MySQL 8 源码中内置函数 MOD、MONTH 和 NOW 的执行过程,揭示其底层实现逻辑。 一、SQL…...
【算法系列】leetcode1419 数青蛙 --模拟
一、题目 二、思路 模拟⻘蛙的叫声。 当遇到 r o a k 这四个字符的时候,我们要去看看每⼀个字符对应的前驱字符,有没有⻘蛙叫出来。如果有⻘蛙叫出来,那就让这个⻘蛙接下来喊出来这个字符;如果没有则为异常字符串,直接…...
蓝桥杯 Java B 组之背包问题、最长递增子序列(LIS)
Day 4:背包问题、最长递增子序列(LIS) 📖 一、动态规划(Dynamic Programming)简介 动态规划是一种通过将复杂问题分解成更小的子问题来解决问题的算法设计思想。它主要用于解决具有最优子结构和重叠子问题…...
Git如何将一个分支的内容同步到另一个分支
在 Git 中,可以通过多种方法将一个分支的内容同步到另一个分支。以下是几种常用的方法: 1. 使用 merge 命令 这是最常见的方法,将一个分支的更改合并到另一个分支。 # 切换到目标分支 git checkout target-branch# 合并源分支的内容 git m…...
[C#]C# winform部署yolov12目标检测的onnx模型
yolov12官方框架:github.com/sunsmarterjie/yolov12 【测试环境】 vs2019 netframework4.7.2 opencvsharp4.8.0 onnxruntime1.16.3 【效果展示】 【调用代码】 using System; using System.Collections.Generic; using System.ComponentModel; using System.…...
51c大模型~合集69
我自己的原文哦~ https://blog.51cto.com/whaosoft/12221979 #7项基于SAM万物分割模型研究工作 1、CC-SAM: SAM with Cross-feature Attention and Context for Ultrasound Image Segmentation #ECCV2024 #SAM #图像分割 #医学图像 Segment Anything Model (SAM) 在自…...
2025寒假周报4
2025寒假天梯训练7-CSDN博客 眨眼间寒假训练就告一段落了,准备回校继续战斗了。这周练了3场OI赛制的篮球杯,感觉非常糟糕,不像天梯赛,天梯赛打起来非常舒适顺畅,一直都不喜欢OI赛制,打着非常不稳定..还需要…...
自学Java-AI结合GUI开发一个石头迷阵的游戏
自学Java-AI结合GUI开发一个石头迷阵的游戏 准备环节1、创建石头迷阵的界面2、打乱顺序3、控制上下左右移动4、判断是否通关5、统计移动步骤,重启游戏6、拓展问题 准备环节 技术: 1、GUI界面编程 2、二维数组 3、程序流程控制 4、面向对象编程 ∙ \bulle…...
buuctf-[极客大挑战 2019]Knife题解
一个很简单的web题,进入界面 网页名还加白给的shell,并且给的提示也很明显,给了一个一句话木马再加上菜刀,很怀疑是一个webshell题,那么直接打开蚁剑测试连接拿shell 用提示的一句话木马的密码,测试链接发现…...
Spring MVC 对象转换器:初级开发者入门指南
Spring MVC 对象转换器:初级开发者入门指南 为什么需要对象转换器? 在 Web 应用中,我们经常需要处理不同类型的对象。例如:前端数据到后端对象 :用户通过表单提交的数据通常是HttpServletRequest 对象,我们…...
语音直播交友app出海:语音直播交友系统软件源码搭建国际化发展技术层面分析
随着移动互联网的普及和全球社交需求的增长以及国内如火如荼的Ai大模型引起的全球发展热潮,语音直播软件出海成为了具有巨大发展潜力的业务领域。以下是一些关键的技术方向,将为语音直播软件在国际市场的成功推广及搭建合作奠定基础。 通信技术 实时语音…...
Web Scraper,强大的浏览器爬虫插件!
Web Scraper是一款功能丰富的浏览器扩展爬虫工具,有着直观的图形界面,无需编写代码即可自定义数据抓取规则,高效地从网页中提取结构化数据,而且它支持灵活的数据导出选项,广泛应用于电商监控、内容聚合、市场调研等多元…...
EasyRTC:基于WebRTC与P2P技术,开启智能硬件音视频交互的全新时代
在数字化浪潮的席卷下,智能硬件已成为我们日常生活的重要组成部分,从智能家居到智能穿戴,从工业物联网到远程协作,设备间的互联互通已成为不可或缺的趋势。然而,高效、低延迟且稳定的音视频交互一直是智能硬件领域亟待…...
go 定时任务 gocron timer
选型推荐(DeepSeek) 简单任务调度: 推荐使用 cron 或 gocron,它们轻量且易用。 复杂任务调度: 推荐使用 go-quartz,支持任务依赖和持久化。 分布式任务调度: 推荐使用 asynq,基于 Redis 实现,适合分布式…...
uni-app x 中组件宽高使用百分比单位的问题
1. uni-app x 中组件宽高使用百分比单位的问题 关于 uni-app x 中组件宽高使用百分比单位的问题,建议如下: 1.1. 建议使用 flex:1 替代百分比 在 uni-app x 中,官方推荐尽量使用 px 配合 flex:1 来实现自适应布局,而非百分比单位…...
从零部署Evo AI:开源智能体平台架构解析与生产实践指南
1. 项目概述:一个开源的AI智能体构建与管理平台如果你正在寻找一个能够将不同的大语言模型、工具和协议整合在一起,用来构建和编排复杂AI智能体的平台,那么Evo AI值得你花时间深入了解。我最近花了几周时间,从零开始部署、配置并深…...
HPH核心构造详解:三大系统一图看懂
若你关心过今年4月20日至24日于德国举行的2026年汉诺威工业博览会,你或许会留意到一种显著的趋向,工业AI正全方位嵌入工业体系的整个流程,全球工业制造正加快朝着智能化、精密化方向迈进。不管是人形机器人内部的液压驱动系统,还是…...
408考研避坑指南:我踩过的那些“弯路”(教材、网课、题海战术)
408考研避坑指南:那些让我效率翻倍的实战经验 备考408计算机专业基础综合的同学们,一定都听过"教材为王"、"题海战术"、"名师必跟"这些老生常谈的建议。但作为一个从低效复习中挣扎出来的过来人,我想说&#x…...
给FGUI编辑器加点料:手把手教你用Lua写一个自定义Inspector面板
给FGUI编辑器加点料:手把手教你用Lua写一个自定义Inspector面板 在UI开发领域,效率工具的价值往往被严重低估。当你第20次重复点击相同的属性面板,或是需要在不同组件间来回切换检查参数时,一个量身定制的Inspector面板能节省的时…...
AI短视频一键生成系统源码,对接Sora2、可灵、即梦等模型,实现低成本影视级短剧生产
温馨提示:文末有资源获取方式一、市场背景与技术选型根据最新行业数据,2025年国内短剧企业已近10万家,上半年市场规模突破600亿。随着Sora2、可灵、即梦等AI视频模型的快速迭代,传统影视创作的专业壁垒正在被打破。一套完整的AI短…...
从‘接口危机’到‘优雅扩展’:一个真实项目案例带你理解JDK8接口新特性
从‘接口危机’到‘优雅扩展’:一个真实项目案例带你理解JDK8接口新特性 在金融支付系统的迭代过程中,我们曾面临一个典型的技术困境:核心支付接口需要新增风控校验功能,但该接口已被数十个第三方支付渠道实现。按照传统做法&…...
终极指南:5步掌握Windows驱动管理神器DriverStore Explorer
终极指南:5步掌握Windows驱动管理神器DriverStore Explorer 【免费下载链接】DriverStoreExplorer Driver Store Explorer 项目地址: https://gitcode.com/gh_mirrors/dr/DriverStoreExplorer 你是否曾因为Windows系统越来越慢而烦恼?是否发现C盘…...
ANSYS Workbench冲压仿真新手避坑:从材料定义到收敛设置的保姆级教程
ANSYS Workbench冲压仿真新手避坑指南:从材料定义到收敛设置的实战精要 第一次打开ANSYS Workbench进行冲压成形仿真时,面对密密麻麻的参数界面,大多数新手都会感到手足无措。材料定义应该选择哪种模型?接触设置中的法向刚度因子取…...
2026实战指南:如何用智能体实现药品不良反应报告的自动录入?
在2026年4月的今天,全球医疗人工智能领域已步入“智能体(Agent)爆发期”。根据2026年4月24日的最新行业动态,从底层架构的治理工具发布到垂直领域的成药性优化智能体,AI在医疗服务终端的应用已从简单的辅助诊疗演变为复…...
