Tkinter Entry Widget с переопределением и полноэкранным режимом
Я надеюсь, что это не двойной пост, но я не видел ответа на свой вопрос специально в Google и на форумах.
По какой-то причине, когда я создаю виджет Entry; он не позволит пользователю вводить данные с клавиатуры, когда я настраиваю свой графический интерфейс в полноэкранном режиме через self.attributes('-fullscreen', True) и когда также включен self.overrideredirect(True). (Я собираюсь использовать графический интерфейс в стиле киоска, чтобы обычный пользователь не мог выйти из интерфейса)
Я прошел по этой ссылке ( tkinter: не могу войти в виджет входа) и обнаружил, что их проблема была похожей, но не совсем такой же. Я понимаю, что есть некоторые проблемы с этим на Mac, но должен быть какой-то другой способ выполнить эту задачу. Эта проблема также возникла, когда я запустил ее на Raspberry Pi под управлением Raspbian. Когда полноэкранный режим не активен, но перенаправление переопределения активно, оно работает; и когда перенаправление переопределения не активно, но полноэкранный режим также работает.
Я попытался установить фокус с помощью focus_force() и focus_set() для виджета, а также для рамки, в которой он находится, однако это тоже не сработало.
Мой соответствующий код указан ниже. Если понадобится больше моего кода, просто дайте мне знать. Целью этого фрагмента кода является метод имени пользователя / пароля, который будет вызываться на протяжении всей моей программы.
Я использую PyCharm Community Edition 2017.2 на Mac OS Sierra 10.12.5. Заранее спасибо!
КОД
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
вам метод admin, а затем вы снова вызываете Tk(), чтобы создать уровень, с которым работаете. Это не очень хорошая практика. Просто используйте команду Toplevel. Смотрите мой пример кода ниже.
Сообщения, которые вы видели, соответствуют (и, по-видимому, корректны) для 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")