如何获取触发 StringVar().trace_add to 运行 函数的键?

How to get the key that triggered StringVar().trace_add to run function?

我有一个带有 StringVar 作为文本变量的 Entry 小部件。我用 input_content.trace_id = input_content.trace_add("write", solve) 每次 Entry 小部件的内容更改时 运行 solve()

我希望能够确定用户在 运行 求解函数中按下了哪个键。

Entry().bind() 对我不起作用,因为条目似乎没有及时更新(假设我键入 Python,当使用 .bind()获取Entry的内容,会输出Pytho)。请参考下面演示此行为的代码:

from tkinter import*

master = Tk()

def main(event):
    print(f"Inputted character: {event.keysym}")
    print(f"{entry.get() = }")
    print(f"{entry_var.get() = }")

entry_var = StringVar()
entry = Entry(master, textvariable=entry_var)
entry.pack()

entry.bind("<Key>", main)

mainloop()

如您所见,我可以使用 event.keysym 获取最后输入的字符,但条目不会更新,直到 main() 再次为 运行,等等。

我想在运行.

函数时,同时更新最后输入的字符和更新条目内容

I would like to be able to determine what key did the user press that ran the solve function.

变量跟踪无法为您提供该信息。您将需要使用绑定。你说绑定不起作用,但这只是因为你使用它们的方式。

要了解为什么使用 bind 对您不起作用,请参阅 Basic query regarding bindtags in tkinter and How to bind self events in Tkinter Text widget after it will binded by Text widget?

第二个 link 询问 Text 小部件,但是 bind 的行为对于 TextEntry 小部件是相同的。接受的答案显示了使用 Entry 小部件的示例。

简短的回答是在 <KeyRelease> 上绑定,调整绑定标签,使您的绑定出现在默认绑定之后,或者使用 after 将您的代码安排到 运行处理完密钥后。

我 link 提出的两个问题是为了展示如何利用绑定标签,这是一个在事件循环进入“空闲”后使用 after_idle 到 运行 代码的示例"(即:当它完成处理未决事件时):

import tkinter as tk

def handle_keypress():
    print(f"=> {entry.get()}")

root = tk.Tk()
entry = tk.Entry(root)
entry.pack(padx=20, pady=20)
entry.bind("<Any-KeyPress>", lambda event: root.after_idle(handle_keypress))

root.mainloop()