SiriBen 2022-05-10 16:58 采纳率: 25%
浏览 359
已结题

python:tkinter中convas自定义改变图片大小,急!

用tkinter做了个小玩意,加上convas添加上图片,可以鼠标在画布内任意拖动,这些问题都一切正常,现在考虑到图片的大小问题,可能会随着使用者弄不同的图片选择不同的大小,所以这里希望能针对图片能自定义调整大小,例如到时在tkinter上加一个滑块来调整

创建图片的代码如下:

img2 = Image.open(filePath2)
img2 = img2.resize((int(img2.size[0] * 0.2), int(img2.size[1] * 0.2)), Image.ANTIALIAS)
#img2 = img.transpose(Image.FLIP_LEFT_RIGHT)
photo2 = ImageTk.PhotoImage(img2)
cv.create_image(w/2, h/2, image=photo2)

运行的结果如下:

img

希望达到的效果能在添加的图片,选择图片后,通过按钮或滑块触发一个事件,来放大或缩小,比如点一下,放大10%,点另一个按钮缩小10%
原理其实我倒是理解 ,但是convas中创建图片是通过Image来控制的大小,然后放到convas中去,但这里到底应该是直接调整图片大小还是画布大小呢?如果是只调整图片,那画布大小不变的话,图片大小会超出画布。最主要的还是不知道如何操作convas和里面的图片,网上找了半天没找到详细的convas的文档

  • 写回答

2条回答 默认 最新

  • 请叫我问哥 Python领域新星创作者 2022-05-10 19:02
    关注

    可以的,要通过绑定event来实现,而且要继承类,event绑定类方法,改掉canvas的图片,不然图片每次会被刷新掉。
    做个了小例子:

    import tkinter as tk
    from PIL import Image, ImageTk
    
    class root(tk.Tk):
        def __init__(self, *args, **kwargs):
            super().__init__(*args, **kwargs)
            self.cv = tk.Canvas(self)
            self.cv.pack()
            self.img = ImageTk.PhotoImage(Image.open(r'C:\Code\image\example.png'))
            self.img_width = self.img.width()
            self.img_height = self.img.height()
            self.cv_img = self.cv.create_image(200,100,image=self.img)
            self.btn1 = tk.Button(text='<<')
            self.btn2 = tk.Button(text='>>')
            self.btn1.pack(side='left')
            self.btn2.pack(side='right')
            self.btn1.bind('<Button-1>',self.smaller)
            self.btn2.bind('<Button-1>',self.bigger)
    
        def smaller(self,event):
            self.img_width -= 10
            self.img_height -= 10
            self.img = ImageTk.PhotoImage(Image.open(r'C:\Code\image\example.png').resize((self.img_width,self.img_height),Image.ANTIALIAS))
            self.cv.itemconfig(self.cv_img,image=self.img)
    
        def bigger(self,event):
            self.img_width += 10
            self.img_height += 10
            self.img = ImageTk.PhotoImage(Image.open(r'C:\Code\image\example.png').resize((self.img_width,self.img_height),Image.ANTIALIAS))
            self.cv.itemconfig(self.cv_img,image=self.img)
        
    win=root()
    win.mainloop()
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 5月26日
  • 已采纳回答 5月18日
  • 创建了问题 5月10日

悬赏问题

  • ¥15 Attention is all you need 的代码运行
  • ¥15 一个服务器已经有一个系统了如果用usb再装一个系统,原来的系统会被覆盖掉吗
  • ¥15 使用esm_msa1_t12_100M_UR50S蛋白质语言模型进行零样本预测时,终端显示出了sequence handled的进度条,但是并不出结果就自动终止回到命令提示行了是怎么回事:
  • ¥15 前置放大电路与功率放大电路相连放大倍数出现问题
  • ¥30 关于<main>标签页面跳转的问题
  • ¥80 部署运行web自动化项目
  • ¥15 腾讯云如何建立同一个项目中物模型之间的联系
  • ¥30 VMware 云桌面水印如何添加
  • ¥15 用ns3仿真出5G核心网网元
  • ¥15 matlab答疑 关于海上风电的爬坡事件检测