tkinter缩放窗口和图像
当tkinter里的一个组件是图像时,如果允许缩放主窗口的同时,让图像也缩放,有时候是一种需求。
主要实现方法是bind一个回调函数。这里的例子是,图像上绘制了矩形框,当窗口被用鼠标缩放时,图像缩放,框也缩放。
# coding: utf-8 """ Demonstrates how to resizing tkinter windows and image on it https://cloud.tencent.com/developer/article/1430998 https://stackoverflow.com/questions/7299955/tkinter-binding-a-function-with-arguments-to-a-widget """ import tkinter as tk from PIL import Image, ImageTk import cv2 class App(tk.Tk): def __init__(self): super().__init__() self.lbPic = tk.Label(self, text='test', width=400, height=600) self.im_orig = cv2.imread('E:/data/VOC2007/JPEGImages/000001.jpg') self.xmin_orig = 8 self.ymin_orig = 12 self.xmax_orig = 352 self.ymax_orig = 498 cv2.rectangle( self.im_orig, pt1 = (self.xmin_orig, self.ymin_orig), pt2 = (self.xmax_orig, self.ymax_orig), color = (0, 255, 0), thickness = 2 ) self.im_orig = self.im_orig[:, :, ::-1] # bgr => rgb necessary tkim = ImageTk.PhotoImage(Image.fromarray(self.im_orig)) self.lbPic['image'] = tkim self.lbPic.image = tkim self.lbPic.bind('<Configure>', self.changeSize) self.lbPic.pack(fill=tk.BOTH, expand=tk.YES) def changeSize(self, event): im = cv2.resize(self.im_orig, (event.width, event.height)) tkim = ImageTk.PhotoImage(Image.fromarray(im)) self.lbPic['image'] = tkim self.lbPic.image = tkim def main(): app = App() app.title('缩放图像') app.mainloop() if __name__ == '__main__': main()
不过在MacOSX下,上述代码显示有问题。改成如下:
import tkinter as tk from PIL import Image, ImageTk import cv2 class App(tk.Tk): def __init__(self): super().__init__() self.geometry("800x600") self.rowconfigure(0, weight=1) self.columnconfigure(0, weight=1) self.lbPic = tk.Label(self, text='test', compound='center') self.im_orig = cv2.imread('/Users/chris/data/VOC2007/JPEGImages/000001.jpg') self.xmin_orig = 8 self.ymin_orig = 12 self.xmax_orig = 352 self.ymax_orig = 498 cv2.rectangle( self.im_orig, pt1 = (self.xmin_orig, self.ymin_orig), pt2 = (self.xmax_orig, self.ymax_orig), color = (0, 255, 0), thickness = 2 ) self.im_orig = self.im_orig[:, :, ::-1] # bgr => rgb necessary tkim = ImageTk.PhotoImage(Image.fromarray(self.im_orig)) self.lbPic['image'] = tkim self.lbPic.image = tkim self.lbPic.bind('<Configure>', self.changeSize) self.lbPic.grid(row=0, column=0, sticky=tk.NSEW) def changeSize(self, event): im = cv2.resize(self.im_orig, (event.width, event.height)) tkim = ImageTk.PhotoImage(Image.fromarray(im)) self.lbPic['image'] = tkim self.lbPic.image = tkim def main(): app = App() app.title('缩放图像') app.mainloop() if __name__ == '__main__': main()
Greatness is never a given, it must be earned.
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
2019-06-01 基于gtk的imshow:用stb_image读取图像并用gtk显示
2019-06-01 基于gtk的imshow:用gtk读取并显示图像
2019-06-01 用cmake构建gtk程序
2013-06-01 自己动手写一个霍夫变换检测直线(线段)