2017-07-26 100 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()。 –

相关问题