在rk3399中有一个opencv创建的窗口和事件检测会弹出来的tk界面,我已经将opencv窗口放在最底层,tk界面放在最上层,但是一点击opencv窗口tk界面就被覆盖了,这是什么原因,怎么解决
时间: 2024-03-03 11:47:56 浏览: 69
OpenCVSharpPictureDeal.rar
5星 · 资源好评率100%
这是因为 OpenCV 的窗口默认是使用底层的窗口系统来创建的,而 Tkinter 的窗口则是使用高层的 Python GUI 库来创建的。由于底层和高层窗口系统的差异,所以当用户点击 OpenCV 窗口时,它会自动移到 Tkinter 窗口的前面,导致 Tkinter 窗口被覆盖。
为了解决这个问题,可以尝试在 OpenCV 窗口的创建时指定它的窗口属性。具体来说,可以使用 `cv2.WINDOW_NORMAL` 属性来创建一个可以调整大小的窗口,然后将其放在 Tkinter 窗口之后。
以下是一个示例代码:
```python
import cv2
import tkinter as tk
# 创建 Tkinter 窗口
root = tk.Tk()
# 创建 OpenCV 窗口
cv2.namedWindow('window', cv2.WINDOW_NORMAL)
cv2.moveWindow('window', 100, 100)
cv2.imshow('window', img)
# 将 OpenCV 窗口放在 Tkinter 窗口之后
root.lift()
root.attributes('-topmost', True)
root.after_idle(root.attributes, '-topmost', False)
# 进入主循环
root.mainloop()
```
在上面的示例代码中,我们首先创建了一个 Tkinter 窗口,并在其后面创建了一个 OpenCV 窗口。然后,我们使用 `lift()` 方法将 Tkinter 窗口放在最上层,然后使用 `attributes()` 方法将其置为非最顶层窗口。最后,我们进入 Tkinter 的主循环。
这样,当用户点击 OpenCV 窗口时,由于 Tkinter 窗口已经置为非最顶层窗口,所以不会被覆盖。同时,由于 OpenCV 窗口使用了 `WINDOW_NORMAL` 属性,所以它可以被放在任意位置。
阅读全文