【问题标题】:Is there a way to read keypresses from the Enter key?有没有办法从 Enter 键读取按键?
【发布时间】:2022-02-09 10:55:01
【问题描述】:

我一直在 python (v3.9.10) 中鬼混,我发现无法从 enter 键读取按键并让 tkinter 对该按键执行某些操作。我正在尝试制作一个愚蠢的小程序来在我的学校屏幕上显示一些数字,并希望能够快速完成。到目前为止,这是我的代码:

from tkinter import *



#DEFS
def submit():
    submitted=entrybox.get()
    display.config(text=submitted)

app=Tk()

entrybox=Entry(width=10)

entrybox.place(x=10,y=10)

#display label
display=Label(text=' ')
display.place(x=50,y=50)
display.config(font='Arial 72')

#submit button
subbutton=Button(text='SUBMIT',command=submit)
subbutton.place(x=70,y=10)

(对不起,如果我的代码看起来很糟糕,我对 python 和它所提供的一切都很陌生) (我也很抱歉听起来重复和/或愚蠢。像这样的论坛我也不熟悉)

有没有什么方法可以从 enter 键读取按键,同时允许我的 tkinter 的其余部分按预期运行?提前致谢。

【问题讨论】:

标签: python tkinter


【解决方案1】:

您可以使用.bind() 来执行此操作:

app.bind('<Return>', function)

当按下回车键时,这将调用function'&lt;return&gt;'表示返回键或回车键,当返回键事件发生时调用function

你可以像这样将它添加到你的代码中:

from tkinter import *

def submit():
    submitted=entrybox.get()
    display.config(text=submitted)

app=Tk()

entrybox=Entry(width=10)

entrybox.place(x=10,y=10)

#display label
display=Label(text=' ')
display.place(x=50,y=50)
display.config(font='Arial 72')

#submit button
subbutton=Button(text='SUBMIT',command=submit)
subbutton.place(x=70,y=10)

app.bind('<Return>', lambda x: submit())
app.mainloop()

这将满足您的需求...

【讨论】:

  • @hc_dev 公平点,我部分解释了它最初是如何工作的,但我也添加了更多细节。至于关于 Tk 文档的理论,我将把它留给其他人,或者让 OP 在需要时阅读。
  • 解释得很好?️为了进一步阅读,我在我的答案中添加了一些经过研究的链接
  • 这有很大帮助!谢谢!
  • 当然是杰克!
【解决方案2】:

如何绑定和处理事件

在您的小部件上使用bind(sequence, func) 方法(例如Button 甚至是根应用程序Tk)。

参数sequencepredefined events 之一,是键、鼠标事件等的字符串名称。 参数func 是一个回调或处理函数,仅按名称给出(不带括号或参数),它必须有一个Event 的位置参数。

演示

看这个最小的例子:

from tkinter import *

def callback(event):
    print(event)


def quit():   # did we miss something ?
    print("Escape was pressed. Quitting.. Bye!")
    exit()

app = Tk()
app.bind('<Return>', callback)  # on keypress of Enter or Return key
app.bind('<Enter>', callback)  # on mouse-pointer entering the widget - here the app's root window (not confuse with Enter key of keyboard)
app.bind('<Escape>', quit)  # on keypress of Escape key

app.mainloop()  # to start the main loop listening for events

按下以下键后打印:

  1. 按下回车键
  2. 退出键被按下
<KeyPress event keysym=Return keycode=36 char='\r' x=-583 y=-309>
Exception in Tkinter callback
Traceback (most recent call last):
  File "/usr/lib/python3.6/tkinter/__init__.py", line 1705, in __call__
    return self.func(*args)
TypeError: quit() takes 0 positional arguments but 1 was given

注意:

  1. Enter 键被捕获并调用绑定的回调/处理函数 (callback) 打印传递的 event
  2. Escape 键被捕获并调用绑定的回调/处理函数 (quit)。但由于它没有必需的参数(如event),因此调用失败并返回TypeError

添加参数def quit(event):时成功:

<Enter event focus=True x=6 y=188>
<Enter event focus=True x=182 y=45>
<KeyPress event keysym=Return keycode=36 char='\r' x=-583 y=-309>
<Enter event state=Button1 focus=True x=123 y=68>
Escape was pressed. Quitting.. Bye!

注意:

  1. &lt;Enter&gt; 事件是鼠标指针进入(可见)小部件框架时,这里是应用程序的根窗口。
  2. &lt;Escape&gt; 事件退出应用程序

进一步阅读

RealPython:Python GUI Programming With Tkinter 是学习更多内容的丰富教程,尤其是在 Using .bind() 上。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多