【问题标题】:How to draw a square on canvas when he user clicks 2 locations with tkinter当用户使用 tkinter 单击 2 个位置时如何在画布上绘制正方形
【发布时间】:2020-11-25 16:07:38
【问题描述】:

我正在编写一个应用程序,用户可以在其中“绘制”画布,现在我想添加对形状的支持。
我有一个名为paint_canvas 的画布,我想在用户点击的两个点之间绘制一个形状

def draw_square(event):
    x1 = event.x
    y1 = event.y
    # now I want to get the next two points the user clicks
    # how???????
paint_canvas = Canvas(root)
paint_canvas.bind('<Button-3>', draw_square)

【问题讨论】:

  • 您想在用户按下鼠标按钮、拖动然后释放时进行绘制吗?或者,您是否希望用户单击、移动鼠标​​,然后再次单击?

标签: python tkinter tkinter-canvas


【解决方案1】:

你可以做两个事件, 一份用于新闻发布会,一份用于发布。 在第一个事件中,您将 x 和 y 鼠标位置存储在另一个范围(startx,starty)中

在第二个事件中,您将鼠标位置存储 x 和 y 鼠标位置在另一个范围(endx,endy)中,然后使用此坐标绘制您的形状

见:https://docstore.mik.ua/orelly/other/python/0596001886_pythonian-chp-16-sect-9.html

还有:https://www.codegrepper.com/code-examples/delphi/how+to+draw+rectangle+in+tkinter

如果你想显示你的矩形动画,你可以使用 Motion 事件 Mouse Position Python Tkinter

【讨论】:

  • 我正在查看您建议的第一个链接。我应该使用按钮释放事件吗?
  • 在你的情况下是 ButtonRelease-3
【解决方案2】:

您不必使用双重事件。您也可以在单击两次后立即存储先前单击的坐标并绘制一个矩形(并重置先前存储的坐标):

from tkinter import *


def draw_square(event):
    x1 = event.x
    y1 = event.y
    w = event.widget ## Get the canvas object you clicked on
    if w.coords == None:
        w.coords = (x1,y1)
    else:
        w.create_rectangle(w.coords[0],w.coords[1],x1,y1,fill="#ff0000")
        w.coords = None

root = Tk()
paint_canvas = Canvas(root,width=400,height=400,bg="#ffffff")
paint_canvas.pack()
paint_canvas.bind('<Button-3>', draw_square)
paint_canvas.coords=None

root.mainloop()

您甚至可以创建一个临时点来标记第一次点击,然后在您点击第二次点击后立即将其删除。这个点(下例中的w.temp)也可以是画布的一个属性,所以你可以通过点击轻松访问:

def draw_square(event):
    x1 = event.x
    y1 = event.y
    w = event.widget ## Get the canvas object you clicked on
    if w.coords == None:
        w.coords = (x1,y1)
        w.temp = w.create_oval(x1-1,y1-1,x1+1,y1+1,fill="#00ff00")
    else:
        w.create_rectangle(w.coords[0],w.coords[1],x1,y1,fill="#ff0000")
        w.delete(w.temp)
        w.coords = None

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-09-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-05
    • 1970-01-01
    相关资源
    最近更新 更多