2

私の環境は、Windows 7 で実行されている Python 2.7 です。

ユーザーが「アクティブな」アイテム(つまり、フォーカスのあるアイテム)を変更したことに応じて、コールバックをトリガーするTkinter Listboxを取得しようとしています。<<ListboxSelect>>これを実現するためにイベントへのバインディングを使用していますが、うまく機能しています。

コールバック自体は、新しいアクティブなアイテムが何であるかを確認し、それに応じて何らかの処理を実行することになっています。このロジックは、上下の矢印キーを使用してアクティブなアイテムを変更したときに期待どおりに動作します。しかし、代わりに新しいアイテムをポイント アンド クリックすると、コードは以前のアクティブなアイテムを現在のアイテムとして誤って識別します。

これは、私が得ている動作を示す簡略化されたコード サンプルです。

import Tkinter as tk

#Root window
root = tk.Tk()

#Callback to show focus change
def updateDisplay(*args):
    focusIndex = str(lb.index(tk.ACTIVE))
    ctrlFI.set('Focus is at index '+focusIndex)

#Control variables
ctrlLB = tk.StringVar()
ctrlFI = tk.StringVar()

#Widgets
lb  = tk.Listbox(root,
                 width=20, height=10,
                 relief=tk.FLAT,highlightthickness=0,
                 selectmode=tk.EXTENDED,
                 activestyle='dotbox',
                 listvariable=ctrlLB)
lbl = tk.Label(root,
               justify=tk.LEFT, anchor=tk.W,
               textvariable=ctrlFI)
lb.grid(row=0,column=0,sticky=tk.NW,padx=(5,0),pady=5)
lbl.grid(row=1,column=0,columnspan=2,sticky=tk.NW,padx=5,pady=5)

#Listbox binding to trigger callback
lb.bind('<<ListboxSelect>>',updateDisplay)

#Initializations to prep GUI
ctrlLB.set('Index0-entry Index1-entry Index2-entry Index3-entry Index4-entry')
ctrlFI.set('Ready')

#Begin app
tk.mainloop()

矢印キーを使用した場合の結果は次のとおりです。

矢印キー

しかし、マウスでクリックすると、次のようになります。

マウスクリック

情報は 1 つ遅れて表示され、代わりに前の選択が表示されます。(同じ項目をもう一度クリックすると、「追いつきます」。)

だから私の質問は:

  1. 不一致の原因は何ですか?
  2. マウスクリックで正しい結果が得られるように修正するにはどうすればよいですか?
4

1 に答える 1