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

时间:2015-06-01 18:18:48

标签: python tkinter updates

今天下午我很无聊,决定用Python实现速度打字测试;为了允许它在我在条目小部件上使用widgetName.bind("<Key>", functionName)的每个字符后检查当前单词,以便在条目小部件中按任何键时调用该函数。

这很好用,并且在每次按键时都会调用该函数,但是当我使用widgetName.get()从条目小部件中收集字符串时,我的问题就出现了; .get()没有收集窗口小部件的内容,只收集调用函数之前窗口小部件中的内容。

例如,如果我输入了&#39; P&#39;进入小部件,我的功能将打印&#39;按下了一个键&#39;但是它只会在控制台上打印一个空白行。当我继续按下&#39; y&#39;时,字符串&#39; P&#39;在第三次按下&#39; Py&#39;输出到控制台。输出等等。

这使我相信Tkinter小部件的内容尚未更新,因为.bind()调用在小部件内容更新之前发生,因此小部件的内容是一个按键背后。

我需要知道是否有解决方法,我做了一些研究,发现我可以在函数中调用root.update()widget.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()调用的函数来调用另一个函数,这个函数看起来很恶心,但仍然无法正常工作

2 个答案:

答案 0 :(得分:0)

好吧,我似乎解决了我的问题,但不是按照我原来打算的方式。 为了查看输入的字符,我在.char传递给函数的事件参数上使用了.bind()。这允许我查看角色,但是我仍然看不到完整的字符串,而没有连接用.get()收集的字符串和用.char收集的字符串。 这是有效的,但它看起来不是很好,并且似乎不属于Python,所以我仍然愿意接受更干净,更有效的答案。

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

答案 1 :(得分:0)

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

这个答案详细介绍了究竟发生了什么:

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

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

另一种解决方案是更改窗口小部件的绑定标记。这个答案提供了一个说明问题的工作示例,并显示了使用绑定标记的解决方案:

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