Я предоставляю пример кода ниже, который я только что написал о том, как создавать прямоугольники в холсте 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
self.move = False
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("<Motion>", self.movingRect)
def startRect(self, event):
self.move = True
#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.rect = self.canvas.create_rectangle(
self.rectx0, self.recty0, self.rectx0, self.recty0, fill="#4eccde")
#Get rectangle's canvas object ID
self.rectid = self.canvas.find_closest(self.rectx0, self.recty0, halo=2)
print('Rectangle {0} started at {1} {2} {3} {4} '.
format(self.rect, self.rectx0, self.recty0, self.rectx0,
self.recty0))
def movingRect(self, event):
if self.move:
#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):
self.move = False
#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 (final)
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()
Обзор шагов и методов, используемый:
- Создание холста виджета в
Tk()
окна с помощью tk.Canvas()
методы
- события Bind мыши
<Button-1>
, <ButtonRelease-1>
и <Motion>
с их обратными вызовами в tk.Canvas
виджет.
- Для каждого из этих событий:
3.1 Обновите или проверьте переменную состояния мыши, то есть self.move.
3.2 Преобразование экрана указатель мыши х, у координаты на холст координат с использованием методов .canvasx(event.x)
и .canvasy(event.y)
и хранить эти преобразованные corrdinates в переменных self.rectx0
, self.recty0
, self.rectx1
, self.recty1
. event.x
и event.y
предоставляет координаты экрана указателя мыши.
3.3 Использование метода холста .create_rectangle(x0, y0, x1, y1, option, ...)
для создания прямоугольника или использования метода холста .coords(tagOrId, x0, y0, x1, y1)
для изменения координат прямоугольника. Здесь x0
, y0
, x1
, y1
обозначает верхний левый угол и нижний правый угол объекта прямоугольника x & y координаты холста и tagOrId
обозначают идентификатор объекта прямоугольника.
3.4 Только для <Button-1>
необходимо сохранить созданный идентификатор объекта прямоугольника в переменной. Эта переменная предоставляет значение tagOrId всякий раз, когда вызывается .coords() method
во время <Motion>
и <ButtonRelease-1>
.
Трудно понять, что вы просите. Вы понимаете, что для рисования прямоугольника все, что вам нужно сделать, это добавить немного дополнительного или к координате x или y одного угла квадрата? –
Я попытался вставить изображение, но это тоже не позволит. Я хочу иметь возможность рисовать их в разных формах и размерах. независимо от того, что я делаю, они рисуют как квадраты. Код, который я использую, был не только создан мной, я просто модифицировал его, чтобы использовать прямоугольники, а не круги. – Kkheartsmak
Ваш вопрос о прямоугольниках или об изображениях? Вы пытались изменить координаты для одного угла квадрата? –