python 2.7.6 / Tkinter中奇怪的字符串覆盖行为

时间:2016-05-02 16:45:23

标签: python tkinter

我是一位经验丰富的程序员,但对Python很陌生。我一直在修补Tkinter的一些教程代码。该程序在终端中运行并打印,处理窗口上的事件:

from Tkinter import *

root = Tk()

mystring = ''

def keypress(event):
    globals()['mystring'] = globals()['mystring'] + event.char

def reveal(event):
    print mystring

def leftclick(event):
    frame.focus_set()
    print "clicked at", event.x, event.y

frame = Frame(root, width=100, height=100)
frame.bind("<Key>", keypress)
frame.bind("<Button-1>", leftclick)
frame.pack()
root.bind("<Return>", reveal)
root.mainloop()

所以你在终端中运行它并点击结果窗口给它焦点。然后,每次按一个键,该字母都会添加到mystring的末尾。按<enter>时,到目前为止的字符串将打印到终端。因此,如果您键入abc<enter>,则会打印出abc。到目前为止一切都很好。

现在,看看这一系列事件:

输入:abcd<enter>
输出:abcd

输入:efg<enter>
输出:efgd

输入:hi<enter>
输出:higd

输入:jklmnop<enter>
输出:jklmnop

输入:qrs<enter>
输出:qrsmnop

好像每个reveal调用都会重置mystring指向字符串开头的指针,而无需重新初始化mystring。这里真的很奇怪:如果你替换

root.bind("<Return>", reveal)

frame.bind("<Return>", reveal)
然后奇怪的行为就消失了。正如您所期望的那样,任何新字符都会附加在字符串的末尾。所以,不知怎的,Tkinter正在这样做。

我真的不需要解决这个问题,我怀疑是否有人可以解释它。为了互联网的利​​益,我只是把它扔到那里。使用frame.bind(),我猜这是故事的寓意。

1 个答案:

答案 0 :(得分:0)

您的事件绑定也捕获回车并将其附加到mystring,因此您的数据将类似于“abcd \ refg \ rhi \ r \ jklmnop \ rqrs \ r \ n”。如果您将该字符串打印到终端,您将看到相同的奇怪结果。

如果您将keypress功能更改为这样,您可能会得到您期望的输出:

def keypress(event):
    if event.char != "\r":
        globals()['mystring'] = globals()['mystring'] + event.char