如何在使用.bind调用函数时强制Tkinter小部件刷新

2024-10-04 11:28:04 发布

您现在位置:Python中文网/ 问答频道 /正文

今天下午我很无聊,决定用Python实现一个快速键入测试;为了让它检查我在entry小部件上使用的每个字符后的当前单词,以便在entry小部件中按下任何键时调用函数。在

这很好地工作,并且函数在每次按键时都会被调用,但是当我使用widgetName.get()从条目小部件收集字符串时,.get()没有收集小部件的内容,.get()并没有收集小部件中的内容,只收集在调用函数之前小部件中的内容。在

例如,如果我在entry小部件中输入'p',我的函数将打印'A key was pressed',但是它只会在控制台上打印一个空行。当我继续按“y”时,字符串“P”被输出到控制台,第三次按键时输出“Py”,依此类推。在

这使我相信Tkinter小部件的内容没有被更新,因为.bind()调用发生在小部件内容更新之前,因此小部件的内容只需按一下键。在

我需要知道是否有办法解决这个问题,我做了一些研究,发现我可以在函数中调用root.update()或{},这应该会迫使UI刷新。然而,这并没有帮助我,我仍然面临着同样的问题。在

我的代码如下

root = Tk()
def keyPress(forSomeReasonThisArgumentFixesABug): ##Argument is because bind passes the event to the function
    entryBox.update()
    entry, word = entryBox.get(), wordBox.get()
    print(entry)

wordBox = Entry(root)
wordBox.grid(row=0, column=0)
entryBox = Entry(root)
entryBox.grid(row=1, column=0)
entryBox.bind("<Key>", keyPress)

有人能解释一下我如何在每次按键时将小部件的内容传递给函数(通过参数或在函数内使用.get())。在

提前谢谢 编辑:我还尝试过使用.bind()调用另一个函数,它看起来很恶心,但仍然不起作用


Tags: the函数字符串内容getbind部件update
2条回答

简而言之,默认绑定(导致插入字符的绑定)发生在自定义绑定之后。解决方案是确保绑定发生在默认绑定之后。在

这个答案更详细地说明了到底发生了什么:

https://stackoverflow.com/a/11542200/7432

最简单的解决方案是在<KeyRelease>上绑定,而不是在<Key>上绑定,因为默认绑定发生在报刊上。因此,释放密钥时的绑定将看到插入的字符。在

另一个解决方案是更改小部件的绑定标记。此答案给出了一个工作示例,该示例说明了问题,并显示了使用绑定标记的解决方案:

https://stackoverflow.com/a/3513906/7432

好的,我似乎已经解决了我的问题,但不是我最初打算的那样。 为了查看输入的字符,我对.bind()传递给函数的事件参数使用了.char。这允许我看到字符,但是如果不将用.get()收集的字符串和用{}收集的字符串连接起来,我还是看不到完整的字符串。 这是可行的,但是它看起来不太好,而且似乎不属于Python,所以我仍然对能够更干净、更高效地工作的答案持开放态度。在

def keyPress(event): ##Argument is because bind passes the event to the function
    collectedString = (entryBox.get() + event.char)
    print(collectedString)

相关问题 更多 >