Blog Details

  • Home  
  • 如何在屏幕上锚定Tkinter窗口(不可移动窗口)

如何在屏幕上锚定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('',surpress_move)

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('',lambda e:surpress_move(e,'wW'))

root.mainloop()