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