2016-05-02 12 views
0

私はかなり経験豊富なプログラマーですが、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()を使って、私はストーリーのモラルだと思います。

+0

あなた '印刷のrepr(のMyString)'とどうなりましたか?私はあなたの 'key'ハンドラも' 'のために解雇されていると思いますが、あなたはマイクロソフト様式の復帰改行コンボ(' '\ r \ n' ')を取得しています - 少なくとも、それは私には理にかなっています。 – mgilson

+0

mgilson、それは実際に意味があります。文字列はCRで終わるので、文字列の先頭の文字はまだ存在しますが、印刷時に上書きされます。''イベントをルートではなくフレームにバインドすると、 ''イベントはフレームコンテキストの ''イベントでもないので、正常に動作します( ''ハンドラは呼び出されません)。しかし、それは変です。私はLinuxを実行しています。あなたはCRが事だとは思わないでしょう。 –

+0

rootにバインドして 'repr(mystring)'を出力すると、 '' abc \ rdef \ rghij \ r "の行に沿った出力が表示されます –

答えて

0

イベントバインディングでもキャリッジリターンがキャプチャされ、mystringに追加されるため、データは "abcd \ refg \ rhi \ r \ jklmnop \ rqrs \ r"のようになります。その文字列を端末に出力すると、同じ奇妙な結果が表示されます。

あなたはこのように見えるためにあなたのkeypress機能を変更した場合、あなたはおそらく、あなたが期待する出力を得るでしょう:

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

ありがとう、Bryan。私はこれに賢明な答えがあったことに驚いています。「戻り値はキーです」と「印刷された文字列でCRを見ることはできません」という点では考えていなかったので、 –

関連する問題