2017-02-22 65 views
1

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

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 image description here

+0

Трудно понять, что вы просите. Вы понимаете, что для рисования прямоугольника все, что вам нужно сделать, это добавить немного дополнительного или к координате x или y одного угла квадрата? –

+0

Я попытался вставить изображение, но это тоже не позволит. Я хочу иметь возможность рисовать их в разных формах и размерах. независимо от того, что я делаю, они рисуют как квадраты. Код, который я использую, был не только создан мной, я просто модифицировал его, чтобы использовать прямоугольники, а не круги. – Kkheartsmak

+0

Ваш вопрос о прямоугольниках или об изображениях? Вы пытались изменить координаты для одного угла квадрата? –

ответ

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 
     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() 

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

  1. Создание холста виджета в Tk() окна с помощью tk.Canvas() методы
  2. события Bind мыши <Button-1>, <ButtonRelease-1> и <Motion> с их обратными вызовами в tk.Canvas виджет.
  3. Для каждого из этих событий:
    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>.