具有Overrideredirect和全屏的Tkinter Entry Widget

时间:2017-07-26 17:20:29

标签: python user-interface login tkinter

我希望这不是一个双重帖子,但我没有在Google和论坛中专门看到我的问题的答案。

基本上由于某些原因,当我创建一个Entry小部件时;当我通过self.attributes(' - fullscreen',True)设置我的GUI为全屏时,以及当启用self.overrideredirect(True)时,它将不允许用户从键盘输入。 (我要使用自助服务终端模式样式的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 个答案:

答案 0 :(得分: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")