如何实现tkinter窗口仅在被拖动到顶部时自动复位到指定位置
问题原因
你绑定的<Configure>事件会在窗口位置、大小发生任何变化时都触发,当前move函数没有做任何条件判断,只要事件触发就直接重置窗口位置,自然会出现只要移动窗口就复位的问题。
解决方案
在事件回调函数中先判断窗口当前的顶部坐标是否触及屏幕顶部,只有符合条件时才执行复位逻辑。修改后代码如下:
from tkinter import * # 存储初始窗口参数,后续修改直接调整常量即可 INIT_WIDTH = 1270 INIT_HEIGHT = 725 INIT_POS_X = 0 INIT_POS_Y = 0 def move(e): # 仅响应主窗口的尺寸/位置变化事件,排除子控件触发的事件和异常尺寸变化 if e.widget == root and e.width == INIT_WIDTH and e.height == INIT_HEIGHT: # 获取窗口当前顶部y坐标,判断是否触及屏幕顶部 current_y = root.winfo_y() if current_y <= 0: root.geometry(f"{INIT_WIDTH}x{INIT_HEIGHT}+{INIT_POS_X}+{INIT_POS_Y}") root = Tk() root.geometry(f"{INIT_WIDTH}x{INIT_HEIGHT}+{INIT_POS_X}+{INIT_POS_Y}") root.resizable(False, False) button = Button(root, command=move) button.place(x=10, y=10) entry = Entry(root) entry.place(relx=.4, rely=.5) root.bind('<Configure>', move) root.mainloop()
补充说明
- 原代码中变量名
Entry和tkinter输入框类名重名,容易引发后续调用错误,修改为小写开头的entry更符合命名规范 - 触发阈值可自行调整,比如希望窗口离顶部还有10像素就触发复位,可把判断条件改为
current_y <= 10
内容的提问来源于stack exchange,提问作者neo_codex
相关产品推荐
相关产品推荐

