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

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 Stata链式中介效应代码修改
  • ¥15 latex投稿显示click download
  • ¥15 请问读取环境变量文件失败是什么原因?
  • ¥15 在若依框架下实现人脸识别
  • ¥15 网络科学导论,网络控制
  • ¥100 安卓tv程序连接SQLSERVER2008问题
  • ¥15 利用Sentinel-2和Landsat8做一个水库的长时序NDVI的对比,为什么Snetinel-2计算的结果最小值特别小,而Lansat8就很平均
  • ¥15 metadata提取的PDF元数据,如何转换为一个Excel
  • ¥15 关于arduino编程toCharArray()函数的使用
  • ¥100 vc++混合CEF采用CLR方式编译报错