具有覆盖重定向和全屏功能的 Tkinter 条目小部件



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

基本上出于某种原因,当我创建一个条目小部件时;当我通过self.attributes('-fullscreen',True(将GUI设置为全屏时,并且当self.overrideredirect(True(也启用时,它将不允许用户从键盘输入。(我要使用展台模式样式的GUI,因此标准用户无法退出界面(

我在这里浏览了这个链接(tkinter:无法进入条目小部件(,发现他们的问题相似但不完全相同。我知道这在Mac上存在一些问题,但必须有其他方法来执行此任务。当我在运行 Raspbian 的 Raspberry Pi 上运行它时,也发生了这个问题。当全屏未处于活动状态但覆盖重定向处于活动状态时,它可以工作;当覆盖重定向未处于活动状态但全屏处于活动状态时,它也可以工作。

我尝试使用focus_force((和focus_set((为小部件以及它所在的框架设置焦点,但这也不起作用。

下面提供了我的相关代码。如果需要更多我的代码,请告诉我。这段代码的目的是一个用户名/密码登录方法,它将在我的程序的其余部分被调用。

我在Mac OS Sierra 10.12.5上运行PyCharm社区版2017.2。提前感谢!

法典

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

我在您的代码中看到一个应该修复的危险信号(它不会解决您的问题,但它是免费的建议(。您将root传递给您的管理员方法,然后再次调用 Tk(( 来创建您正在使用的顶级。这不是一个好的做法。只需使用命令顶级。请参阅下面的示例代码。

您看到的帖子对于 MAC 关于覆盖重定向是一致的(显然是正确的(。顶级窗口上的此属性告诉窗口管理器忽略无父级窗口上的某些事件。显然,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")

最新更新