今天下午我很无聊,决定用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()
调用的函数来调用另一个函数,这个函数看起来很恶心,但仍然无法正常工作
答案 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>
,因为默认绑定发生在印刷机上。因此,对密钥释放的绑定将看到插入的字符。
另一种解决方案是更改窗口小部件的绑定标记。这个答案提供了一个说明问题的工作示例,并显示了使用绑定标记的解决方案: