在 Tkinter GUI 内部使用时,我遇到了 Python MSS 库的非常奇怪的行为。
我有一个 Tkinter 窗口,其中有一个用于弹出顶级窗口的按钮。在该 TopLevel 窗口中,我有一个用于截取屏幕截图的按钮(使用 MSS)。第一次一切都按预期工作,但是当我销毁(关闭顶级窗口)然后再次打开它以拍摄另一个屏幕截图时,问题发生了。然后它会抛出一个异常,您将在下面看到该异常。只有当我销毁该顶级窗口并重试时才会发生这种情况。
编辑:看来这个问题与Ubuntu(使用20.04)有某种关系,因为这个问题在Win10上不存在。
异常代码:
Exception in Tkinter callback
Traceback (most recent call last):
File "/usr/lib/python3.8/tkinter/__init__.py", line 1892, in __call__
return self.func(*args)
File "example.py", line 10, in take_screenshot
with mss.mss() as sct:
File "/home/aivaras/Desktop/freelancing/darius/venv/lib/python3.8/site-packages/mss/factory.py", line 41, in mss
return linux.MSS(**kwargs)
File "/home/aivaras/Desktop/freelancing/darius/venv/lib/python3.8/site-packages/mss/linux.py", line 305, in __init__
self.root = self.xlib.XDefaultRootWindow(self._get_display(display))
File "/home/aivaras/Desktop/freelancing/darius/venv/lib/python3.8/site-packages/mss/linux.py", line 191, in validate
raise ScreenShotError(err, details=details)
mss.exception.ScreenShotError: XDefaultRootWindow() failed
简化的 Tkinter 代码:
import tkinter as tk
import mss
import mss.tools
def take_screenshot():
with mss.mss() as sct:
screen_part = {"top": 370, "left": 1090, "width": 80, "height": 390}
sct_img = sct.grab(screen_part)
mss.tools.to_png(sct_img.rgb, sct_img.size, output="./output.png")
def create_top_level_win():
top_level_win = tk.Toplevel(root)
take_screenshot_btn = tk.Button(top_level_win, text="Take screenshot", command=take_screenshot)
take_screenshot_btn.pack()
root = tk.Tk()
btn = tk.Button(root, text="Open TopLevel", command=create_top_level_win)
btn.pack()
root.mainloop()