2017-01-28 20 views
1

TkinterはTcl/Tkに由来しますが、Tcl/Tkほど完全ではありません。 Tcl/Tkバインド関数には、tkinterにはないいくつかの属性があります(例えば、%dはイベントhttps://www.tcl.tk/man/tcl8.4/TkCmd/bind.htm#M24の詳細フィールドを返します)。
Tcl/Tkスクリプトはpythonの "eval"関数で使うことができますが、Tcl/Tkスクリプトでtkinterウィジェットを宣言する方法はわかりません。PythonのTkinterのウィジェットでTcl/Tkバインド関数を使うには?

Tkinterウィジェットでこの関数とその属性を使用するにはどうすればいいですか?

+2

あなたは「どのように私はこの機能を使用することができます」と言うとき、あなたは何を意味するのか「この機能」によって?あなたは 'eval'を参照していますか?バインディングで '%d'を使う方法を尋ねていますか? –

+0

私はバインディングで%dを使用する方法を意味します。 – Iman

答えて

3

"データ"フィールド(つまり:%d置換)を使用するバインディングを作成する方法を尋ねる場合は、そのためにいくつかのtclコードを呼び出す必要があります。これには、Python関数を呼び出すtclコマンドを作成し、tclを使用してその関数にイベントをバインドするという2つのステップが必要です。

まず、イベントを作成して「データ」フィールドを設定できるPythonプログラムを作成しましょう(これは後で作成するrootという名前のグローバル変数の存在を前提としています)。この関数を呼び出すと、データフィールドに文字列が入力されたカスタムイベントが生成されます。

def create_custom_event(): 
    root.event_generate("<<Custom>>", data="Hello, world") 

次に、私たちはイベントが発生したときに呼び出される関数を作成する必要があり、ボタンを押す

import tkinter as tk 
root = tk.Tk() 
button = tk.Button(root, text="click me", command=create_custom_event) 
button.pack(side="top", padx=20, pady=20) 
root.mainloop() 

次に、その関数を呼び出すプログラムを作成することができます。 dataフィールドを設定する予定であるため、この関数は%d代入の値である1つの値を受け入れる必要があります。あなたが%d置換を使用したいので

def callback(detail): 
    print("detail: %s" % detail) 

は、我々は、Tclを経由してバインディングを作成する必要があります。しかし、tclは私たちのpython関数を自動的には知りませんので、関数をtclに登録する必要があります。それでは、tclインタフェースを介してbindを呼び出してバインディングを設定するだけです。

最初の手順は、コールバックを登録することです。関数を作成しました。この関数を呼び出すtcl関数を作成するだけです。幸いにも、tkinterはregisterコマンドでこれを行う方法を提供しています。あなたはこのようにそれを使用します。

cmd = root.register(callback) 

これはPython関数(この場合はcallback)を取り、その関数を呼び出しますTCLコマンドを作成します。 registerは、cmdという名前の変数に格納するtclコマンドの名前を返します(名前は関係ありません)。

次に、このコマンドを呼び出すためにTcl経由でバインディングを設定する必要があります。私たちは実際のTCLスクリプトでこれをやっていた場合、コマンドは(「」ルートウィンドウを表します)、このようなものになります。

root.tk.call("bind", root, "<<Custom>>", cmd + " %d") 

お知らせ:

bind . <<Custom>> {callback %d} 

をPythonの同等はこれですcallの引数とtcl引数の間に1対1の対応があることを示します。好都合なことに、tkinterウィジェットのデフォルトの文字列表現は内部のtcl名なので、呼び出しでウィジェットを直接使うことができます(ただしpedantically、おそらくstr(root)を使うべきです)。あなたがボタンをクリックしたとき:すべて一緒にそれを置く

は「こんにちは、世界の詳細を」:プリントアウトしている、私たちはこれを与える

import tkinter as tk 

def callback(detail): 
    print("detail: %s" % detail) 

def create_custom_event(): 
    root.event_generate("<<Custom>>", data="Hello, world") 

root = tk.Tk() 

button = tk.Button(root, text="click me", command=create_custom_event) 
button.pack(side="top", padx=20, pady=20) 

cmd = root.register(callback) 
root.tk.call("bind", root, "<<Custom>>", cmd + " %d") 

root.mainloop() 
+0

完全に助けてくれました。ありがとうございました。 – Iman

関連する問題