2017-07-26 64 views
0

我希望這不是一個雙後,但我沒有看到特別是在整個谷歌和論壇的問題的答案。Tkinter Entry Widget with Overrideredirect and Fullscreen

基本上由於某種原因,當我創建一個Entry小部件時;當我通過self.attributes(' - fullscreen',True)將我的GUI設置爲全屏時以及啓用self.overrideredirect(True)時,它將不允許用戶從鍵盤輸入。 (我打算使用Kiosk模式樣式的GUI,因此標準用戶無法退出界面)

我在這裏查看了此鏈接(tkinter: can't enter into entry widget),發現它們的問題相似但不完全相同。我知道在Mac上有一些問題,但是必須有其他方法來執行此任務。當我在運行Raspbian的Raspberry Pi上運行這個時,也出現了這個問題。當全屏未激活但覆蓋重定向處於活動狀態時,它將起作用;當覆蓋重定向未激活但全屏處於活動狀態時,它也起作用。

我試着用focus_force()和focus_set()來設置小部件的焦點,以及它在其中擱置的框架,但是這也不起作用。

我的相關代碼如下。如果需要更多我的代碼,請告訴我。這段代碼的目的是一個用戶名/密碼登錄方法,它將在我的程序的其餘部分被調用。

我在Mac OS Sierra 10.12.5上運行PyCharm Community Edition 2017.2。提前致謝!

CODE

def admin(self, root_1): 
     master = tk.Tk() 
     text = "" 

     master.title("Administrator Login") 
     w_0, h_0 = master.winfo_screenwidth(), master.winfo_screenheight() 
     master.geometry("%dx%d+0+0" % (w_0, h_0)) 

     f1 = tk.Frame(master, width=w_0, height=h_0, background="red") 
     f2 = tk.Frame(master, width=w_0, height=h_0, background="blue") 

     f1.pack(fill="both", expand=True) 
     f2.place(in_=f1, anchor="c", relx=.5, rely=.5) 

     master.wm_attributes('-topmost', 'True') 
     master.overrideredirect(True) 

     instruction_label = tk.Label(f2, text="Please type your username and password", fg="red", bg="blue", 
            font=("Helvetica", 26)) 
     instruction_label.grid(row=0, columnspan=2, padx=20, pady=20) 
     user_label = tk.Label(f2, text="Username", font=("Helvetica", 16), bg="red") 
     user_entry = tk.Entry(f2, bg="red") 
     pass_label = tk.Label(f2, text="Password", font=("Helvetica", 16), bg="red") 
     pass_entry = tk.Entry(f2, bg="red", show="*") 

     user_label.grid(row=1, column=0, sticky=("E", "W"), padx=20, pady=10) 
     user_entry.grid(row=1, column=1, sticky="W", padx=20, pady=10) 
     pass_label.grid(row=2, column=0, sticky=("E", "W"), padx=20, pady=10) 
     pass_entry.grid(row=2, column=1, sticky="W", padx=20, pady=10) 

     user_entry.focus_force() 

     submit_button = tk.Button(f2, text="Submit", command=lambda: correct_login(text), bg="red", width = 20, height = 4) 
     submit_button.grid(row=3, column=0, sticky=("N", "S", "E"), padx=20, pady=20) 
     quit_button = tk.Button(f2, text="Quit", command=destroy, bg="red", width = 20, height = 4) 
     quit_button.grid(row=3, column=1, sticky=("N", "S", "W"), padx=20, pady=20) 

     user_entry.delete(0) 
     user_entry.insert(0, "") 

     pass_entry.delete(0) 
     pass_entry.insert(0, "") 

     return 

回答

1

我看到你的代碼紅旗應該是固定的(它不會解決你的問題,但它是免費的建議)。您將root傳遞給您的管理方法,然後您再次調用Tk()以創建您正在使用的頂層。這不是一個好習慣。只需使用命令Toplevel。請參閱下面的示例代碼。

你看過的帖子與MAC關於overrideredirect一致(顯然是正確的)。頂級窗口上的這個屬性告訴窗口管理器忽略未登錄窗口上的一些事件。顯然,MAC不會發送按鍵和釋放事件到未封閉的頂層窗口中的小部件。

對此的一種解決方法是允許窗口爲父(正常),但將「WM_DELETE_WINDOW」協議設置爲攔截窗口關閉的函數或方法。我只發佈管理方法的頂部。

def admin(self, root_1): 
    master = Toplevel() 
    text = "" 

    master.title("Administrator Login") 
    w_0, h_0 = master.winfo_screenwidth(), master.winfo_screenheight() 
    master.geometry("%dx%d+0+0" % (w_0, h_0)) 
    master.protocol("WM_DELETE_WINDOW", self.dontDeleteWindow) 


def dontDeleteWindow(self): 
    print("User tied to close window") 
+0

Ron,我很感謝您的意見和建議。我在管理方法中傳遞根目的的目的是讓我可以使用root.withdraw()來允許我不在後臺顯示父窗口,因爲我可以在窗體背後看到父窗口的一部分。然後使用root.deiconify()在f2中按下「退出」按鈕時返回父窗口。 (我沒有發佈所有代碼,以保持更短)。據說,我不熟悉你上面展示的內容。 master.protocol到底在做什麼?我更新Python,所以我表示歉意。 –

+0

如果你嘗試一下,你會看到。 tk協議允許應用程序保存未保存的數據,就像文字處理程序或電子表格程序在標題欄中按窗口關閉按鈕時一樣。這樣,應用程序不僅可以關閉窗口,還可以讓程序員在關閉窗口之前做一些工作。在我發佈的例子中,它只是打印一條消息,但你會注意到窗口沒有被銷燬,除非你明確地告訴它有一個master.destroy()或一個sys.exit()。 –