Python 在屏幕截图后移动部分,留下痕迹,不考虑屏幕部分

Python 在屏幕截图后移动部分,留下痕迹,不考虑屏幕部分,python,tkinter,canvas,Python,Tkinter,Canvas,我试图生成一个截图,然后我希望截图的一部分能够移动它。但是我有一些奇怪的行为,如下图所示 相关代码如下所示: import tkinter import pyscreenshot as ImageGrab from PIL import ImageTk class Win(tkinter.Tk): def __init__(self, master=None): tkinter.Tk.__init__(self, master) self.overr

我试图生成一个截图,然后我希望截图的一部分能够移动它。但是我有一些奇怪的行为,如下图所示

相关代码如下所示:

import tkinter
import pyscreenshot as ImageGrab
from PIL import ImageTk


class Win(tkinter.Tk):
    def __init__(self, master=None):
        tkinter.Tk.__init__(self, master)
        self.overrideredirect(True)
        self._offsetx = 0
        self._offsety = 0

        # self.geometry(f"{screenWidth}x{screenHeight}")
        self.bind('<Button-1>', self.clickwin)
        self.bind('<B1-Motion>', self.dragwin)
        self.bind('<Button-3>', self.close)

    def close(self, event):
        self.destroy()

    def dragwin(self, event):
        x = self.winfo_pointerx() - self._offsetx
        y = self.winfo_pointery() - self._offsety
        self.geometry(f"+{x}+{y}")

    def clickwin(self, event):
        self._offsetx = event.x
        self._offsety = event.y


root = Win()

screenWidth = root.winfo_screenwidth()
screenHeight = root.winfo_screenheight()

im = ImageGrab.grab()
image = ImageTk.PhotoImage(im)

canvas = tkinter.Canvas(root, bg='white',
                        width=screenWidth, height=screenHeight)
canvas.pack(fill=tkinter.BOTH, expand=tkinter.YES)
canvas.create_image(0, 0,
                    anchor=tkinter.NW, image=image)


def f():
    root.geometry("50x50")
    canvas.config(width=50, height=50)


canvas.after(2_000, f)
root.mainloop()
导入tkinter
将pyscreenshot导入为ImageGrab
从PIL导入ImageTk
班级胜利(tkinter.Tk):
def uuu init uuu(self,master=None):
tkinter.Tk.\uuuuu初始化(self,master)
self.overrideredirect(True)
自补偿x=0
self.\u offsety=0
#自几何(f“{screenWidth}x{screenHeight}”)
self.bind(“”,self.clickwin)
self.bind(“”,self.dragwin)
self.bind(“”,self.close)
def关闭(自身、事件):
自我毁灭
def dragwin(自身、事件):
x=self.winfo_pointerx()-self.\u offsetx
y=self.winfo\u pointery()-self.\u offsety
自几何(f“+{x}+{y}”)
def clickwin(自我、事件):
self._offsetx=事件x
self.\u offsety=event.y
root=Win()
screenWidth=root.winfo_screenWidth()
screenHeight=root.winfo_screenHeight()
im=ImageGrab.grab()
image=ImageTk.PhotoImage(im)
canvas=tkinter.canvas(根,bg='white',
宽度=屏幕宽度,高度=屏幕高度)
canvas.pack(fill=tkinter.BOTH,expand=tkinter.YES)
画布。创建_图像(0,0,
anchor=tkinter.NW,image=image)
def():
根几何(“50x50”)
canvas.config(宽度=50,高度=50)
画布。之后(2_000,f)
root.mainloop()
不希望出现的行为是滑动部分离开的划线/轨迹。画布和根目录应该只停留在设计的小部分,屏幕的其余部分应该是后面的程序(屏幕截图不再覆盖这些程序)


至于我的系统,桌面环境:
xfce 4.14l
和OS
xubuntu 20.04

似乎在Windows 10上运行良好。感谢您的帮助@jizhaosama。对于您所说的,那么在处理
X11
时,它应该是
tkinter
端的一个bug。我将稍等一下,看看是否有人能重现我的想法t与某些linux发行版或他们是否遇到了错误。