2017-02-22 62 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. 綁定鼠標事件<Button-1><ButtonRelease-1><Motion>與他們的回調tk.Canvas部件Tk()窗口創建畫布組件。
  3. 對於以下每個事件:
    3.1更新或檢查鼠標狀態變量,即self.move。
    3.2轉換鼠標指針屏幕x,y座標至帆布使用方法.canvasx(event.x).canvasy(event.y)和存儲在變量self.rectx0self.recty0self.rectx1self.recty1這些轉換corrdinates座標。 event.xevent.y提供鼠標指針屏幕座標。
    3.3使用畫布方法.create_rectangle(x0, y0, x1, y1, option, ...)創建矩形或使用畫布方法.coords(tagOrId, x0, y0, x1, y1)修改矩形座標。這裏,x0,y0,x1,y1表示矩形對象的左上角和右下角xy畫布座標,並且tagOrId表示矩形對象ID。
    3.4僅適用於<Button-1>,需要將創建的矩形對象的ID存儲在變量中。在<Motion><ButtonRelease-1>期間調用.coords() method時,此變量將值提供給tagOrId。