我要创建一个按钮,如果您单击并拖动它(“绘制”它,???)会被触发。这是我的尝试:
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()
在运行时,它成功报告了一次单击,但是如果我在窗口中的其他位置单击并拖动按钮,则无法报告它已被“绘制”。
出了什么问题,我该如何解决?
答案 0 :(得分:1)
问题:使用tkinter的
Button
事件通过在其上“绘画”来触发"<B1-Motion>"
?
在master.bind(...
小部件上开始运动时,必须使用master
。
另外,您还必须考虑event.x
和event.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