嘿我正在制作一个程序,当我输入错误的密码时,使用我的网络摄像头拍照。该程序将是开放的,我希望它无法使用。 我需要知道如何使用tkinter使窗口无法使用。
答案 0 :(得分:1)
你可以尝试@abarnert建议的所有内容,但我认为最简单的方法就是忽略关闭事件。
这里有一个具体的例子:
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任务栏关闭它,都无济于事。我能够杀死它的唯一方法是使用任务管理器。
答案 1 :(得分:0)
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
。在那里,或通过从主窗口创建一个窃取bind
的“子”窗口插入。但这永远不会像一个“本土”窗口。
如果你真的需要一个原生窗口,但是关闭框(Windows右上角的X
,Mac左上角的红点等)已禁用或丢失(并且,在Windows上,窗口菜单上的“关闭”项禁用,Alt + F4等,同样适用于X11 ...)......据我所知,在Tkinter中没有跨平台的方法可以做到这一点。您必须为每个获取基础本机窗口对象的平台编写代码,并为它们执行本机窗口事务。那时,您可能希望使用比Tkinter更强大的窗口库 - 例如,我相信Qt,Gtk +和wx都有更简单的方法来创建普通窗口但禁用关闭框。