如何在Python Tkinter中绑定键盘的另一个"Enter"键?
我正在用 Python 3.12.0 写一个 tkinter 应用程序(在 Windows 上),我想绑定键盘上另一个“回车”键(就是在数字键盘那部分的回车键),这样当我按下它时,就能发送我的消息。我使用的是一个文本框,而我需要主回车键来换行。
我用下面的代码解决了我的问题,并且在我的系统上可以正常工作;不过我在寻找更好的解决方案,也不知道这个功能在其他系统上是否能用,或者在不同的操作系统上是否有效。
def foo(event=None):
if not (event.keysym=="Return" and event.state in [
262144, # Caps Lock Off, Num Lock Off, Scroll Lock Off
262146, # Caps Lock On , Num Lock Off, Scroll Lock Off
262152, # Caps Lock Off, Num Lock On , Scroll Lock Off
262154, # Caps Lock On , Num Lock On , Scroll Lock Off
262176, # Caps Lock Off, Num Lock Off, Scroll Lock On
262178, # Caps Lock On , Num Lock Off, Scroll Lock On
262184, # Caps Lock Off, Num Lock On , Scroll Lock On
262186, # Caps Lock On , Num Lock On , Scroll Lock On
]):
return
# do the code
我的问题已经解决了。我只是想知道有没有更好的方法来绑定另一个“回车”键?
编辑:正如我一开始所说的,我只想使用第二个回车键,我觉得我没有表达清楚。
这是我的代码:
import tkinter as tk
def foo(event=None):
print(event)
print(event.state)
# to bind only to other Enter, but not the main Enter:
if event!=None and (not (event.keysym=="Return" and event.state in [
262144, # Caps Lock Off, Num Lock Off, Scroll Lock Off
262146, # Caps Lock On , Num Lock Off, Scroll Lock Off
262152, # Caps Lock Off, Num Lock On , Scroll Lock Off
262154, # Caps Lock On , Num Lock On , Scroll Lock Off
262176, # Caps Lock Off, Num Lock Off, Scroll Lock On
262178, # Caps Lock On , Num Lock Off, Scroll Lock On
262184, # Caps Lock Off, Num Lock On , Scroll Lock On
262186, # Caps Lock On , Num Lock On , Scroll Lock On
])):
return
print("Yey!")
root = tk.Tk()
text = tk.Text(root, width=60, height=8)
text.bind('<Key>', foo)
text.pack()
tk.Button(root, text='Send', command=foo).pack()
root.mainloop()
请查看其他人的回答。
3 个回答
0
绑定到 <KP_Enter>
应该是可以正常工作的。这里有一个例子:
import tkinter as tk
def send_message(event):
print("message sent!")
return "break"
root = tk.Tk()
text = tk.Text(root)
text.pack(fill="both", expand=True)
text.bind("<KP_Enter>", send_message)
tk.mainloop()
0
你可以查看 tkinter 键名,那里有相关的按键绑定列表。你会发现 KP-Enter
是小键盘上的那个键,而 Return
是主键盘上的那个键。
1
试试这个:
def foo(event=None):
if event and (not (event.keysym == "Return" and (event.state & 262144))):
return
print("Yey!")
不过,如果你在按数字键盘上的 Enter
键时,同时按下其他键,比如 shift
、ctrl
、alt
或其他键,打印还是会发生。如果你想要在只按数字键盘的 Enter
键时,不按任何其他键(除了各种锁定键)时才打印,可以试试这个代码:
def foo(event=None):
if event and (not (event.keysym == "Return" and (event.state & 524245) == 262144)):
return
print("Yey!")
最近我发现了第三种选择:试着使用 Extended-Return
的绑定:
def foo(event=None):
print("Yey!")
root = tk.Tk()
text = tk.Text(root, width=60, height=8)
text.bind('<Extended-Return>', foo)
…
这应该和第一个例子的结果一样。