Python 使用tkinter的不可关闭窗口

Python 使用tkinter的不可关闭窗口,python,user-interface,python-3.x,tkinter,window,Python,User Interface,Python 3.x,Tkinter,Window,嘿,我正在制作一个程序,当我输入错误的密码时,可以使用我的网络摄像头拍照。该计划将是开放的,我希望它不可关闭。 我需要知道如何使用tkinter使窗口不可关闭。tkinter没有任何方法可以直接做到这一点。但它确实有一些东西可能足够好,也可能太过分了:旗帜: 如果非零,这将阻止窗口管理器装饰窗口。换句话说,窗口将没有标题或边框,不能通过普通方式移动或关闭 这不是最新的;在某些平台上,它实际上可能有一个标题或边框……但它不会被关闭 这很容易使用:只需执行root.overrideredirect(

嘿,我正在制作一个程序,当我输入错误的密码时,可以使用我的网络摄像头拍照。该计划将是开放的,我希望它不可关闭。
我需要知道如何使用tkinter使窗口不可关闭。

tkinter没有任何方法可以直接做到这一点。但它确实有一些东西可能足够好,也可能太过分了:旗帜:

如果非零,这将阻止窗口管理器装饰窗口。换句话说,窗口将没有标题或边框,不能通过普通方式移动或关闭

这不是最新的;在某些平台上,它实际上可能有一个标题或边框……但它不会被关闭

这很容易使用:只需执行
root.overrideredirect(True)
(或者,如果您希望对不同的
Toplevel
窗口(而不是根)执行此操作,
window.overrideredirect(True)


但请注意,它不能移动或关闭,而不仅仅是它不能关闭。(如果需要,它也无法调整大小。)

因此,您唯一能做的就是设置标志,然后绑定鼠标按钮事件以手动处理移动。例如,在窗口的
初始化方法中:

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)

显然,如果您想让窗口中的任何小部件接受单击,您可能不想让整个窗口成为一个拖动区域。事实上,你可能不想让整个窗口成为一个拖拽区域,即使它没有任何东西可以点击,因为这并没有真正遵循Mac或Windows的人机界面准则。您可以伪造夹点区域—标题栏、窗口周围的边框,等等—只需在您想要夹点的一侧添加一个
标签
,并且仅在那里进行
绑定,或者从主窗口创建一个“子”窗口插入,窃取
绑定。但这永远不会像一个“本地”窗口


如果您确实需要一个本机窗口,但关闭框(Windows右上角的
X
、Mac电脑左上角的红点等)被禁用或丢失(在Windows上,窗口菜单上的“关闭”项被禁用,Alt+F4等等,就我所知,X11也是如此……),在Tkinter没有跨平台的方法。您必须为每个平台编写代码,以获取底层本机窗口对象并对其执行本机窗口操作。在这一点上,您可能希望使用比Tkinter更强大的窗口库,例如,我相信Qt、Gtk+和wx都有更简单的创建普通窗口的方法,但关闭框被禁用。

您可以尝试@abarnert建议的所有方法,但我认为最简单的方法就是忽略这个接近的事件

发件人:

这里有一个具体的例子:

(已编辑的Windows代码)

因此,将关闭()时的
更改为

def on_closing():
通过


这使得它不可修复。我尝试了Alt+F4,关闭按钮,从Windows任务栏关闭它,都没有用。我能够杀死它的唯一方法是使用任务管理器。

如果你想让它无法运行,它必须是一个罪恶的应用程序。@TigerhawkT3:坚持这个问题,不要偏离正题。:PAnyway,你所说的“不可关闭”是什么意思(假设你的意思是“不可关闭”)?你的意思是你不想要封闭框(Windows右上角的X和Mac电脑左上角的红点等等)?或者更多?
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))
import Tkinter as tk
import tkMessageBox as messagebox
root = tk.Tk()

def on_closing():
    if messagebox.askokcancel("Quit", "Do you want to quit?"):
        root.destroy()

root.protocol("WM_DELETE_WINDOW", on_closing)
root.mainloop()