Python TkinterTreectrl drag items

谁说胖子不能爱 提交于 2019-12-22 13:56:08

问题


I am writing a program in Python to allow me to browse through the experimental data I have taken, and also view metadata associated with the experimental conditions for each dataset.

At the heart of this program is the TkinterTreectrl widget, a wrapper for tk treectrl

Despite being rather a novice programmer, so far everything is working well - I can add items, remove items, select them etc etc.

However, I cannot work out how to allow the dragging of items to new locations in the tree. I have found in the documentation many references to drag images, and at the moment I can drag a tantalizing dotted outline around. But I cannot find the events which would be generated on a drag and drop. The closest I find in the manual is the following set of events:

<Drag-begin>
<Drag-receive>
<Drag-end>: Generated whenever the user drag-and-drops a file into a
            directory. This event is generated by the filelist-bindings.tcl
            library code, which is not used by default.

I do not know how to use the "filelist-bindings.tcl library code", but I am not sure this is the correct approach anyway.

In a related query - I thought one way to solve this and similar problems would be to send every event generated by my Treectrl widget to stdout. Is there a way to do this?

A minimal working example here would be rather too large to be of any use, but an excerpt may help:

    # add callbacks for Edit events

    self.t.notify_install('<Edit-begin>')
    self.t.notify_bind('<Edit-begin>', self.edit_begin)
    self.t.notify_install('<Edit-accept>')
    self.t.notify_bind('<Edit-accept>', self.edit_accept)
    self.t.notify_install('<Edit-end>')
    self.t.notify_bind('<Edit-end>', self.edit_end)

    # add callbacks for mouse clicks

    self.t.bind('<Button-1>', self.OnLeftClick)
    self.t.bind('<Button-3>', self.OnRightClick)

    # add callbacks for drag events

    self.t.notify_install('<Drag-begin>')
    self.t.bind('<Drag-begin>', self.OnDrag)
    self.t.notify_install('<Drag-recieve>')
    self.t.bind('<Drag-recieve>', self.OnDrag)
    self.t.notify_install('<Drag-end>')
    self.t.bind('<Drag-end>', self.OnDrag)

Callbacks for Edit events and mouse clicks work fine, attempting to bind the drag events generates _tkinter.TclError: bad event type or keysym "Drag"


回答1:


Ignoring the fact that this question is not the newest one - is there a specific reason why you use self.t.bind instead of self.t.notify_bind?

For me this looks pretty like the point where the Interface to tktreecrtl from Michael is not using the wrapper functionality but attempting to directly bind <Drag-begin> to a Treectrl instance which is based on tkinter.Widget

  • Source Extract:

    class Treectrl(tkinter.Widget):

tkinter.Widget has no possibility to find a '' event as this is generated inside tktreectrl libraries. So you get the

bad event type or keysym "Drag"

Changing to self.t.notify_bind should solve your problem.



来源:https://stackoverflow.com/questions/22894408/python-tkintertreectrl-drag-items

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!