Рисование прямоугольника с помощью Tkinter?

У меня есть этот код до сих пор. Сначала я заставил его рисовать круги, и это работало хорошо. Я думал, что рисовать прямоугольники будет так же просто, но мне удавалось рисовать только квадраты. Я надеялся получить формы разной ширины и длины. Знаю ли я, что мне нужно изменить поле (x1, y1, x2, y2), но как мне это сделать.

def down(event): # A mouse event will be passed in with x and y attributes
global startx, starty # Use global variables for assignment
startx = event.x # Store the mouse down coordinates in the global variables
starty = event.y

def up(event):
    tk_color_string = color(red_intvar, green_intvar, blue_intvar)
    r = (startx-event.x)**2 + (starty-event.y)**2  # Pythagorean theorem
    r = int(r**.5)                                 # square root to get distance
    new_shape = canvas.create_rectangle(startx-r, starty-r, startx+r, starty+r,
                                     fill=tk_color_string, outline='#000000')
    shapes.append(new_shape) # aggregate the canvas' item

Весь код состоит из более чем 100 строк, поэтому я надеюсь, что эта часть поможет продемонстрировать то, что я прошу.enter описание изображения здесь


person Kkheartsmak    schedule 22.02.2017    source источник
comment
Трудно понять, что вы спрашиваете. Вы понимаете, что для того, чтобы нарисовать прямоугольник, все, что вам нужно сделать, это добавить немного больше к координате x или y одного из углов квадрата?   -  person Bryan Oakley    schedule 22.02.2017
comment
Я пытался вставить изображение, но оно мне тоже не позволяет. Я хочу иметь возможность рисовать их в разных формах и размерах. что бы я ни делал, они рисуют квадратами. Код, который я использую, был не просто создан мной, я просто модифицировал его, чтобы использовать прямоугольники, а не круги.   -  person Kkheartsmak    schedule 22.02.2017
comment
Ваш вопрос о прямоугольниках или об изображениях? Вы пробовали изменить координаты одного угла квадрата?   -  person Bryan Oakley    schedule 22.02.2017


Ответы (1)


Ниже я привожу пример кода, который только что написал, о том, как создавать прямоугольники в холсте tkinter с помощью мыши. Я надеюсь, что это поможет вам понять соответствующие процедуры и методы, которые вам нужны. После этого адаптируйте его для вашей конкретной проблемы. Надеюсь, это поможет вам и с наилучшими пожеланиями.

Пример кода: как создать холст tkinter, который позволяет пользователю рисовать прямоугольные объекты с помощью мыши.

import tkinter as tk

class App(tk.Frame):
    def __init__( self, parent):
        tk.Frame.__init__(self, parent)
        self._createVariables(parent)
        self._createCanvas()
        self._createCanvasBinding()

    def _createVariables(self, parent):
        self.parent = parent
        self.rectx0 = 0
        self.recty0 = 0
        self.rectx1 = 0
        self.recty1 = 0
        self.rectid = None

    def _createCanvas(self):
        self.canvas = tk.Canvas(self.parent, width = 800, height = 400,
                                bg = "white" )
        self.canvas.grid(row=0, column=0, sticky='nsew')

    def _createCanvasBinding(self):
        self.canvas.bind( "<Button-1>", self.startRect )
        self.canvas.bind( "<ButtonRelease-1>", self.stopRect )
        self.canvas.bind( "<B1-Motion>", self.movingRect )

    def startRect(self, event):
        #Translate mouse screen x0,y0 coordinates to canvas coordinates
        self.rectx0 = self.canvas.canvasx(event.x)
        self.recty0 = self.canvas.canvasy(event.y) 
        #Create rectangle
        self.rectid = self.canvas.create_rectangle(
            self.rectx0, self.recty0, self.rectx0, self.recty0, fill="#4eccde")
        print('Rectangle {0} started at {1} {2} {3} {4} '.
              format(self.rectid, self.rectx0, self.recty0, self.rectx0,
                     self.recty0))

    def movingRect(self, event):
        #Translate mouse screen x1,y1 coordinates to canvas coordinates
        self.rectx1 = self.canvas.canvasx(event.x)
        self.recty1 = self.canvas.canvasy(event.y)
        #Modify rectangle x1, y1 coordinates
        self.canvas.coords(self.rectid, self.rectx0, self.recty0,
                      self.rectx1, self.recty1)
        print('Rectangle x1, y1 = ', self.rectx1, self.recty1)

    def stopRect(self, event):
        #Translate mouse screen x1,y1 coordinates to canvas coordinates
        self.rectx1 = self.canvas.canvasx(event.x)
        self.recty1 = self.canvas.canvasy(event.y)
        #Modify rectangle x1, y1 coordinates
        self.canvas.coords(self.rectid, self.rectx0, self.recty0,
                      self.rectx1, self.recty1)
        print('Rectangle ended')


if __name__ == "__main__":
    root = tk.Tk()
    root.geometry( "600x400" )
    app = App(root)
    root.mainloop()

Обзор используемых шагов и методов:

  1. Создайте виджет холста в Tk() окне, используя метод tk.Canvas()
  2. Привяжите события мыши <Button-1>, <ButtonRelease-1> и <B1-Motion> с их обратными вызовами к виджету tk.Canvas.
  3. Для каждого из этих событий:
    3.1 Преобразуйте координаты x, y указателя мыши на экране в координаты холста, используя методы .canvasx(event.x) и .canvasy(event.y), и сохраните эти преобразованные координаты в переменных self.rectx0, self.recty0, self.rectx1, self.recty1. event.x и event.y обеспечивают координаты экрана указателя мыши.
    3.2 Используйте метод холста .create_rectangle(x0, y0, x1, y1, option, ...) для создания прямоугольника или используйте метод холста .coords(tagOrId, x0, y0, x1, y1) для изменения координат прямоугольника. Здесь x0, y0, x1, y1 обозначают верхний левый и нижний правый углы прямоугольника с координатами холста x и y, а tagOrId обозначает идентификатор прямоугольного объекта.
    3.3 Только для <Button-1> необходимо сохранить идентификатор созданного прямоугольного объекта в переменной. Эта переменная предоставляет значение для tagOrId всякий раз, когда .coords() method вызывается во время <B1-Motion> и <ButtonRelease-1>.
person Sun Bear    schedule 22.02.2017
comment
Есть ли способ заставить пользователя создавать квадраты вместо прямоугольников, например, позволяя пользователю перемещать курсор только в направлении диагонали? - person sadesoda; 23.04.2021
comment
@sadesoda Конечно. Вам нужно изменить метод movingRect(), чтобы наложить квадратный алгоритм. Величина изменения x должна быть такой же, как и изменение y. Наконец, self.rectx1 и self.rectx1 должны дать вам квадрат. Если вам действительно нужна помощь, опубликуйте свой вопрос как новый вопрос, так как этот раздел предназначен для комментирования ответа. - person Sun Bear; 28.04.2021