python-3.x - 如何在点击事件 Tkinter Python 上在 Canvas 上绘制一个点

标签 python-3.x canvas tkinter tkinter-canvas

我有以下代码片段,它在 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没有触发。

要绑定(bind)到鼠标按下(以及鼠标移动),您可以添加 self.canvas.bind("<ButtonPress-1>", self.paint)之前mainloop .

关于python-3.x - 如何在点击事件 Tkinter Python 上在 Canvas 上绘制一个点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46975969/

相关文章:

python - Tkinter Canvas 和滚动条

python-3.x - Python 属性错误 : 'module' object has no attribute 'atoi'

python - 逗号分隔的变量赋值

javascript - Canvas 中的弹跳球

html - SVG 和 HTML5 Canvas 有什么区别?

Python Tkinter 网格几何粘性设置无效(?)

python - 使用多个分隔符拆分字符串,并保留*一些*分隔符,但不是全部

python-3.x - 将 Deform.FileData 架构节点保存为文件

python - tkinter 中的命令和绑定(bind)有什么区别?

python - 打开并显示从本地文件夹中选择的图像