3

アイテムをドラッグ アンド ドロップして再配置する機能を備えたリストボックスの作成に関する情報を見つけることができる場所を教えてもらえますか? Perl に関連するものをいくつか見つけましたが、その言語については何も知らず、tkinter を初めて使用するので、かなり混乱しました。リストボックスを生成する方法は知っていますが、ドラッグ アンド ドロップで並べ替える方法がわかりません。

4

3 に答える 3

3

( ではなく)MULTIPLEとして扱っている場合の変更されたレシピを次に示します。selectmodeSINGLE

行われた変更:

  1. すでに選択されている項目をドラッグすると、選択が解除され、ユーザー エクスペリエンスが低下していました。
  2. 選択されたアイテムをクリックすると、クリックから選択解除されます。そこでself.curState、クリックされたアイテムの状態が最初に選択されたかどうかを追跡するビットを追加しました。ドラッグしても、その状態は失われません。
  3. Button-1また、を使用して 2 つのイベントをイベントにバインドしましadd='+'たが、すべてを下に置くだけで回避できる場合がありsetCurrentます。
  4. activestyleは等しい方が好きです'none'
  5. Listbox tk.MULTIPLEの代わりにこれを作りましたtk.SINGLE

コードは次のとおりです。

class Drag_and_Drop_Listbox(tk.Listbox):
  """ A tk listbox with drag'n'drop reordering of entries. """
  def __init__(self, master, **kw):
    kw['selectmode'] = tk.MULTIPLE
    kw['activestyle'] = 'none'
    tk.Listbox.__init__(self, master, kw)
    self.bind('<Button-1>', self.getState, add='+')
    self.bind('<Button-1>', self.setCurrent, add='+')
    self.bind('<B1-Motion>', self.shiftSelection)
    self.curIndex = None
    self.curState = None
  def setCurrent(self, event):
    ''' gets the current index of the clicked item in the listbox '''
    self.curIndex = self.nearest(event.y)
  def getState(self, event):
    ''' checks if the clicked item in listbox is selected '''
    i = self.nearest(event.y)
    self.curState = self.selection_includes(i)
  def shiftSelection(self, event):
    ''' shifts item up or down in listbox '''
    i = self.nearest(event.y)
    if self.curState == 1:
      self.selection_set(self.curIndex)
    else:
      self.selection_clear(self.curIndex)
    if i < self.curIndex:
      # Moves up
      x = self.get(i)
      selected = self.selection_includes(i)
      self.delete(i)
      self.insert(i+1, x)
      if selected:
        self.selection_set(i+1)
      self.curIndex = i
    elif i > self.curIndex:
      # Moves down
      x = self.get(i)
      selected = self.selection_includes(i)
      self.delete(i)
      self.insert(i-1, x)
      if selected:
        self.selection_set(i-1)
      self.curIndex = i

デモの例:

root = tk.Tk()
listbox = Drag_and_Drop_Listbox(root)
for i,name in enumerate(['name'+str(i) for i in range(10)]):
  listbox.insert(tk.END, name)
  if i % 2 == 0:
    listbox.selection_set(i)
listbox.pack(fill=tk.BOTH, expand=True)
root.mainloop()
于 2016-09-02T21:19:51.840 に答える