独步照明月 2021-07-20 13:18 采纳率: 100%
浏览 67
已采纳

python 中的类 sefl 未定义,这个怎么改


# 编写人:黄铭锐
# 开发时间:2021/7/19  9:22
# 屏幕取色器
import os
from time import sleep
import tkinter
import tkinter.filedialog
import tkinter.messagebox
from PIL import ImageGrab, Image

root = tkinter.Tk()
root.geometry('100x40+400+300')
root.resizable(False, False)


class MyCapture:

    def __init__(self, png):
        # 变量X和Y用来记录鼠标左键按下的位置
        self.X = tkinter.IntVar(value=0)
        self.Y = tkinter.IntVar(value=0)
        # 获取屏幕尺寸
        screenWidth = root.winfo_screenwidth()
        screenHeight = root.winfo_screenheight()
        # 创建顶级组件容器,与屏幕尺寸一样大
        self.top = tkinter.Toplevel(root, width=screenWidth, height=screenHeight)
        # 不显示最大化、最小化按钮
        self.top.overrideredirect(True)
        # 创建画布
        self.canvas = tkinter.Canvas(self.top, bg='white', width=screenWidth, height=screenHeight)
        self.image = tkinter.PhotoImage(file=png)
        # 显示全屏截图,在全屏截图上进行区域截图
        self.canvas.create_image(screenWidth//2, screenHeight//2, image=self.image)

    # 获取鼠标左键抬起的位置,取色

    def onLeftButtonUp(event):
        im = Image.open(png)
        color = im.getpixel((event.x, event.y))[:3]
        msg = str(color) + '\n'
        color = '#' + ''.join(map(lambda x: hex(x)[2:], color))
        msg += color
        tkinter.messagebox.showinfo('', msg)
        # 关闭当前窗口
        self.top.destroy()
    self.canvas.bind('<ButtonRelease-1>', onLeftButtonUp)
    self.canvas.pack(fill=tkinter.BOTH, expand=tkinter.YES)
# 开始截图


def buttonCaptureClick():
    # 最小化主窗口
    root.state('icon')
    sleep(0.2)
    filename = 'temp.png'
    im = ImageGrab.grab()
    im.save(filename)
    im.close()
    # 显示全屏幕截图
    w = MyCapture(filename)
    buttonCapture.wait_window(w.top)
    # 截图结束,恢复主窗口,并删除临时的全屏幕截图文件
    root.state('normal')
    os.remove(filename)


buttonCapture = tkinter.Button(root, text='取色', command=buttonCaptureClick)
buttonCapture.place(x=10, y=10, width=80, height=20)
# 启动消息主循环

root.mainloop()

img

  • 写回答

5条回答 默认 最新

  • CSDN专家-kaily 2021-07-20 14:28
    关注

    把def onLeftButtonUp(event)这一行后面的缩进一个格就可以了,你可以试一下

    import os
    from time import sleep
    import tkinter
    import tkinter.filedialog
    import tkinter.messagebox
    from PIL import ImageGrab, Image
     
    root = tkinter.Tk()
    root.geometry('100x40+400+300')
    root.resizable(False, False)
     
    class MyCapture:
        def __init__(self, png):
            # 变量X和Y用来记录鼠标左键按下的位置
            self.X = tkinter.IntVar(value=0)
            self.Y = tkinter.IntVar(value=0)
            # 获取屏幕尺寸
            screenWidth = root.winfo_screenwidth()
            screenHeight = root.winfo_screenheight()
            # 创建顶级组件容器,与屏幕尺寸一样大
            self.top = tkinter.Toplevel(root, width=screenWidth, height=screenHeight)
            # 不显示最大化、最小化按钮
            self.top.overrideredirect(True)
            # 创建画布
            self.canvas = tkinter.Canvas(self.top, bg='white', width=screenWidth, height=screenHeight)
            self.image = tkinter.PhotoImage(file=png)
            # 显示全屏截图,在全屏截图上进行区域截图
            self.canvas.create_image(screenWidth//2, screenHeight//2, image=self.image)
     
        # 获取鼠标左键抬起的位置,取色
            def onLeftButtonUp(event):
                im = Image.open(png)
                color = im.getpixel((event.x, event.y))[:3]
                msg = str(color) + '\n'
                color = '#' + ''.join(map(lambda x: hex(x)[2:], color))
                msg += color
                tkinter.messagebox.showinfo('', msg)
                # 关闭当前窗口
                self.top.destroy()
            self.canvas.bind('<ButtonRelease-1>', onLeftButtonUp)
            self.canvas.pack(fill=tkinter.BOTH, expand=tkinter.YES)
    
    # 开始截图
    def buttonCaptureClick():
        # 最小化主窗口
        root.state('icon')
        sleep(0.2)
        filename = 'temp.png'
        im = ImageGrab.grab()
        im.save(filename)
        im.close()
        # 显示全屏幕截图
        w = MyCapture(filename)
        buttonCapture.wait_window(w.top)
        # 截图结束,恢复主窗口,并删除临时的全屏幕截图文件
        root.state('normal')
        os.remove(filename)
     
     
    buttonCapture = tkinter.Button(root, text='取色', command=buttonCaptureClick)
    buttonCapture.place(x=10, y=10, width=80, height=20)
    # 启动消息主循环
     
    root.mainloop()
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(4条)

报告相同问题?

问题事件

  • 已采纳回答 7月20日
  • 修改了问题 7月20日
  • 创建了问题 7月20日

悬赏问题

  • ¥15 metadata提取的PDF元数据,如何转换为一个Excel
  • ¥15 关于arduino编程toCharArray()函数的使用
  • ¥100 vc++混合CEF采用CLR方式编译报错
  • ¥15 coze 的插件输入飞书多维表格 app_token 后一直显示错误,如何解决?
  • ¥15 vite+vue3+plyr播放本地public文件夹下视频无法加载
  • ¥15 c#逐行读取txt文本,但是每一行里面数据之间空格数量不同
  • ¥50 如何openEuler 22.03上安装配置drbd
  • ¥20 ING91680C BLE5.3 芯片怎么实现串口收发数据
  • ¥15 无线连接树莓派,无法执行update,如何解决?(相关搜索:软件下载)
  • ¥15 Windows11, backspace, enter, space键失灵