我希望这不是一个双重帖子,但我没有在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
答案 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")