2017-02-22 61 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。