python放大镜实现[27行代码-tkinter-PIL-pynput]
如你所见,运行效果如下、
附code如下;
import tkinter from PIL import ImageGrab, ImageTk from pynput import mouse #博客园:戳人痛处 bili:崩析 control = mouse.Controller() root=tkinter.Tk() screenW=root.winfo_screenwidth() screenH=root.winfo_screenheight() root.geometry("500x300") root.wm_attributes('-topmost',1) #[0] #博客园:戳人痛处 bili:崩析 root.overrideredirect(True) #不显示标题栏 # [1] #博客园:戳人痛处 bili:崩析 def run(): global immg # [2] x,y = control.position # [3] xx =ImageGrab.grab((x-50,y-30,x+50,y+30)) xxx=xx.resize((500,300)) immg=ImageTk.PhotoImage(xxx) #全屏抓取 canvas.create_image(250,150,image=immg) # [4] root.geometry("500x300+{}+{}".format(x+50,y+30)) #[5] root.after(func=run,ms=20) root.after(func=run,ms=100) #博客园:戳人痛处 bili:崩析 canvas=tkinter.Canvas(root,width=500,height=300) #创建白色画布 canvas.pack(fill=tkinter.BOTH,expand=tkinter.YES) #画布放置至窗体 root.mainloop()
代码比较简单,很容易看懂,但是全网就是找不到相关实现代码;now-time:2021-9-14-23:23:58
现在我实现后分享给你,只需注意几个点;
[0] 窗口置顶
[1] 不显示标题栏
[2] 全局化图像对象,避免销毁导致闪烁
[3] 获取鼠标坐标
[4] 画布从中心点开始绘制
[5] 不断刷新放大镜的位置
tk的after方法自调用刷新
第2种显示方式
显示效果如下
贴code如下
import tkinter from PIL import ImageGrab, ImageTk from pynput import mouse #博客园:戳人痛处 bili:崩析 control = mouse.Controller() root=tkinter.Tk() screenW=root.winfo_screenwidth() screenH=root.winfo_screenheight() root.geometry("500x300") root.wm_attributes('-topmost',1) #[0] #博客园:戳人痛处 bili:崩析 # root.overrideredirect(True) #不显示标题栏 # [1] #博客园:戳人痛处 bili:崩析 def run(): global immg # [2] x,y = control.position # [3] xx =ImageGrab.grab((x-50,y-30,x+50,y+30)) xxx=xx.resize((500,300)) immg=ImageTk.PhotoImage(xxx) #全屏抓取 canvas.create_image(250,150,image=immg) # [4] # root.geometry("500x300+{}+{}".format(x+50,y+30)) #[5] root.after(func=run,ms=20) root.after(func=run,ms=100) #博客园:戳人痛处 bili:崩析 canvas=tkinter.Canvas(root,width=500,height=300) #创建白色画布 canvas.pack(fill=tkinter.BOTH,expand=tkinter.YES) #画布放置至窗体 root.mainloop()
注释代码 [1] 和 [5]即可,作用是取消鼠标跟随并显示标题栏;
-------------====================分割线====================-------------