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()
本文为看恩吧原创文章,转载无需和我联系,但请注明来自knsay.com