2016-06-27 12 views
0

私はanykeyを押してからマウスの位置を返すのを待つことができる関数を書こうとしています。キー(イベント)関数からxyの値を取得し、get_mouse_pixel()でそれらを返す方法については混乱しています。イベントバインドされた関数からの戻り値

from Tkinter import * 
import win32api 

def get_mouse_pixel(): 
    x,y = 0,0 

    root = Tk() 

    def key(event): 
     x,y = win32api.GetCursorPos() 
     print "pressed", repr(event.char) 
     print "mouse position", x, y 
     root.quit() 

    def callback(event): 
     print "clicked at", event.x, event.y 

    frame = Frame(root, width=0, height=0) 
    frame.bind("<Key>", key) 
    frame.bind("<Button-1>", callback) 
    frame.pack() 
    frame.focus_set() 

    root.mainloop() 

print x,y 
return x,y 

get_mouse_pixel() 
+0

key()でxとyを取得しますが、決して呼び出しません。関数内で関数を定義するのは良い方法ではありません。 – Psytho

+0

@ Alex.Sなぜ関数内で関数を定義するのは良い習慣ではないのですか? – thebjorn

答えて

1

あなたは内部関数を使用していて、それらに値を与えるので、あなたが設定しているxyは新しい変数ではないことをあなたの内部の機能(key())を伝える必要があり、彼らがものです外側の範囲にある。 Python3のnonlocalキーワード(例えばnonlocal x,yx,y = win32api.GetCursorPos())、またはpython2のglobalでこれを行うことができます。あなたがそれらに割り当てていない場合、内部の範囲でそれらから読むことができますが、それらに再割り当てすることはできません。

別の方法では、以外の変数を変更することができます。私。 xyを辞書d = {'x':0, 'y':0}に変更すると、key()はそのローカル以外の変更可能なデータ型を変更することができます。

# Define x/y as dictionary d higher 
def key(event): 
    d['x'],d['y'] = win32api.GetCursorPos() 
    # Everything else you would like to do with x/y. 

これは非常に一般的な名前xyでグローバル変数と潜在的に破壊的な事をすることなく、新しい値を保持するための辞書dを変更します。

dictメソッドを使用すると、辞書全体を返すか、必要に応じて素敵なintを返すように各部分(つまりreturn d['x'], d['y'])を返すことができます。

+0

ありがとう!キーワードglobalを試してみました。他のプログラムでget_mouse_pixel()関数を複数回呼び出す場合、このグローバル宣言は何かに影響しますか? – Siyu

+0

@Siyuあなたの他のプログラム中の変数の名前が 'x'または' y'であれば、それは衝突し、追跡が困難な奇妙なバグを引き起こします。より密接なカプセル化が可能なので、辞書メソッドを使用することを強くお勧めします(または、より限定されているので、 'nonlocal'を使うことができるように、Python 3に入れ替えてください)。 – Delioth