You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何win32gui无法设置Tkinter窗口的位置与堆叠顺序?

Tk窗口作为HUD跟随目标窗口堆叠顺序的问题

我尝试将自制的Tk窗口作为抬头显示(HUD)固定在另一个目标窗口上方,目前除了无法维持窗口堆叠顺序外,其他功能都正常,且用win32gui设置Tk窗口的位置完全无效。

之前给Tk窗口的root设置了-topmost属性,目标窗口未被覆盖时表现正常,但当其他窗口覆盖目标窗口时,Tk窗口仍会保持置顶,这不符合需求——我需要Tk窗口能完全跟随目标窗口的堆叠顺序变化。

用于刷新窗口位置和大小的代码

def Move(self):
    try:
        # 获取目标窗口的尺寸
        rect = win32gui.GetWindowRect(self.target_hwnd)
        x,y,w,h = rect[0], rect[1], rect[2]-rect[0], rect[3]-rect[1]

        # 获取Tk窗口的句柄
        window_id = self.root.winfo_id()

        # 之前能用的方法:正确设置Tk窗口的位置和大小
        # self.root.geometry('%dx%d+%d+%d' % (w,h, x,y))
        # self.bg.configure(width=300,height=100) 

         # 尝试将Tk窗口置于目标窗口下方
        win32gui.SetWindowPos(window_id, self.target_hwnd ,x, y, w, h, False)

        # 尝试将目标窗口置于Tk窗口下方
        win32gui.SetWindowPos(self.target_hwnd, window_id,x, y, w, h, False)
        
        # 900毫秒后重新执行Move方法
        self.root.after(900, self.Move)
    except:
        # 找不到目标窗口句柄时销毁Tk窗口
        self.root.destroy()

测试脚本(普通窗口可正常运行)

我写了一个测试脚本,用两个普通窗口测试SetWindowPos()方法,运行完全符合预期:

def move(hwnd1,hwnd2):
    rect = win32gui.GetWindowRect(hwnd1)
    x,y,w,h = rect[0], rect[1], rect[2]-rect[0], rect[3]-rect[1]
    
    rect1 = win32gui.GetWindowRect(hwnd2)
    x1,y1,w1,h1 = rect1[0], rect1[1], rect1[2]-rect[0], rect1[3]-rect[1]

    # 将窗口1置于窗口2上方(窗口2在下方)
    win32gui.SetWindowPos(hwnd1, hwnd2 ,x, y, w , h, False)
    
    # 将窗口2置于窗口1上方(窗口1在下方)
    win32gui.SetWindowPos(hwnd2, hwnd1 ,x1, y1, w1, h1, False)

为什么无法像操作普通窗口那样,用win32gui移动和调整Tk窗口的层级?


内容的提问来源于stack exchange,提问作者Daniel Rigney

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 09:15:26