Tkinter 没有任何方法可以直接执行此操作。但它确实有一些东西可能足够好,或者它可能太过分了:overrideredirect 标志:
如果非零,这会阻止窗口管理器装饰窗口。也就是说,窗口不会有标题和边框,也无法通过普通方式移动或关闭。
这不是最新的;在某些平台上它实际上可能有标题或边框……但它不会是可关闭的。
这很容易使用:只需执行root.overrideredirect(True)(或者,如果您想在不同的Toplevel 窗口而不是您的根窗口上执行此操作,window.overrideredirect(True))。
但请注意,它不能移动或关闭,不仅仅是不能关闭。 (如果你愿意,它也不能调整大小。)
因此,您唯一能做的就是设置标志,然后绑定鼠标按钮事件以手动处理移动。例如,在您窗口的__init__ 方法中:
self.overrideredirect(True) # if this is a Toplevel
#self.parent.overrideredirect(True) # if this is a Frame on root
self.bind('<ButtonPress-1>', self.move_start)
self.bind('<ButtonRelease-1>', self.move_end)
self.bind('<B1-Motion>', self.move_move)
然后:
def move_start(self, event):
self.startx, self.starty = event.x, event.y
def move_stop(self, event):
self.move_move(event)
def move_move(self, event):
x = self.winfo_x() + event.x - self.startx
y = self.winfo_y() + event.y - self.starty
self.geometry("+%s+%s" % (x, y))
显然,如果您希望窗口中的任何小部件接受点击,您可能不希望使整个窗口成为拖动区域。事实上,即使没有任何可点击的内容,您也可能不想将整个窗口设为拖动区域,因为这并不真正遵循 Mac 或 Windows 人机界面准则。您可以伪造一个抓握区域——标题栏、窗口周围的边框等——只需将Label 固定到您想要抓握的一侧,并且只在此处添加binding,或者通过从窃取bindings 的主窗口创建一个“子”窗口插图。但这永远不会像一个“原生”窗口。
如果您确实需要本机窗口,但关闭框(Windows 右上角的 X、Mac 左上角的红点等)禁用或丢失(并且,在 Windows 上,禁用窗口菜单上的“关闭”项,并使用 Alt+F4 等等,对于 X11 也是如此……)……据我所知,在 Tkinter 中没有跨平台的方法可以做到这一点。您必须为每个平台编写代码,以获取底层本机窗口对象并对它们执行本机窗口操作。到那时,您可能希望考虑使用比 Tkinter 更强大的窗口库——例如,我相信 Qt、Gtk+ 和 wx 都有更简单的方法来创建普通窗口,但禁用关闭框。