为何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
相关产品推荐
相关产品推荐

