自制简单的图片查看器(python)

图片格式:支持常见的图片格式(JPG、PNG、BMP、GIF)。

python 复制代码
import os
import tkinter as tk
from tkinter import filedialog, messagebox
from PIL import Image, ImageTk

class ImageViewer:
    def __init__(self, root):
        self.root = root
        self.root.title("图片查看器")
        self.root.geometry("800x600")
        self.root.configure(bg="#2E3440")  # 设置背景颜色

        # 当前图片路径
        self.current_image_path = None
        self.image = None
        self.photo = None
        self.scale_factor = 1.0
        self.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_path
            self.load_image()

    def load_image(self):
        """加载图片"""
        try:
            self.image = Image.open(self.current_image_path)
            self.scale_factor = 1.0
            self.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.size

            if self.is_auto_scaling:
                # 自动缩放时计算缩放比例
                width_ratio = canvas_width / image_width
                height_ratio = canvas_height / image_height
                self.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.2
            self.update_image()

    def zoom_out(self):
        """缩小图片"""
        if self.image:
            self.is_auto_scaling = False  # 手动缩放时禁用自动缩放
            self.scale_factor /= 1.2
            self.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() 
相关推荐
查理零世10 分钟前
【蓝桥杯集训·每日一题2025】 AcWing 6134. 哞叫时间II python
python·算法·蓝桥杯
紫雾凌寒19 分钟前
解锁机器学习核心算法|神经网络:AI 领域的 “超级引擎”
人工智能·python·神经网络·算法·机器学习·卷积神经网络
sun lover32 分钟前
conda简单命令
python·conda
服务端相声演员41 分钟前
Oracle JDK、Open JDK zulu下载地址
java·开发语言
Mike_188702783511 小时前
1688代采下单API接口使用指南:实现商品采集与自动化下单
前端·python·自动化
19岁开始学习1 小时前
Go学习-入门
开发语言·学习·golang
青铜念诗1 小时前
python脚本文件设置进程优先级(在.py文件中实现)
开发语言·python
一念春风1 小时前
C# 背景 透明 抗锯齿 (效果完美)
开发语言·c#
Igallta_8136222 小时前
【小游戏】C++控制台版本俄罗斯轮盘赌
c语言·开发语言·c++·windows·游戏·游戏程序
Dyan_csdn2 小时前
【Python项目】文本相似度计算系统
开发语言·python