2016-11-16 2 views
0

私はPython 3.5.2でtkk.Comboboxテーマウィジェットを使用しています。私は値が選択されたときにアクションが起こるようにしたい。パイソンdocstkinterで<ComboboxSelected>仮想イベントを使用する方法

、それは言う:ユーザーは値のリストから要素を選択したとき

コンボボックスウィジェットを<<ComboboxSelected>>仮想イベントを生成します。

cbox.bind("<<ComboboxSelected>>", function) 

しかし、私はそれを動作させることはできません。ここでは、スタック上の

、イベントをバインドする方法を示して回答数(12、など)があります。

import tkinter as tk 
from tkinter import ttk 

tkwindow = tk.Tk() 

cbox = ttk.Combobox(tkwindow, values=[1,2,3], state='readonly') 
cbox.grid(column=0, row=0) 

cbox.bind("<<ComboboxSelected>>", print("Selected!")) 

tkwindow.mainloop() 

「選択済み」のインスタンスが1つ表示されます。すぐに私はこのコードを実行すると、何もクリックせずに。しかし、実際にコンボボックスで何かを選択すると、何も起こりません。

違いがある場合は、Windows 7でIDLEを使用しています。

私には何が欠けていますか?

+0

um、なぜdownvote? – bitsmack

+0

私はちょうど補償するためにupvotedしましたが、誰が彼/彼女の理由を持っていたdownvoted。理由の1つは、この問題が初めて発生するのではないことが考えられます。 – nbro

答えて

4

問題はイベント<<ComboboxSelected>>ではありませんが、bind関数が第2引数としてコールバックを必要とするという事実があります。

あなたは:あなたは基本的にコールバックとしてprint("Selected!")への呼び出しの結果を代入している

cbox.bind("<<ComboboxSelected>>", print("Selected!")) 

問題を解決するには、イベントが発生するたびに呼び出す関数オブジェクト(オプション1、推奨のもの)を割り当てるか、ラムダ関数(オプション2)を使用します。

import tkinter as tk 
from tkinter import ttk 

tkwindow = tk.Tk() 

cbox = ttk.Combobox(tkwindow, values=[1,2,3], state='readonly') 
cbox.grid(column=0, row=0) 


def callback(eventObject): 
    print(eventObject) 

cbox.bind("<<ComboboxSelected>>", callback) 

tkwindow.mainloop() 

callback()の不在:cbox.bind("<<ComboboxSelected>>", callback)

は、ここでオプション1です。ラムダ関数とその使用方法が何であるか

import tkinter as tk 
from tkinter import ttk 

tkwindow = tk.Tk() 

cbox = ttk.Combobox(tkwindow, values=[1,2,3], state='readonly') 
cbox.grid(column=0, row=0) 

cbox.bind("<<ComboboxSelected>>", lambda _ : print("Selected!")) 

tkwindow.mainloop() 

チェック:

は、ここでオプション2です!

チェックこの記事をイベントとバインディングについての詳細を知るために:投稿用

http://effbot.org/tkinterbook/tkinter-events-and-bindings.htm

+0

オプション1とオプション2を交換することをお勧めします。この場合はlambdaを使用する理由はなく、コードを混乱させるだけです初心者に。あなたの2番目の選択肢が最初に来て、それがベストプラクティスであることを説明するべきです。あなたが完全になりたいのであれば、多くの人がラムダに対して 'functools.partial'を好むでしょう。 –

+0

@BryanOakleyさて、スワップします;) – nbro

+1

ありがとう、nbro!これは私をつかまえた。 – bitsmack

0

おかげであなたを。私は* argsを試してバインドとボタンでも動作します:

import tkinter as tk 
from tkinter import ttk 
tkwindow = tk.Tk() 
cbox = ttk.Combobox(tkwindow, values=[1,2,3], state='readonly') 

def callback(*args): 
    print(eventObject) 

cbox.bind("<<ComboboxSelected>>", callback) 
btn = ttk.Button(tkwindow, text="Call Callback", command=callback); 

tkwindow.mainloop() 
関連する問題