使用 tkinter 的不可关闭的窗口
Posted
技术标签:
【中文标题】使用 tkinter 的不可关闭的窗口【英文标题】:Unclosable window using tkinter 【发布时间】:2015-07-21 08:36:05 【问题描述】:嘿,我正在制作一个程序,当我输入错误的密码时,它会使用我的网络摄像头拍照。该程序将打开,我希望它无法关闭。 我需要知道如何使用 tkinter 使窗口无法关闭。
【问题讨论】:
如果你想让它cos,它必须是一个sin ed应用程序。 @TigerhawkT3:坚持这个问题,不要离题。 :P 无论如何,“无法关闭”是什么意思(假设您甚至指的是“无法关闭”)?你的意思是你不想要关闭框(Windows右上角的X,Mac左上角的红点等)?还是更多? 【参考方案1】:您可以尝试@abarnert 建议的所有方法,但我认为最简单的方法是忽略关闭事件。
来自this question:
这里有一个具体的例子:
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()
(Windows 的编辑代码)
所以将on_closing()
更改为
def on_closing():
pass
这使它无法关闭。我尝试了 Alt+F4,关闭按钮,从 Windows 任务栏关闭它,但都无济于事。我能够杀死它的唯一方法是使用任务管理器。
【讨论】:
【参考方案2】: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
固定到您想要抓握的一侧,并且只在此处添加bind
ing,或者通过从窃取bind
ings 的主窗口创建一个“子”窗口插图。但这永远不会像一个“原生”窗口。
如果您确实需要本机窗口,但关闭框(Windows 右上角的 X
、Mac 左上角的红点等)禁用或丢失(并且,在 Windows 上,禁用窗口菜单上的“关闭”项,并使用 Alt+F4 等等,对于 X11 也是如此……)……据我所知,在 Tkinter 中没有跨平台的方法可以做到这一点。您必须为每个平台编写代码,以获取底层本机窗口对象并对它们执行本机窗口操作。到那时,您可能希望考虑使用比 Tkinter 更强大的窗口库——例如,我相信 Qt、Gtk+ 和 wx 都有更简单的方法来创建普通窗口,但禁用关闭框。
【讨论】:
以上是关于使用 tkinter 的不可关闭的窗口的主要内容,如果未能解决你的问题,请参考以下文章