使用 tkinter 版本8.6 来写一个bmp图片展示窗(允许滚动条上下滚动查看大图片),另点击展示窗中的图片时显示点击的坐标demo
时间: 2023-05-26 21:05:09 浏览: 46
下面是一个示例程序,展示了如何使用 tkinter 显示 BMP 图片并实现滚动和鼠标点击事件。
```python
import tkinter as tk
from tkinter import filedialog
from PIL import Image, ImageTk
class ImageViewer(tk.Frame):
def __init__(self, master=None):
super().__init__(master)
self.master = master
self.pack(fill=tk.BOTH, expand=tk.YES)
self.create_widgets()
def create_widgets(self):
self.canvas = tk.Canvas(self, bg='white')
self.canvas.pack(side=tk.LEFT, fill=tk.BOTH, expand=tk.YES)
self.scrollbar = tk.Scrollbar(self, orient=tk.VERTICAL, command=self.canvas.yview)
self.scrollbar.pack(side=tk.RIGHT, fill=tk.Y)
self.canvas.configure(yscrollcommand=self.scrollbar.set)
self.canvas.bind('<Configure>', self.resize_canvas)
self.canvas.bind('<Button-1>', self.on_canvas_click)
self.image = None
self.photo = None
def load_image(self, filename):
with open(filename, 'rb') as f:
header = f.read(14)
if header[:2] != b'BM':
raise ValueError('Not a BMP file')
size = header[2:6]
offset = header[10:14]
width = int.from_bytes(header[18:22], 'little')
height = int.from_bytes(header[22:26], 'little')
bpp = int.from_bytes(header[28:30], 'little')
if bpp != 24:
raise ValueError('Unsupported BMP format')
f.seek(int.from_bytes(offset, 'little'))
data = f.read()
self.image = Image.frombytes('RGB', (width, height), data)
self.photo = ImageTk.PhotoImage(self.image)
self.canvas.config(scrollregion=(0, 0, width, height))
self.canvas.create_image(0, 0, image=self.photo, anchor=tk.NW)
def resize_canvas(self, event):
self.canvas.config(scrollregion=self.canvas.bbox('all'))
def on_canvas_click(self, event):
if self.image is not None:
x, y = event.x, event.y
if 0 <= x < self.image.width and 0 <= y < self.image.height:
x, y = self.canvas.canvasx(x), self.canvas.canvasy(y)
print(f'Clicked at ({x}, {y})')
if __name__ == '__main__':
root = tk.Tk()
root.title('BMP Image Viewer')
viewer = ImageViewer(root)
menu = tk.Menu(root)
file_menu = tk.Menu(menu, tearoff=0)
file_menu.add_command(label='Open...', command=lambda: viewer.load_image(filedialog.askopenfilename(filetypes=[('BMP Files', '*.bmp')], initialdir='.')))
file_menu.add_separator()
file_menu.add_command(label='Exit', command=root.quit)
menu.add_cascade(label='File', menu=file_menu)
root.config(menu=menu)
root.mainloop()
```
程序的界面使用了 tkinter 的 Canvas,用于显示图片和实现滚动条。通过 PIL 库读取 BMP 文件,并将其转换为 Tkinter 的 PhotoImage 对象用于显示。在 Canvas 中注册了鼠标点击事件,当用户单击画布上的某个位置时,程序会将坐标转换为图片坐标,并输出到控制台上。
该程序包含一个菜单,可以选择打开 BMP 文件。注意:该程序仅支持 24 位深度的 BMP 文件。