如何将键盘事件绑定到Python tkMessageBox?

时间:2018-01-18 10:04:14

标签: python user-interface tkinter keyboard tkmessagebox

我正在开发一个小型GUI应用程序,它需要使用无线演示器指针,该指针只有两个键:左箭头和右箭头。我可以绑定键盘事件" Left"和#34;对"到根(主窗口)并调用一个函数,所以我的应用程序的大部分工作正常。

但是当我需要弹出一个带有tkMessageBox的消息框来显示一些信息时,唯一可以点击" OK"带键盘的按钮是按"空格",我的演示者指针上没有。这意味着当弹出这样的消息框时,演示者必须去计算机点击" OK"鼠标按钮,或"空格"用键盘键。

有没有办法允许我暂时绑定"左箭头"或"右箭头"到" OK"弹出这样的消息框时按钮然后将两个键的绑定恢复到原来的on_click函数?

1 个答案:

答案 0 :(得分:1)

由于tkMessageBox不是一个对象而是一个tcl调用,因此不能重载那么简单的绑定。只需将Tkinter.Frame子类化,即可获得一个可以绑定键的对象。

但是,子类可以遵循MessageBox的外观和感觉。

e.g。

#!/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()