如何在点击事件 Tkinter Python 上在 canvas 上画一个点
How draw a dot on canvas on click event Tkinter Python
我有以下一段代码,它在 canvas 中拍摄图像,然后每当我单击绘画功能时都会在其上绘制一个点。
一切正常除了绘画功能没有按预期工作。
期望输出
点击事件绘制一个点。无需拖动点击事件
实际产量
我必须拖动鼠标单击事件才能在 canvas 上看到绘图。
我猜绘画功能可能有点问题。但是,我一直没能知道它到底是什么。
from tkinter import *
from PIL import Image, ImageTk
class Main(object):
def __init__(self):
self.canvas = None
def main(self):
master = Tk()
# Right side of the screen / image holder
right_frame = Frame(master, width=500, height=500, cursor="dot")
right_frame.pack(side=LEFT)
# Retrieve image
image = Image.open("./image/demo.JPG")
image = image.resize((800, 700), Image.ANTIALIAS)
photo = ImageTk.PhotoImage(image)
# Create canvas
self.canvas = Canvas(right_frame, width=800, height=700)
self.canvas.create_image(0, 0, image=photo, anchor="nw")
self.canvas.pack()
self.canvas.bind("<B1-Motion>", self.paint)
mainloop()
def paint(self, event):
python_green = "#476042"
x1, y1 = (event.x - 1), (event.y - 1)
x2, y2 = (event.x + 1), (event.y + 1)
self.canvas.create_oval(x1, y1, x2, y2, fill=python_green, outline=python_green, width=10)
if __name__ == "__main__":
Main().main()
修复:
添加了这两种方法:
def on_button_press(self, event):
self.x = event.x
self.y = event.y
def on_button_release(self, event):
python_green = "#476042"
x0,y0 = (self.x, self.y)
x1,y1 = (event.x, event.y)
已将 canvas 更改为:
self.canvas.bind("<ButtonPress-1>", self.on_button_press)
self.canvas.bind("<ButtonRelease-1>", self.on_button_release)
只点击不移动鼠标时,B1-Motion
不触发
要绑定到鼠标按下(以及鼠标移动),您可以在 mainloop
之前添加 self.canvas.bind("<ButtonPress-1>", self.paint)
。
我有以下一段代码,它在 canvas 中拍摄图像,然后每当我单击绘画功能时都会在其上绘制一个点。
一切正常除了绘画功能没有按预期工作。
期望输出
点击事件绘制一个点。无需拖动点击事件
实际产量
我必须拖动鼠标单击事件才能在 canvas 上看到绘图。
我猜绘画功能可能有点问题。但是,我一直没能知道它到底是什么。
from tkinter import *
from PIL import Image, ImageTk
class Main(object):
def __init__(self):
self.canvas = None
def main(self):
master = Tk()
# Right side of the screen / image holder
right_frame = Frame(master, width=500, height=500, cursor="dot")
right_frame.pack(side=LEFT)
# Retrieve image
image = Image.open("./image/demo.JPG")
image = image.resize((800, 700), Image.ANTIALIAS)
photo = ImageTk.PhotoImage(image)
# Create canvas
self.canvas = Canvas(right_frame, width=800, height=700)
self.canvas.create_image(0, 0, image=photo, anchor="nw")
self.canvas.pack()
self.canvas.bind("<B1-Motion>", self.paint)
mainloop()
def paint(self, event):
python_green = "#476042"
x1, y1 = (event.x - 1), (event.y - 1)
x2, y2 = (event.x + 1), (event.y + 1)
self.canvas.create_oval(x1, y1, x2, y2, fill=python_green, outline=python_green, width=10)
if __name__ == "__main__":
Main().main()
修复:
添加了这两种方法:
def on_button_press(self, event):
self.x = event.x
self.y = event.y
def on_button_release(self, event):
python_green = "#476042"
x0,y0 = (self.x, self.y)
x1,y1 = (event.x, event.y)
已将 canvas 更改为:
self.canvas.bind("<ButtonPress-1>", self.on_button_press)
self.canvas.bind("<ButtonRelease-1>", self.on_button_release)
只点击不移动鼠标时,B1-Motion
不触发
要绑定到鼠标按下(以及鼠标移动),您可以在 mainloop
之前添加 self.canvas.bind("<ButtonPress-1>", self.paint)
。