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

Python Tkinter Toplevel窗口重复打开位置偏移,如何固定相对根窗口位置?

问题描述

我在Python应用中设置了一个打开Toplevel窗口的按钮,首次打开窗口显示正常,但关闭后再次通过该按钮打开时,窗口位置会相较于上次向西南方向偏移。最终窗口会移至屏幕左上角附近,之后每次开关还会持续向下偏移。我希望窗口每次都显示在同一位置,曾尝试使用lift()方法将窗口置于根窗口上方,但并未解决问题。以下是创建Toplevel窗口的函数代码:

def EXIT1(self):
    self.exitsure = tk.Toplevel()
    self.exitsure.resizable(0,0)

    self.submit1['state'] = 'disabled'
    self.submit2['state'] = 'disabled'
    self.submit3['state'] = 'disabled'
    self.submit4['state'] = 'disabled'
    self.backup['state'] = 'disabled'

    self.areyousure = tk.Label(self.exitsure, text="Are you sure you want to give " + self.output1.cget("text") + " a point?")
    self.areyousure.grid(column=0, row=0)

    self.ExitYes = tk.Button(self.exitsure, text="Yes", command=self.rewrite1)
    self.ExitYes.grid(column=0, row=2)

    self.NoYes = tk.Button(self.exitsure, text="No", command=self.Destroy_Enable)
    self.NoYes.grid(column=2, row=2)
    self.exitsure.protocol("WM_DELETE_WINDOW", self.closed)

请问是否有办法固定Toplevel窗口相对于根窗口的显示位置?

解决方案

要固定Toplevel窗口的位置,你可以通过以下两种方式实现:

1. 直接指定绝对位置

在创建Toplevel窗口后,用geometry()方法直接设置窗口的坐标(格式为宽度x高度+X坐标+Y坐标),比如让窗口显示在根窗口的中心:

def EXIT1(self):
    self.exitsure = tk.Toplevel()
    self.exitsure.resizable(0,0)
    
    # 获取根窗口的位置和大小
    root_x = self.master.winfo_x()
    root_y = self.master.winfo_y()
    root_width = self.master.winfo_width()
    root_height = self.master.winfo_height()
    
    # 设置弹窗大小(根据你的内容调整)
    popup_width = 300
    popup_height = 100
    
    # 计算弹窗相对于根窗口中心的坐标
    x = root_x + (root_width // 2) - (popup_width // 2)
    y = root_y + (root_height // 2) - (popup_height // 2)
    
    # 应用位置
    self.exitsure.geometry(f"{popup_width}x{popup_height}+{x}+{y}")
    
    # 后续原有代码...

2. 绑定窗口到根窗口,跟随根窗口移动

如果希望弹窗始终相对于根窗口保持固定位置(比如根窗口移动时弹窗也跟着动),可以在Toplevel创建时指定transient(self.master),同时结合geometry()设置相对位置:

def EXIT1(self):
    self.exitsure = tk.Toplevel(self.master)
    # 设置为临时窗口,绑定到根窗口
    self.exitsure.transient(self.master)
    self.exitsure.resizable(0,0)
    
    # 计算相对根窗口的位置,比如根窗口左上角偏移50,50
    x = self.master.winfo_x() + 50
    y = self.master.winfo_y() + 50
    self.exitsure.geometry(f"+{x}+{y}")
    
    # 后续原有代码...

额外注意点

  • 确保关闭窗口时调用destroy()彻底销毁实例,避免因重复复用隐藏的窗口导致位置偏移。
  • lift()仅用于调整窗口层级,和位置无关,无法解决你的问题。

内容的提问来源于stack exchange,提问作者Ryan Nackers

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 07:45:05