Python tkinter не может нарисовать линию

#python #tkinter

#python #tkinter

Вопрос:

Я пытаюсь создать paint с помощью python tkinter, но я не могу нарисовать линию на холсте! Я на ubuntu 20.04, и вот мой код :

 from tkinter import *


def draw(event):
    startX, startY = event.x, event.y
    my_canvas.create_line(startX, startY, event.x, event.y, fill="black")
    print(startX, startY, event.x, event.y)


root = Tk()
root.title("Colors")

my_canvas = Canvas(root, height=500, width=500, bg="wheat")
my_canvas.pack()
root.bind("<B1-Motion>", draw)
root.mainloop() 
 

Ответ №1:

Вам нужно:

  • сохраните startX и startY при первом щелчке мыши
  • нарисуйте линию от (startX, startY) до (event.x, event.y) при перемещении мыши
  • обновление startX и startY после рисования строки
 from tkinter import *

def start_draw(event):
    global startX, startY
    startX, startY = event.x, event.y  # save start position

def draw(event):
    global startX, startY
    my_canvas.create_line(startX, startY, event.x, event.y, fill="black")
    print(startX, startY, event.x, event.y)
    startX, startY = event.x, event.y  # update start position

root = Tk()
root.title("Colors")

my_canvas = Canvas(root, height=500, width=500, bg="wheat")
my_canvas.pack()

root.bind("<Button-1>", start_draw)
root.bind("<B1-Motion>", draw)

root.mainloop()
 

Ответ №2:

Вы установили x0==x1 и y0==y1 в my_canvas.create_line(startX, startY, event.x, event.y, fill="black") котором означает, что и начальная точка, и конечная точка одинаковы. Если вы хотите создать прямые линии, предложите вам создать линию при нажатии кнопки и сохранить начальные точки, а затем использовать линию canvas.coords для обновления конечных точек.

Вот пример:

 from tkinter import *

def getStartPoint(event):
    global startX, startY, line
    startX, startY = event.x, event.y

    line = my_canvas.create_line(startX, startY, event.x, event.y, fill="black")

def draw(event):
    my_canvas.coords(line, startX, startY, event.x, event.y)
    print(startX, startY, event.x, event.y)


root = Tk()
root.title("Colors")

startX = None
StartY = None

line = None

my_canvas = Canvas(root, height=500, width=500, bg="wheat")
my_canvas.pack()
root.bind('<1>', getStartPoint)
root.bind("<B1-Motion>", draw)

root.mainloop() 


 

Ответ №3:

 from tkinter import *


def draw(event):
    startX, startY = event.x, event.y
    x1, y1 = (event.x - 1 ), (event.y -1 )
    x2, y2 = (event.x   1), (event.y   1)
    my_canvas.create_line(x1, y1, x2, y2, width = 1, fill = "black")
    print(startX, startY, event.x, event.y)

root = Tk()
root.title("Colors")

my_canvas = Canvas(root, height=500, width=500, bg="white")
my_canvas.pack(expand = YES, fill = BOTH)
root.bind("<B1-Motion>", draw)
root.mainloop()
 

Комментарии:

1. На этом сайте не рекомендуется использовать ответы только для кода. Этот ответ будет намного лучше, если вы добавите объяснение того, что вы изменили или добавили.