【发布时间】:2020-08-18 10:31:20
【问题描述】:
我正在使用 tkinter 制作一个应用程序,这是一个用于在 python 中进行 GUI 编程的模块,我想要一个按钮来响应鼠标点击以及键盘上的输入键。有什么办法吗?
【问题讨论】:
-
如果按钮获得键盘焦点,通常
space键可以像鼠标点击一样触发按钮命令。
我正在使用 tkinter 制作一个应用程序,这是一个用于在 python 中进行 GUI 编程的模块,我想要一个按钮来响应鼠标点击以及键盘上的输入键。有什么办法吗?
【问题讨论】:
space键可以像鼠标点击一样触发按钮命令。
是的,有多种方法可以做到这一点。首先,让我们更好地理解像invoke() 这样的按钮方法,它用于调用作为参数传递给command 参数的回调函数。因此将invoke() 方法绑定到<Return> 序列,我们可以使用return 键如果按钮有焦点 调用回调函数。要获得焦点到按钮,我们可以使用选项卡,系统默认边框将指示哪个小部件具有焦点。
看一下这个例子,这里的回调函数可以通过单击按钮以及在按钮获得焦点时按return键来调用。要将焦点移到按钮上,请按 tab 键,然后按 return 键。
import tkinter as tk
import tkinter.ttk as ttk
def func():
print('Button is pressed')
root = tk.Tk()
root.geometry('200x200')
b1 = ttk.Button(root, text='Button 1', command=func)
b1.bind('<Return>', lambda e: b1.invoke())
b1.pack()
root.mainloop()
【讨论】:
ttk.button 将获得焦点,但使用 tk.button 可以获得您需要按下的焦点制表键。有时,只需使用 Tab 键填写表单并通过按 enter 或使用键盘与其他按钮交互而不是移动到鼠标执行点击来提交表单会更容易。
Label、Entry 和Button 组成的100 个单元格的表格,那可能会变得非常荒谬。
您可以将多个东西绑定到小部件,包括按钮,但专门将按键绑定到按钮通常不是一个可行的解决方案。原因很简单。为了让小部件识别按键,它必须具有焦点。通常,小部件获得焦点的方式是通过鼠标单击或选项卡。您可以单击您的小部件,以便您可以按回车键(这实际上不适用于Button 小部件),或者您可以多次按 Tab 直到按钮获得焦点,然后按回车键。这可以像几个或 1000 个选项卡一样简单。这取决于您的应用和标签顺序中的小部件数量。
您可以做的是使用bind_all 将按键重定向到您的点击功能(如下所示)。请记住,如果您在屏幕上有类似Text 的小部件,并且您正在输入它,那么每次您按下回车键时,它都会“点击”您的按钮。当然,如果你的Text 小部件有焦点,你可以简单地按下按键unbind,如果它失去焦点,你可以再次按下bind,但这可能会变得一团糟。特别是如果您有很多 Text 小部件。我看到您这样做的唯一方法是使用 F 键(F1、F2 等)或组合键(如 Shift+Return)bind_all,这不是常见的按键操作。
import tkinter as tk
class App(tk.Tk):
def __init__(self):
tk.Tk.__init__(self)
tk.Button(self, text="click", command=self.click).pack()
self.bind_all('<Return>', self.click)
def click(self, event=None):
if event:
print('I have been virtually clicked')
else:
print('I have been clicked')
if __name__ == "__main__":
App().mainloop()
【讨论】:
tab 键在小部件之间转移焦点,而不仅仅是通过鼠标单击。