2015-05-10 328 views
1

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

+3

如果你想让它成为_cos_ able,它必须是一个_sin_ed应用程序。 – TigerhawkT3

+5

@ TigerhawkT3:坚持这个问题,不要切线。 :P – abarnert

+1

无论如何,你的意思是“不可关闭”(假设你的意思是“不可关闭”)?你的意思是你不想要关闭盒子(Windows上右上角的X,Mac上左上角的红点等)?还是比这更多? – abarnert

回答

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任务栏关闭它,都无济于事。我能够杀死它的唯一方法是使用任务管理器。

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都有更简单的创建常规窗口的方法,但禁用关闭框。