weixin_52310393 2022-05-13 22:40 采纳率: 90%
浏览 68
已结题

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()

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

  • 写回答

3条回答 默认 最新

  • 关注

    你添加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

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 5月21日
  • 已采纳回答 5月13日
  • 创建了问题 5月13日

悬赏问题

  • ¥15 随身WiFi网络灯亮但是没有网络,如何解决?
  • ¥15 gdf格式的脑电数据如何处理matlab
  • ¥20 重新写的代码替换了之后运行hbuliderx就这样了
  • ¥100 监控抖音用户作品更新可以微信公众号提醒
  • ¥15 UE5 如何可以不渲染HDRIBackdrop背景
  • ¥70 2048小游戏毕设项目
  • ¥20 mysql架构,按照姓名分表
  • ¥15 MATLAB实现区间[a,b]上的Gauss-Legendre积分
  • ¥15 delphi webbrowser组件网页下拉菜单自动选择问题
  • ¥15 linux驱动,linux应用,多线程