2015-06-01 28 views
-1

今天下午我很无聊,决定在Python中实现一个速度打字测试;为了在每个字符后检查当前单词,我在入口窗口小部件上使用了widgetName.bind("<Key>", functionName),以便每当在入口窗口小部件中按下任何按键时调用该函数。如何在使用.bind调用函数时强制刷新Tkinter小部件

这工作正常,每次按键时都会调用该函数,但是当我使用widgetName.get()从条目窗口小部件收集字符串时发生了问题; .get()没有收集小部件的内容,只有那些在调用函数之前的小部件的内容。例如,如果我在输入窗口小部件中键入'P',我的功能将打印'按下一个键',但是它只会向控制台打印一个空行。当我继续按'y'时,字符串'P'被输出到控制台,当第三个按键'Py'被输出时等等。

这让我相信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) 

可能有人请解释一下我怎么能(通过获得()通过一个参数或函数中)在每个按键通过widget的内容的功能。

在此先感谢 编辑:我也曾尝试使用.bind()调用的函数调用另一个函数,它看起来恶心,仍然无法正常工作

回答

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) 
+0

注:您的解决方案将不能很好地工作,如果触发结合,关键是删除键,或者如果用户将光标移动到了字符串末尾的任何位置。 –

+0

是的,我已经意识到并解决了退格问题。光标的移动不应该成为问题,因为用户需要很快地输入单个单词。 –

0

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

这个答案进入有更详细的了解究竟发生了:

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

最简单的办法是绑定在<KeyRelease>而非<Key>,因为默认绑定在印刷机上发生。因此,释放密钥的绑定将会看到插入的字符。

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

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

相关问题