Как связать событие клавиатуры с 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()
Другие вопросы по тегам