我是一位经验丰富的程序员,但对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()
,我猜这是故事的寓意。
答案 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