Как связать событие клавиатуры с Python tkMessageBox?
Я разрабатываю небольшое приложение с графическим интерфейсом, которое требуется для работы с указателем беспроводного презентера, которое имеет только две клавиши: стрелка влево и стрелка вправо. Я могу привязать события клавиатуры "Влево" и "Вправо" к корню (главное окно) и вызвать функцию, поэтому большая часть моего приложения работает нормально.
Но когда мне нужно открыть окно сообщения с tkMessageBox, чтобы показать некоторую информацию, единственный способ нажать кнопку "ОК" на клавиатуре - это нажать "пробел", которого нет на указателе моего докладчика. Это означает, что при появлении такого окна сообщения докладчик должен подойти к компьютеру, чтобы нажать кнопку "ОК" с помощью мыши или клавишу "пробел" с помощью клавиатуры.
Можно ли как-нибудь разрешить мне временно привязать "стрелку влево" или "стрелку вправо" к кнопке "ОК", когда появляется такое окно сообщения, и затем восстановить привязку обеих клавиш к исходной функции on_click?
1 ответ
Так как tkMessageBox - это не объект, а вызов tcl, вы не можете так легко перегружать привязки. Просто создайте подкласс Tkinter.Frame, чтобы получить объект, где ключи могут быть связаны.
Подклассы могут, тем не менее, следовать внешнему виду и ощущению MessageBox.
например
#!/usr/bin/python
import Tkinter
class MyBox(Tkinter.Toplevel):
def __init__(self, *args, **kwargs):
Tkinter.Toplevel.__init__(self, *args, **kwargs)
self.__text = Tkinter.StringVar()
self.__text.set("Initialized Text")
Tkinter.Label(self, textvariable = self.__text).grid(row=0, column=0, columnspan=3, sticky=Tkinter.NW+Tkinter.SE)
Tkinter.Button(self, text="OK", command=self.release_func).grid(row=1, column=1, sticky=Tkinter.NW+Tkinter.SE)
self.bind_all("<KeyRelease>", self.release_func)
self.grid()
self.focus_set()
def set_text(self, text="NoText"):
self.__text.set(text)
self.focus_set()
def release_func(self, event=None):
# event=None necessary as we also use button binding.
self.destroy()
root = Tkinter.Tk()
messagebox = MyBox()
messagebox.set_text("Show this message")
root.mainloop()