2015-05-10 329 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都有更簡單的創建常規窗口的方法,但禁用關閉框。