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()