如何通过“绘画”按钮来触发按钮?使用tkinter的“ B1-Motion”?

时间:2019-11-23 00:25:57

标签: python tkinter

我要创建一个按钮,如果您单击并拖动它(“绘制”它,???)会被触发。这是我的尝试:

import tkinter as tk

class PaintOverWidget():

    def __init__(self, master):
        b = tk.Button(master, text="UnMark All",command=self.clicked)
        b.bind("<B1-Motion>", self.pressed)
        b.pack()

    def clicked(self):
        print('clicked')

    def pressed(*e):
        print ('painted')

root=tk.Tk()
my_gui = PaintOverWidget(root)
root.mainloop()

在运行时,它成功报告了一次单击,但是如果我在窗口中的其他位置单击并拖动按钮,则无法报告它已被“绘制”。

出了什么问题,我该如何解决?

1 个答案:

答案 0 :(得分:1)

  

问题:使用tkinter的Button事件通过在其上“绘画”来触发"<B1-Motion>"

master.bind(...小部件上开始运动时,必须使用master
另外,您还必须考虑event.xevent.y坐标。

import tkinter as tk


class PaintOverWidget(tk.Button):
    def __init__(self, master, text):
        super().__init__(master, text=text)
        self.pack()
        master.bind("<B1-Motion>", self.on_motion)

    def bbox(self):
        # Return a bbox tuple from the `Button` which is `self`
        x, y = self.winfo_x(), self.winfo_y()
        return x, y, x + self.winfo_width(), y + self.winfo_height()

    def on_motion(self, event):
        bbox = self.bbox()

        if if bbox[0] <= event.x <= bbox[2] and bbox[1] <= event.y <= bbox[3]:
            print('on_motion at x:{} y:{}'.format(event.x, event.y))

if __name__ == '__main__':
    root = tk.Tk()
    root.geometry('200x100')
    PaintOverWidget(root, text="UnMark All").mainloop()

  

输出

on_motion at x:54 y:15
on_motion at x:55 y:15
on_motion at x:55 y:14
...

使用Python测试:3.5-'TclVersion':8.6'TkVersion':8.6