python实现图片查看器,能设置置顶显示

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

class ImageViewer:
    def __init__(self, root):
        self.root = root
        self.root.title("图片查看器")
        self.root.geometry("620x210")
        
        # 初始化变量
        self.image_path = None
        self.tk_image = None
        self.is_topmost = False
        
        # 创建UI
        self.create_widgets()
        
    def create_widgets(self):
        # 创建菜单栏
        menubar = tk.Menu(self.root)
        
        # 文件菜单
        file_menu = tk.Menu(menubar, tearoff=0)
        file_menu.add_command(label="打开图片", command=self.open_image)
        file_menu.add_separator()
        file_menu.add_command(label="退出", command=self.root.quit)
        menubar.add_cascade(label="文件", menu=file_menu)
        
        # 窗口菜单
        window_menu = tk.Menu(menubar, tearoff=0)
        window_menu.add_command(label="设置位置", command=self.set_position)
        window_menu.add_checkbutton(
            label="置顶显示", 
            command=self.toggle_topmost,
            variable=tk.BooleanVar(value=self.is_topmost)
        )
        menubar.add_cascade(label="窗口", menu=window_menu)
        
        self.root.config(menu=menubar)
        
        # 创建图片显示区域
        self.canvas_frame = tk.Frame(self.root)
        self.canvas_frame.pack(fill=tk.BOTH, expand=True, padx=10, pady=10)
        
        self.canvas = tk.Canvas(self.canvas_frame, bg="gray")
        self.canvas.pack(fill=tk.BOTH, expand=True)
        
        # 添加滚动条
        scrollbar_x = tk.Scrollbar(self.canvas_frame, orient=tk.HORIZONTAL, command=self.canvas.xview)
        scrollbar_y = tk.Scrollbar(self.canvas_frame, orient=tk.VERTICAL, command=self.canvas.yview)
        self.canvas.configure(xscrollcommand=scrollbar_x.set, yscrollcommand=scrollbar_y.set)
        
        scrollbar_x.pack(side=tk.BOTTOM, fill=tk.X)
        scrollbar_y.pack(side=tk.RIGHT, fill=tk.Y)
        
        # 初始提示
        self.canvas.create_text(280, 100, text="请打开一张图片", font=("Arial", 14))
        
    def open_image(self):
        """打开图片文件"""
        file_path = filedialog.askopenfilename(
            title="选择图片",
            filetypes=[("图片文件", "*.png;*.jpg;*.jpeg;*.bmp;*.gif")]
        )
        
        if file_path and os.path.exists(file_path):
            self.image_path = file_path
            self.root.title(f"图片查看器 - {os.path.basename(file_path)}")
            self.display_image()
    
    def display_image(self):
        """在画布上显示图片"""
        if not self.image_path:
            return
            
        # 清除画布
        self.canvas.delete("all")
        
        # 打开图片并调整大小以适应窗口
        try:
            image = Image.open(self.image_path)
            
            # 获取窗口可用大小
            window_width = self.canvas_frame.winfo_width()
            window_height = self.canvas_frame.winfo_height()
            
            # 如果窗口还没显示,使用默认大小
            if window_width <= 1:
                window_width = 620
            if window_height <= 1:
                window_height = 160
                
            # 计算调整后的尺寸,保持比例
            image.thumbnail((window_width, window_height))
            
            # 转换为Tkinter可用的图片格式
            self.tk_image = ImageTk.PhotoImage(image)
            
            # 在画布上显示图片
            image_id = self.canvas.create_image(0, 0, anchor=tk.NW, image=self.tk_image)
            
            # 配置滚动区域
            self.canvas.config(scrollregion=self.canvas.bbox("all"))
            
        except Exception as e:
            self.canvas.create_text(280, 100, text=f"无法显示图片: {str(e)}", font=("Arial", 12), fill="red")
    
    def set_position(self):
        """设置窗口位置"""
        try:
            x = simpledialog.askinteger("窗口位置", "请输入X坐标:", minvalue=0)
            if x is None:  # 用户取消
                return
                
            y = simpledialog.askinteger("窗口位置", "请输入Y坐标:", minvalue=0)
            if y is None:  # 用户取消
                return
                
            self.root.geometry(f"+{x}+{y}")
        except Exception as e:
            tk.messagebox.showerror("错误", f"设置位置失败: {str(e)}")
    
    def toggle_topmost(self):
        """切换窗口置顶状态"""
        self.is_topmost = not self.is_topmost
        self.root.attributes("-topmost", self.is_topmost)
        
    def on_resize(self, event):
        """窗口大小改变时重新显示图片"""
        if self.image_path:
            self.display_image()

if __name__ == "__main__":
    root = tk.Tk()
    app = ImageViewer(root)
    # 绑定窗口大小改变事件
    root.bind("<Configure>", app.on_resize)
    root.mainloop()


sp.png

打赏

看恩吧
网站不承担任何有关评论的责任
  • 最新评论
  • 总共条评论
取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦