私はかなり経験豊富なプログラマーですが、Pythonには初めてです。私はTkinterのチュートリアルコードを試してきました。ウィンドウのイベントを処理し、端末でこのプログラムを実行して印刷、:Pythonで異常な文字列の上書き動作2.7.6/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
のポインタをリセットしているかのようにです。それは本当に奇妙な取得するのはここです:あなたは
frame.bind("<Return>", reveal)
と
root.bind("<Return>", reveal)
を置き換えるならば、奇妙な動作が表示されなくなります。文字列の最後に新しい文字が追加されます。期待通りです。だから何とかこれをやっているのはTkinterだ。
私は本当にこれを修正する必要はありません。誰もそれを説明することはできません。私はちょうどインターネットの利益のためにそこにそれを投げているのです。 frame.bind()
を使って、私はストーリーのモラルだと思います。
あなた '印刷のrepr(のMyString)'とどうなりましたか?私はあなたの 'key'ハンドラも' 'のために解雇されていると思いますが、あなたはマイクロソフト様式の復帰改行コンボ(' '\ r \ n' ')を取得しています - 少なくとも、それは私には理にかなっています。 –
mgilson
mgilson、それは実際に意味があります。文字列はCRで終わるので、文字列の先頭の文字はまだ存在しますが、印刷時に上書きされます。''イベントをルートではなくフレームにバインドすると、 ''イベントはフレームコンテキストの ''イベントでもないので、正常に動作します( ''ハンドラは呼び出されません)。しかし、それは変です。私はLinuxを実行しています。あなたはCRが事だとは思わないでしょう。 –
rootにバインドして 'repr(mystring)'を出力すると、 '' abc \ rdef \ rghij \ r "の行に沿った出力が表示されます –