如何在屏幕上锚定Tkinter窗口(不可移动窗口)
在Windows下,当用户尝试重新定位窗口时,我倾向于禁用该窗口,但显然这不是跨平台选项。另一种选择是使用overrideredirect标志来中止移动。仅仅为了将窗口重新定位到您想要的位置,屏幕上会以闪烁结束。使用过速驾驶时,您仍然会感到闪烁,但在相同的位置,它给我的感觉是尝试访问MS上的禁用窗口,在那里他们闪烁窗口。
要注意,这段代码应该在边缘情况下使用,比如 模态窗。它通常被认为是烦人的(!)但是,对于仅在需要时出现的关键错误/消息,您可以并且也许应该能够做到这一点。
这项技术几乎没有更深入地解释:
当用户尝试重新定位窗口时,将触发配置事件。调用序列surpress_move并检查事件详细信息,以匹配我们正在寻找的特定情况:首先,条件是调用的小部件不是root的子部件,而是根窗口。X和y的细节不同于我们指定的细节。
我们将overrideredirect标志设置为true,这将导致一个未修饰的窗口(没有标题栏),因此不会移动,从而导致操作系统窗口管理器不再管理该移动。我们把我们的窗户重新定位到我们想要的位置,然后重新装饰窗户。以下是代码:
代码语言:javascript复制import tkinter as tk
XCOORD = 0
YCOORD = 0
def surpress_move(event):
if event.widget == root:
if event.x != XCOORD or event.y != YCOORD:
#event.widget.attributes('-disabled',True) #winows only
event.widget.overrideredirect(True)
event.widget.geometry(f'+{XCOORD}+{YCOORD}')
event.widget.overrideredirect(False)
#event.widget.attributes('-disabled',False)
root = tk.Tk()
root.bind('
root.mainloop()如果您想使用tkinters锚常量,可以执行以下操作:
代码语言:javascript复制import tkinter as tk
root = tk.Tk()
def get_anchor_coords(anchor):
if anchor in ('NW',tk.NW):
return 0,0
elif anchor in ('NE',tk.NE):
return root.winfo_screenwidth-root.winfo_width(),0
###for South you should find the workspace or a constant for the taskbar
elif anchor in ('SW', tk.SW):
return 0,root.winfo_screenheight()-root.winfo_height()
elif anchor in ('SE', tk.SE):
return (root.winfo_screenwidth-root.winfo_width(),
root.winfo_screenheight()-root.winfo_height())
else:
raise ValueError(f'anchor: {repr(anchor)}, not recognized!')
def surpress_move(event, anchor):
if event.widget == root:
xy = event.x,event.y
anchor_coords = get_anchor_coords(anchor)
if xy != anchor_coords:
#event.widget.attributes('-disabled',True)
event.widget.overrideredirect(True)
event.widget.geometry(f'+{anchor_coords[0]}+{anchor_coords[1]}')
event.widget.overrideredirect(False)
#event.widget.attributes('-disabled',False)
root.bind('
root.mainloop()