2017-02-22 5 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.Canvas() 방법을
  2. 바인드 마우스 이벤트 tk.Canvas 위젯에 자신의 콜백과 <Button-1>, <ButtonRelease-1><Motion>을 사용 Tk() 창에 캔버스 위젯을 만듭니다.
  3. 다음 이벤트 각각에 대해
    3.1 마우스 상태 변수 (예 : self.move)를 업데이트하거나 확인하십시오.
    3.2 변환 마우스 포인터의 화면을 X, Y 좌표 캔버스 .canvasx(event.x) 방법 및 .canvasy(event.y) 변수 self.rectx0, self.recty0, self.rectx1, self.recty1 이러한 변환을 corrdinates 저장소를 사용하여 조정한다. event.xevent.y은 마우스 포인터 화면 좌표를 제공합니다.
    3.3 캔버스 방법 .create_rectangle(x0, y0, x1, y1, option, ...)을 사용하여 사각형을 만들거나 캔버스 방법 .coords(tagOrId, x0, y0, x1, y1)을 사용하여 사각형 좌표를 수정하십시오. 여기서, x0, y0, x1, y1은 직사각형 오브젝트의 좌상 구석 및 오른쪽 아래 구석 x & 캔버스 좌표를 나타내며, tagOrId은 직사각형 오브젝트 ID로 표시됩니다.
    3.4 <Button-1>에 대해서만 생성 된 사각형 객체의 ID를 변수에 저장해야합니다. 이 변수는 <Motion><ButtonRelease-1> 중에 .coords() method이 호출 될 때마다 tagOrId에 값을 제공합니다.