web-dev-qa-db-ja.com

Python tkinter listbox get(ACTIVE)メソッド

現在選択されているリストボックスの項目を印刷しようとしました。たとえば、項目「1」を選択すると「1」が出力され、項目「2」を選択すると「2」が出力されます。以下は、私が試したものです。

from Tkinter import*
root=Tk()
sizex = 600
sizey = 400
posx  = 40
posy  = 20
root.wm_geometry("%dx%d+%d+%d" % (sizex, sizey, posx, posy))
itemsforlistbox=['one','two','three','four','five','six','seven']

def CurSelet(evt):
    value=str((mylistbox.get(ACTIVE)))
    print value

mylistbox=Listbox(root,width=60,height=10,font=('times',13))
mylistbox.bind('<<ListboxSelect>>',CurSelet)
mylistbox.place(x=32,y=90)

for items in itemsforlistbox:
    mylistbox.insert(END,items)
root.mainloop()

私の問題は、リストボックスで項目を選択するたびに、以前に選択した項目が実際に印刷されることです。たとえば、リストで項目「2」を選択すると、「1」が印刷されます。より明確にするために、以下を参照してください

(1)「1つ」を選択すると、「1つ」と表示されました

(2)「2つ」を選択すると、「1つ」が再度印刷されます

(3)「3」を選択すると、「2」と印刷されます...

私は何かを逃していますか?または、get(ACTIVE)の動作を誤解しましたか?あなたの助けに感謝します。

14
Chris Aung

アイテムをクリックするとアクティブになります。つまり、ListboxSelectメソッドが戻った後です。つまり、アクティブだったものは何でも印刷することになりますbeforeこのクリック(つまり、一般に、クリックしたもの前回)。

また、「選択された」を何度も参照することを考えると、必要なのは選択されたの値であり、アクティブの値ではないので、そのため。

_selectmode=SINGLE_またはBROWSE(デフォルト、使用しているもの)リストボックスを含むリストボックスの場合、これらの両方を簡単に修正できます。これを変更するだけです:

_mylistbox.get(ACTIVE)
_

に:

_mylistbox.get(mylistbox.curselection())
_

MULTIPLEまたはEXTENDEDを処理する必要がある場合は、もちろん、1つではなく0から7までの選択肢があるため、次のようなことを行う必要があります。

_values = [mylistbox.get(idx) for idx in mylistbox.curselection()]
print ', '.join(values)
_

その間、なぜstr((mylistbox.get(ACTIVE)))、あるいはstr(mylistbox.get(ACTIVE))を実行していたのかはわかりません。単一のインデックスを持つ_mylistbox.get_の結果は、挿入したものと同じ文字列になります。

25
abarnert

これは私にとってはうまくいくようです:

mylistbox.get(ANCHOR)

コードに基づいて、現在のアイテムを印刷します。

5
Himel Das

これを使用できます。リストボックスは必要ありません。したがって、複数のリストボックスがある場合、任意の場所から値を取得します

from tkinter import*
root=Tk()
sizex = 600
sizey = 400
posx  = 40
posy  = 20
root.wm_geometry("%dx%d+%d+%d" % (sizex, sizey, posx, posy))
itemsforlistbox=['one','two','three','four','five','six','seven']

def CurSelet(event):
    widget = event.widget
    selection=widget.curselection()
    picked = widget.get(selection[1])
    print(picked)

mylistbox=Listbox(root,width=60,height=10,font=('times',13))
mylistbox.bind('<<ListboxSelect>>',CurSelet)
mylistbox.place(x=32,y=90)

for items in itemsforlistbox:
    mylistbox.insert(END,items)
root.mainloop()
2
Mixstah

user1576772が述べているように、正しい答えは次のとおりです。

_mylistbox.get(ANCHOR)
_

curselection()の問題は、毎回現在選択されているリスト全体を返すことです。

リストボックスをスクロールして、最後に選択したアイテムを常に前後に移動したい状況を考えてみてください(強調表示されたリストの最後のアイテムではなく、ユーザーが最後に押したアイテム)。 curselection()は、現在選択されているすべてのアイテムを提供しますが、どのアイテムが最後に選択されたかはわかりません。

1
F Karam

picked = widget.get(selection[1])picked = widget.get(selection[0])である必要があります。

そうしないと、「範囲外のインデックス」エラーが発生します。

0
Susan