tkinter添加label后鼠标事件无法实现


import tkinter
import tkinter.filedialog
import os
from pydoc import text

from PIL import ImageGrab, ImageTk
from time import sleep
from tkinter import *
from tkinter import StringVar, IntVar
from cProfile import label
from distutils import command

class Grab(Canvas):
    def __init__(self,master=None):
        super().__init__()
        self.sel = None
        self.master = master
        # 定义鼠标当前位置的前一点
        self.X = self.Y = -10
        self.lastDraw = 1
        # 绑定鼠标事件
        self.bind('<B1-Motion>', self.move)
        self.bind('<Button-1>', self.start)
        self.bind('<ButtonRelease-1>', self.end)
        self.pack(fill=BOTH, expand=YES)


    def start(self, event):
        self.X = event.x
        self.Y = event.y
        # 开始截图
        self.sel = True

    def move(self, event):
        if not self.sel:
            return
        # 删除刚画完的图形,要不然鼠标移动的时候是黑乎乎的一片矩形
        self.delete(self.lastDraw)
        self.lastDraw = self.create_rectangle(self.X, self.Y, event.x, event.y, outline='black')

    def end(self, event):
        self.sel = False
        self.delete(self.lastDraw)
        sleep(0.1)
        # 考虑鼠标左键从右下方按下而从左上方抬起的截图
        myleft, myright = sorted([self.X, event.x])
        mytop, mybottom = sorted([self.Y, event.y])
        self.selectPosition = (myleft, myright, mytop, mybottom)
        pic = ImageGrab.grab((myleft + 1, mytop + 1, myright, mybottom))
        # 弹出保存截图对话框
        fileName = tkinter.filedialog.asksaveasfilename(title='保存截图', filetypes=[('JPG files', '*.jpg')])
        if fileName:
            pic.save(fileName + '.jpg')

if __name__=="__main__":
    root = Tk()
    # 窗口大小
    root.geometry('1000x500')
    photo = ImageTk.PhotoImage(file='C:/Users/13728/Desktop/chenwanyi/photo/微信截图_20220402212828.png'),
    label = Label(root, image=photo)
    label.pack()
    g=Grab(root)
    root.mainloop()

在这最后几行添加图片,添加之后鼠标事件就实现不了了,拉取框拉不出来,是哪里出了问题呢?

你添加label后点击的就是label了,不是点击Canvas
应该是把图片载入到Canvas中吧
你题目的解答代码如下:

import tkinter
import tkinter.filedialog
import os
from pydoc import text

from PIL import ImageGrab, ImageTk
from time import sleep
from tkinter import *
from tkinter import StringVar, IntVar
from cProfile import label
from distutils import command

class Grab(Canvas):
    def __init__(self,master=None):
        super().__init__()
        self.sel = None
        self.master = master
        # 定义鼠标当前位置的前一点
        self.X = self.Y = -10
        self.lastDraw = 1
        # 绑定鼠标事件
        self.bind('<B1-Motion>', self.move)
        self.bind('<Button-1>', self.start)
        self.bind('<ButtonRelease-1>', self.end)
        self.pack(fill=BOTH, expand=YES)


    def start(self, event):
        self.X = event.x
        self.Y = event.y
        # 开始截图
        self.sel = True

    def move(self, event):
        if not self.sel:
            return
        # 删除刚画完的图形,要不然鼠标移动的时候是黑乎乎的一片矩形
        self.delete(self.lastDraw)
        self.create_image(0,0,anchor=NW,image=photo)
        self.lastDraw = self.create_rectangle(self.X, self.Y, event.x, event.y, outline='black')

    def end(self, event):
        self.sel = False
        self.delete(self.lastDraw)
        self.create_image(0,0,anchor=NW,image=photo)
        sleep(0.1)
        # 考虑鼠标左键从右下方按下而从左上方抬起的截图
        myleft, myright = sorted([self.X, event.x])
        mytop, mybottom = sorted([self.Y, event.y])
        self.selectPosition = (myleft, myright, mytop, mybottom)
        pic = ImageGrab.grab((myleft + 1, mytop + 1, myright, mybottom))
        # 弹出保存截图对话框
        fileName = tkinter.filedialog.asksaveasfilename(title='保存截图', filetypes=[('JPG files', '*.jpg')])
        if fileName:
            pic.save(fileName + '.jpg')

if __name__=="__main__":
    root = Tk()
    # 窗口大小
    root.geometry('1000x500')
    g=Grab(root)
    photo = ImageTk.PhotoImage(file='C:/Users/13728/Desktop/chenwanyi/photo/微信截图_20220402212828.png')
    g.create_image(0,0,anchor=NW,image=photo)
    root.mainloop()

如有帮助,请点击我的回答下方的【采纳该答案】按钮帮忙采纳下,谢谢!

img

要么在canvas里create_image,要么把label放在canvas上面,你现在这样label是堆(pack)在canvas上面的。
这样可以截图:但画不出矩形。。。因为矩形是画在canvas上面而不是label上面的。。。

    g=Grab(root)
    photo = ImageTk.PhotoImage(file='C:/Users/13728/Desktop/chenwanyi/photo/微信截图_20220402212828.png')
    label = Label(g, image=photo)
    label.pack()
您好,我是有问必答小助手,您的问题已经有小伙伴帮您解答,感谢您对有问必答的支持与关注!
PS:问答VIP年卡 【限时加赠:IT技术图书免费领】,了解详情>>> https://vip.csdn.net/askvip?utm_source=1146287632