【问题标题】:How to bind keyboard event to Python tkMessageBox?如何将键盘事件绑定到 Python tkMessageBox?
【发布时间】:2018-01-18 10:04:13
【问题描述】:

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

但是当我需要用 tkMessageBox 弹出一个消息框来显示一些信息时,用键盘单击“确定”按钮的唯一方法是按“空格”,这在我的演示者指针上没有。也就是说,当弹出这样的消息框时,演示者必须到电脑前用鼠标点击“确定”按钮,或者用键盘点击“空格”键。

有什么方法可以让我在弹出这样的消息框时暂时将“左箭头”或“右箭头”绑定到“确定”按钮,然后将两个键的绑定恢复到原来的 on_click 函数?

【问题讨论】:

  • 发布您的最小代码以便获得帮助
  • 你应该开发你自己的MessageBox来实现你想要使用的_click()函数。这可能会有所帮助:stackoverflow.com/questions/29619418/…
  • 可以将您的绑定恢复到原始状态,但问题是您是否真的可以绑定到 tkMessageBox。
  • 如果您使用的是 windows 或 osx,则无法将任何键绑定到对话框。

标签: python user-interface tkinter keyboard tkmessagebox


【解决方案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("&ltKeyRelease&gt", 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()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多