使 Tkinter 不成为“活动窗口”,即使我点击它

问题描述 投票:0回答:1

我正在使用 Tkinter 在所有其他窗口之上创建一个覆盖层。现在,如果我点击我的叠加层,比如图像或按钮,它会将活动窗口更改为 Tkinter,显然。我想要的是使用我的叠加层但保留我的活动窗口。 我环顾了点击类型的东西,但现在要么我不能点击我的按钮并且窗口保持活动状态,要么我可以但是 Tkinter 切换到活动窗口。我是 python 的新手,我不确定我的代码是否值得分享,因为它很简单,但它可以避免任何误解:

root = Tk()
root.geometry("1920x1080")
root.config(bg='#add123')
root.wm_attributes('-transparentcolor', '#add123')
root.attributes("-fullscreen", True)
root.attributes('-topmost',True)

编辑:我会尽量说清楚。如果我使用 Tkinter 制作的 GUI,就像其他寡妇一样,它将成为“活动窗口”。 因此,如果我将我的叠加层与另一个应用程序一起使用,比如说 Firefox。多亏了 topmost 属性,我的叠加层将在使用 Firefox 作为“活动窗口”时保持在顶部,这正是我想要的。但是如果在我的叠加层上单击一个按钮,“活动窗口”将变成 Tkinter。举个例子,如果我在 URL 栏中开始输入然后单击叠加层上的按钮,我将无法继续在 URL 栏中输入,因为 Firefox 不再是“活动窗口”。 这对我来说是个问题,因为我在一个全屏应用程序上使用这个覆盖层,该应用程序在不活动时会暂停。 再次感谢 ;)

编辑2: 所以我可能做错了什么我会和你分享代码:

from tkinter import *
from PIL import Image, ImageTk
import win32gui
import win32con

def setClickthrough(hwnd):
    print("setting window properties")
    try:
        styles = win32gui.GetWindowLong(hwnd, win32con.GWL_EXSTYLE)
        styles = win32con.WS_EX_LAYERED | win32con.WS_EX_TRANSPARENT
        win32gui.SetWindowLong(hwnd, win32con.GWL_EXSTYLE, styles)
        win32gui.SetLayeredWindowAttributes(hwnd, 0, 255, win32con.LWA_ALPHA)
    except Exception as e:
        print(e)

width = 1920 #self.winfo_screenwidth()
height = 1080 #self.winfo_screenheight()

root = Tk()
root.geometry("1920x1080")
root.config(bg='#add123')
root.wm_attributes('-transparentcolor', '#add123')
root.attributes("-fullscreen", True)
root.wm_attributes("-topmost", 1)
bg = Canvas(root, width=width, height=height)

setClickthrough(bg.winfo_id())

frame = ImageTk.PhotoImage(file="sample.png")
bg.create_image(1920/2, 1080/2, image=frame)
bg.button_1 = Button(root,text='Click')
bg.button_1.pack()
bg.pack()
root.mainloop()

此时,图像“sample.png”可通过点击槽而不是按钮点击。如果那有意义

python tkinter overlay active-window
1个回答
0
投票

您只需要一个部分点击区域?

就像我在评论部分解释的那样。您需要使用操作系统的窗口管理器来完成此任务。

不要尝试将事件发送到其他应用程序,你可能会破坏某些东西,这就是为什么它被认为是反模式(要避免的东西)。

我刚刚发布的Q&A中的内容将使用本地调用。尝试将此画布制作到您所在的区域并在其周围放置按钮。它可以工作,但不确定,因为我从未尝试过。

或者,当您的指针在您的交互部分区域中移动时,尝试反转点击属性。

还要注意,至少在 Windows 下,当与另一个窗口交互时,你总是会失去对前一个窗口的关注,这似乎是不可避免的,因为 caret(你打字的地方闪烁的东西)与此有关。

© www.soinside.com 2019 - 2024. All rights reserved.