今天下午我很无聊,决定用Python实现一个快速键入测试;为了让它检查我在entry小部件上使用的每个字符后的当前单词,以便在entry小部件中按下任何键时调用函数。在
这很好地工作,并且函数在每次按键时都会被调用,但是当我使用widgetName.get()
从条目小部件收集字符串时,.get()
没有收集小部件的内容,.get()
并没有收集小部件中的内容,只收集在调用函数之前小部件中的内容。在
例如,如果我在entry小部件中输入'p',我的函数将打印'A key was pressed',但是它只会在控制台上打印一个空行。当我继续按“y”时,字符串“P”被输出到控制台,第三次按键时输出“Py”,依此类推。在
这使我相信Tkinter小部件的内容没有被更新,因为.bind()
调用发生在小部件内容更新之前,因此小部件的内容只需按一下键。在
我需要知道是否有办法解决这个问题,我做了一些研究,发现我可以在函数中调用root.update()
或{
我的代码如下
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()
调用另一个函数,它看起来很恶心,但仍然不起作用
简而言之,默认绑定(导致插入字符的绑定)发生在自定义绑定之后。解决方案是确保绑定发生在默认绑定之后。在
这个答案更详细地说明了到底发生了什么:
https://stackoverflow.com/a/11542200/7432
最简单的解决方案是在
<KeyRelease>
上绑定,而不是在<Key>
上绑定,因为默认绑定发生在报刊上。因此,释放密钥时的绑定将看到插入的字符。在另一个解决方案是更改小部件的绑定标记。此答案给出了一个工作示例,该示例说明了问题,并显示了使用绑定标记的解决方案:
https://stackoverflow.com/a/3513906/7432
好的,我似乎已经解决了我的问题,但不是我最初打算的那样。 为了查看输入的字符,我对}收集的字符串连接起来,我还是看不到完整的字符串。
这是可行的,但是它看起来不太好,而且似乎不属于Python,所以我仍然对能够更干净、更高效地工作的答案持开放态度。在
.bind()
传递给函数的事件参数使用了.char
。这允许我看到字符,但是如果不将用.get()
收集的字符串和用{相关问题 更多 >
编程相关推荐