如何将<b1-motion>绑定到tkinter Button小部件?</b1-motion>

时间:2012-09-07 10:54:49

标签: python tkinter bind

我想使用Button小部件来拖动项目。如果我正在使用Label小部件,我可以绑定到小部件并获取事件,但Button小部件似乎消耗了所有鼠标事件。有什么想法吗?

背景:我正在创建一个网格,其中每一行都有几个按钮来执行各种操作。我希望能够通过单击拖动小部件重新排序行,然后上下拖动小部件(用它携带整个行)。这是我的GUI:

+---+--------------+---+---+
|        Title         | + |
+---+--------------+---+---+
| - | Label widget | = | > |
+---+--------------+---+---+
| - | Label widget | = | > |
+---+--------------+---+---+
| - | Label widget | = | > |
+---+--------------+---+---+

“+”是一个添加行的按钮(通过弹出窗口填充数据),“ - ”是一个删除行的按钮,“&gt;”是一个按钮,可让您编辑(通过弹出窗口)行的数据。通过单击并拖动“=”,可以对行重新排序。目前,它是一个图像标签,但我希望它是一个像其他控件一样的按钮。

1 个答案:

答案 0 :(得分:0)

按钮小部件与任何其他小部件没有什么不同,除了它已经为某些事件绑定的事实(这意味着你需要禁用它们,或者准备好使用它们)。你仍然可以将任何你想要的事件绑定到一个按钮,但我会问你为什么要为此目的使用一个按钮。大多数人都不希望能够拖动按钮 - 按钮提供能够推动它的功能,而不是拖动它。

如果是我,我会重新排列你的按钮:

+---+--------------+---+---+
|        Title         | + |
+---+--------------+---+---+
| = | Label widget | > | - |
+---+--------------+---+---+
| = | Label widget | > | - |
+---+--------------+---+---+
| = | Label widget | > | - |
+---+--------------+---+---+

然后,将“=按钮”更改为看起来像您可以抓取的图像。通常情况下,我看起来像有两条或三条水平线的图像就像给出“抓地力”一样。另外,我认为通过抓住一端而不是抓住中间的某个位置来移动一些东西更为常见。

现在你可以抓住左边缘(这可以说是一种更自然的移动方式),并且所有的添加/删除按钮都在同一列中排列。另外,编辑弹出按钮正好对着正在编辑的东西,这对我来说很有意义。

您还可以考虑将布局更改为:

+---+--------------+---+---+---+
|             Title            |
+---+--------------+---+---+---+
| = | Label widget | > | - | + |
+---+--------------+---+---+---+
| = | Label widget | > | - | + |
+---+--------------+---+---+---+
| = | Label widget | > | - | + |
+---+--------------+---+---+---+

上述优势在于它允许您在中间添加一个按钮,而不是总是在末尾添加或删除,这意味着您的用户可能会学会能够通过一次单击将行精确地添加到他们想要的位置而不是点击和拖动。