如何在Python Tkinter中绑定键盘的另一个"Enter"键?

1 投票
3 回答
125 浏览
提问于 2025-04-14 16:57

我正在用 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 键时,同时按下其他键,比如 shiftctrlalt 或其他键,打印还是会发生。如果你想要在只按数字键盘的 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)
…

这应该和第一个例子的结果一样。

撰写回答